7.网络设备支持

 

驱动程序的支持

函数名

功能

函数形成

参数

描述

init_etherdev

注册以太网设备

truct net_device * init_etherdev (struct net_device * dev, int sizeof_priv)

dev为要填充的以太网设备结构,或者要分配一个新的结构时为NULLsizeof_priv是为这个以太网设备要分配的额外私有结构的大小。

用以太网的通用值填充这个结构的域。如果传递过来的devNULL,则构造一个新的结构,包括大小为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 chainNETDEV_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启动芯片处理。

必须持以锁才能调用该函数