7.网络设备支持
驱动程序的支持 |
函数名 |
功能 |
函数形成 |
参数 |
描述 |
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 |
增加数据包处理程序 |
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 * __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为要查找的名字 |
根据名字找到一个接口。这个函数可以在任何上下文中调用并持有自己的锁。返回句柄的引用计数增加,调用者必须在其不使用时调用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,找到则返回指向设备的指针。该设备的引用计数没有增加,因此调用者必须小心地关注加锁,调用者必须持有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 * 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,函数给该名字分配一个网络设备和空间。如果没有可用内存,则返回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 为接口的名字 |
如果网络接口不存在,并且进程具有合适的权限,则这个函数装入该模块。如果在内核中模块的装入是不可用的,则装入操作就变为空操作。 |
|
dev_open |
为使用而准备一个接口 |
int dev_open (struct net_device * dev) |
device为要打开的设备 |
以从低层到上层的过程获得一个设备。设备的私有打开函数被调用,然后多点传送链表被装入,最后设备被移到上层,并把NETDEV_UP信号发送给网络设备的notifier chain。 在一个活动的接口调用该函数只能是个空操作。失败则返回一个负的错误代码。 |
|
dev_close |
关闭一个接口 |
int dev_close (struct net_device * dev) |
dev为要关闭的设备 |
这个函数把活动的设备移到关闭状态。向网络设备的notifier chain发送一个NETDEV_GOING_DOWN。然后把设备变为不活动状态,并最终向notifier chain发NETDEV_DOWN信号。 |
|
register_netdevice_notifier |
注册一个网络通告程序块 |
int register_netdevice_notifier (struct notifier_block * nb) |
nb为通告程序 |
当网络设备的事件发生时,注册一个要调用的通告程序。作为参数传递来的通告程序被连接到内核结构,在其被注销前不能重新使用它。失败则返回一个负的错误码。 |
|
unregister_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为要传送的缓冲区 |
为了把缓冲区传送到一个网络设备,对缓冲区进行排队。调用者必须在调用这个函数前设置设备和优先级,并建立缓冲区。该函数也可以从中断中调用。失败返回一个负的错误码。成功并不保证帧被传送,因为也可能由于拥塞或流量调整而撤销这个帧。 |
|
netif_rx |
把缓冲区传递到网络协议层 |
void netif_rx (struct sk_buff * skb) |
skb为要传送的缓冲区 |
这个函数从设备驱动程序接受一个数据包,并为上层协议的处理对其进行排队。该函数总能执行成功。在处理期间,可能因为拥塞控制而取消这个缓冲区。 |
|
net_call_rx_atomic |
|
void net_call_rx_atomic(void(fn) (void)) |
fn为要调用的函数 |
使一个函数的调用就协议层而言是原子的。 |
|
register_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为主设备。 |
改变从设备的主设备。传递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 |
网络设备的ioctl |
int 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_finish_unregister (struct net_device * dev) |
dev为设备。 |
撤销或释放一个僵死的设备。成功返回0。 |
|
|
|
|
|
|
|
unregister_netdevice |
从内核删除设备 |
int unregister_netdevice (struct net_device * dev) |
dev为设备。 |
这个函数关闭设备接口并将其从内核表删除。成功返回0,失败则返回一个负数。 |
|
8390网卡 |
ei_open |
打开/初始化网板 |
int ei_open (struct net_device * dev) |
dev为要初始化的网络设备。 |
尽管很多注册的设备在每次启动时仅仅需要设置一次,但这个函数在每次打开设备时还彻底重新设置每件事。 |
ei_close |
关闭网络设备 |
int ei_close (struct net_device * dev) |
dev为要关闭的网络设备。 |
ei_open的相反操作,在仅仅在完成“ifconfig<devname>down”时使用 |
|
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的模块驱动程序使用。 |
|
NS8390_init |
初始化8390硬件 |
void NS8390_init (struct net_device * dev, int startp) |
dev为要初始化的设备,startp为布尔值,非0启动芯片处理。 |
必须持以锁才能调用该函数 |