linux内核源码分析--混杂模式“没每日读书”

某些网络管理任务要求一个系统接收一条共享缆线传输所有帧而不是仅限于地址直接指定系统一个设备如果可以接收所有封包意味着处于混杂模式例如应用程序检查局域网段性能或者安全缺陷就需要使用这种模式桥接代码也会用到混杂模式最后不幸的是恶意窥探而言这种模式显然价值所在由于这个原因除非数据被加密否则局域网络其他用户数据都不安全

net_device 结构包含一个名为promiscuity计数器表示一个设备处于混杂模式采用计数器简单标识原因在于多个客户程序可能都会要求混杂模式因此进入混杂模式递增计数器退出模式递减计数器除非计算器为零否则设备不会退出混杂模式通常来讲字段操作通过调用dev_set_promiscuity函数实现

promiscuity 非零flags IFF_PROMISC标识也会设置并且配置接口函数进行检查

下列取自drivers/net/3c59x.c 驱动程序代码片段说明如何根据flags字段标识设置不同接受模式

static void set_rx_mode(struct net_device *dev)

{

int ioaddr = dev->base_addr;

int new_mode;

if (dev->flags & IFF_PROMISC) {

    if (corqscreq_debug > 3) 

new_mode = SetRxFilter | RxStation | RxMulticast | RxBroadcast;  

    } else if (dev->mc_list ||dev->flags & IFF_ALLMULTI)

new_mode = SetRxFilter | RxStation | RxMulticast | RxBroadcast

else

new_mode = SetRxFilter | RxStation | RxBroadcast

outw(new_mode, ioaddr + EL3_CMD);

}

IFF_PROMISC标识置位就会new_mode变量初始化从而接受地址指定网卡数据流多播数据流广播数据流以及其他数据流El3_CMD ioaddr 内存地址偏移量代表设备交互命令应该拷贝何处

数据统计

net_device 结构没有提供一个记录统计数据收集字段而是引入一个驱动程序设置priv指针指向一个存储有关接口信息私有数据结构私有数据统计数据组成收发封包数目

priv指向数据结构格式取决于设备类型以及特定模型因此不同Ethernet使用不同私有结构然而几乎所有结构包括一个类型net_device_stats字段字段包含所有网络设备共有统计数据而且可以通过get_stats 方法获取稍后说明

无线设备行为迥异友先设备致使net_device_stats 数据结构不适用无线设备因此无线设备该用一个类型iw_statistics字段可以通过调用get_wireless_stats 方法获取稍后说明

priv 指向数据结构有时名称反映接口其他时候只是简单成为net_local,不过net_local 字段依然每个设备驱动程序各自定义

私有数据结构复杂度多少依赖于适配卡功能以及设备驱动程序编写打算采用精密统计数据复杂设计提高性能。例如比较3c507 Ethernet所采用通用net_local结构以及3C59X ETHERNET 所采用非常详尽vortex_private结构然而这两种结构包含一个类型net_device_stats字段

第八章将会看到私有数据结构有时添加到net_device结构资深有时也会分配一个独立区块

设备状态

为了控制NIC之间交互每个设备驱动程序必须维护一些信息表示接口需要哪种行为时间戳标识SMP系统内核也必须确保不同CPU同一个设备并发访问正确处理net_device 结构以下几个字段就是专门用于这些类型信息

unsigned long state

网络队列子系统所使用一组标识索引enum netdev_state_t 常数每位所定义常数类似__LINK_STATE_XOFF 个别位的设置清除使用通用函数set_bitclear_bit 这两个函数调用通常通过一个包裹函数用到细节隐藏起来例如停止一个设备队列子系统调用netif_stop_queue, 下列所示

static inlinvoid netif_stop_queue(struct net_device *dev)

{

set_bit(__LINK_STATE_XOFF, &dev->state);

}

十一章简要介绍流量控制子系统

enum {...} reg_state

设备注册状态参见第八章

unsigned long trans_start

最近一个传输启动时间设备驱动程序会在传输设置如果在一段给定时间传输没有完成这个字段用于检测配置问题传输时间过长意味着有地方出错在这种情况驱动程序通常复位配置卡

unsigned long last_rx

最后一个封包到达时间此刻不同任何特殊目的但是需要时候可以利用

struct net_device *master

有些协议允许一组设备集群起来作为单一设备这些协议包括EQL Bonding 以及流量控制TEQL队列规则群租中一个设备选定所谓主设备扮演特殊角色这个字段是一个指针指向群组设备net_device数据结构如果接口并非这类群组成员之一指针只是NULL.

spinlock_t xmit_lock

int xmit_lock_owner

xmit_lock 使驱动程序函数hard_start_xmit访问串行化这意味着每个CPU一次只能任何给定一个设备做一次传输xmit_lock_owner 持有CPUID处理器系统而言总是0SMP系统中没被取走-1设备驱动程序支持也有可能无锁传输参见第十一章有关有锁情况

void *atalk_ptr

void *ip_ptr;

void *dn_ptr;

void *ip6_ptr

void *ec_ptr;

void *ax25_ptr

6字段都是指针指向特定协议专用数据结构每个数据结构包含一些协议私有参数例如ip_ptr 指向一个类型in_device 数据结构其中包含各种不同IPv4 相关参数其中接口配置IP地址列表本书其他章节描述本书涉及协议所使用数据结构字段多数时候只有其中一个字段在使用

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值