《网络设备支持接口》由会员分享,可在线阅读,更多相关《网络设备支持接口(7页珍藏版)》请在金锄头文库上搜索。
1、网络设备支持函数名 功能 函数形成 参数 描述init_etherdev 注册以太网设备truct net_device * init_etherdev (struct net_device * dev, int sizeof_priv)dev 为要填充的以太网设备结构,或者要分配一个新的结构时为NULL,sizeof_priv 是为这个以太网设备要分配的额外私有结构的大小。用以太网的通用值填充这个结构的域。如果传递过来的 dev为 NULL,则构造一个新的结构,包括大小为 sizeof_priv的私有数据区。强制将这个私有数据区在 32 字节(不是位)上对齐。dev_add_pack 增加数
2、据包处理程序void dev_add_pack (struct packet_type * pt)pt 为数据包类型把一个协议处理程序加到网络栈,把参数传递来的&packet_type 链接到内核链表中。驱动程序的支持dev_remove_pack 删除数据包处理程序void dev_remove_pack (struct packet_type * pt)pt 为数据包类型删除由dev_add_pack 曾加到内核的协议处理程序。把&packet_type 从内核链表中删除,一旦该函数返回,这个结构还能再用。_dev_get_by_name 根据名字找设备struct net_device
3、* _dev_get_by_name (const char * name);name 为要查找的名字根据名字找到一个接口。必须在 RTNL 信号量或dev_base_lock 锁的支持下调用。如果找到这个名字,则返回指向设备的指针,如果没有找到,则返回NULL。引用计数器并没有增加,因此调用者必须小心地持有锁。 dev_get_by_name 根据名字找设备struct net_device * dev_get_by_name (const char * name)name 为要查找的名字根据名字找到一个接口。这个函数可以在任何上下文中调用并持有自己的锁。返回句柄的引用计数增加,调用者必须在
4、其不使用时调用 dev_put 释放它,如果没有匹配的名字,则返回NULL。dev_get 测试设备是否存在int dev_get (const char * name)name 为要测试的名字测试名字是否存在。如果找到则返回真。为了确保在测试期间名字不被分配或删除,调用者必须持有 rtnl 信号量。这个函数主要用来与原来的驱动程序保持兼容。_dev_get_by_index 根据索引找设备struct net_device * _dev_get_by_index (int ifindex)ifindex为设备的索引根据索引搜索一个接口。如果没有找到设备,则返回NULL,找到则返回指向设备的指
5、针。该设备的引用计数没有增加,因此调用者必须小心地关注加锁,调用者必须持有 RTNL 信号量或dev_base_lock 锁。dev_get_by_index 根据名字找设备struct net_device * dev_get_by_index (int ifindex)ifindex为设备的索引根据索引搜索一个接口。如果没有找到设备,则返回NULL,找到则返回指向设备的指针。所返回设备的引用计数加 1,因此,在用户调用 dev_put 释放设备之前,返回指针是安全的。dev_alloc_name 为设备分配一个名字int dev_alloc_name (struct net_device
6、* dev, const char * name)dev 为设备,name 为格式化字符串。传递过来一个格式化字符串,例如ltd,该函数试图找到一个合适的 id。设备较多时这是很低效的。调用者必须在分配名字和增加设备时持有dev_base 或 rtnl 锁,以避免重复。返回所分配的单元号或出错返回一个复数。dev_alloc 分配一个网络设备和名字struct net_device * dev_alloc (const char * name, int * err)name 为格式化字符串,err 为指向错误的指针传递过来一个格式化字符串,例如ltd,函数给该名字分配一个网络设备和空间。如果没
7、有可用内存,则返回NULL。如果分配成功,则名字被分配,指向设备的指针被返回。如果名字分配失败,则返回NULL,错误的原因放在 err 指向的变量中返回。调用者必须在做这一切时持有 dev_base 或 RTNL 锁,以避免重复分配名字。netdev_state_change 设备改变状态void netdev_state_change (struct net_device * dev)name 为引起通告的设备当一个设备状态改变时调用该函数。dev_load 装入一个网络模块void dev_load (const char * name)name 为接口的名字如果网络接口不存在,并且进程具
8、有合适的权限,则这个函数装入该模块。如果在内核中模块的装入是不可用的,则装入操作就变为空操作。dev_open 为使用而准备一个接口int dev_open (struct net_device * dev)device为要打开的设备以从低层到上层的过程获得一个设备。设备的私有打开函数被调用,然后多点传送链表被装入,最后设备被移到上层,并把 NETDEV_UP信号发送给网络设备的 notifier chain。在一个活动的接口调用该函数只能是个空操作。失败则返回一个负的错误代码。dev_close 关闭一个接口int dev_close (struct net_device * dev)dev
9、 为要关闭的设备这个函数把活动的设备移到关闭状态。向网络设备的notifier chain 发送一个NETDEV_GOING_DOWN。然后把设备变为不活动状态,并最终向 notifier chain 发NETDEV_DOWN 信号。register_netdevice_notifier注册一个网络通告程序块int register_netdevice_notifier (struct notifier_block * nb)nb 为通告程序当网络设备的事件发生时,注册一个要调用的通告程序。作为参数传递来的通告程序被连接到内核结构,在其被注销前不能重新使用它。失败则返回一个负的错误码。unre
10、gister_netdevice_notifier注销一个网络通告块int unregister_netdevice_notifier (struct notifier_block * nb)nb 为通告程序取消由register_netdevice_notifer 曾注册的一个通告程序。把这个通告程序从内核结构中解除,然后还可以重新使用它。失败则返回一个负的错误码。dev_queue_xmit 传送一个缓冲区int dev_queue_xmit (struct sk_buff * skb)skb 为要传送的缓冲区为了把缓冲区传送到一个网络设备,对缓冲区进行排队。调用者必须在调用这个函数前设置
11、设备和优先级,并建立缓冲区。该函数也可以从中断中调用。失败返回一个负的错误码。成功并不保证帧被传送,因为也可能由于拥塞或流量调整而撤销这个帧。netif_rx 把缓冲区传递到网络协议层void netif_rx (struct sk_buff * skb)skb 为要传送的缓冲区这个函数从设备驱动程序接受一个数据包,并为上层协议的处理对其进行排队。该函数总能执行成功。在处理期间,可能因为拥塞控制而取消这个缓冲区。net_call_rx_atomic void net_call_rx_atomic(void(fn) (void)fn 为要调用的函数使一个函数的调用就协议层而言是原子的。regis
12、ter_gifconf 注册一个SIOCGIF处理程序int register_gifconf (unsigned int family, gifconf_func_t * gifconf)family为地址组,gifconf为处理程序注册由地址转储例程决定的协议。当另一个处理程序替代了由参数传递过来的处理程序时,才能释放或重用后者。netdev_set_master 建立主从对int netdev_set_master (struct net_device * slave, struct net_device *master)slave 为从设备,master为主设备。改变从设备的主设备。传
13、递 NULL 以中断连接。调用者必须持有 RTNL 信号量。失败返回一个负错误码。成功则调整引用计数,RTM_NEWLINK 发送给路由套接字,并且返回 0。dev_set_allmulti 更新设备上多个计数void dev_set_allmulti (struct net_device * dev, int inc)dev 为设备,inc为修改者。把接收的所有多点传送帧增加到设备或从设备删除。当设备上的引用计数依然大于 0 时,接口保持着对所有接口的监听。一旦引用计数变为 0,设备回转到正常的过滤操作。负的 inc 值用来在释放所有多点传送需要的某个资源时减少其引用计数。dev_ioctl
14、 网络设备的ioctlint dev_ioctl (unsigned int cmd, void * arg)cmd 为要发出的命令,arg 为用户空间指向ifreq 结构的指针。向设备发布 ioctl 函数。这通常由用户空间的系统调用接口调用,但有时也用作其他目的。返回值为一个正数,则表示从系统调用返回,为负数,则表示出错。dev_new_index 分配一个索引int dev_new_index ( void)无 为新的设备号返回一个合适而唯一的值。调用者必须持有 rtnl 信号量以确保它返回唯一的值。netdev_finish_unregister完成注册int netdev_finis
15、h_unregister (struct net_device * dev)dev 为设备。撤销或释放一个僵死的设备。成功返回 0。unregister_netdevice 从内核删除设备int unregister_netdevice (struct net_device * dev)dev 为设备。这个函数关闭设备接口并将其从内核表删除。成功返回0,失败则返回一个负数。ei_open 打开初始化网板int ei_open (struct net_device * dev)dev 为要初始化的网络设备。尽管很多注册的设备在每次启动时仅仅需要设置一次,但这个函数在每次打开设备时还彻底重新设置每
16、件事。ei_close 关闭网络设备int ei_close (struct net_device * dev)dev 为要关闭的网络设备。ei_open 的相反操作,在仅仅在完成“ifconfigdown”时使用ei_interrupt 处理来自8390的中断void ei_interrupt (int irq, void * dev_id, struct pt_regs * regs);irq 为中断号,dev_id为指向net_devicede 指针,regs没有使用。处理以太网接口中断。我们通过网卡指定的函数从 8390取回数据包,并在网络栈触发它们。如果需要,我们也处理传输的完成并激活传输路径。我们也根据需要更新计数器并处理其他的事务。ethdev_init 初始化8390设备结构的其余部分int ethdev_init (struct net_device * dev)dev 为要初始化的网络设备结构。初始化 8390 设备结构的其余部分。不要用_init() ,因为这也由基于 8390