skb的分配都只是移动指针
分配函数
skb_put
skb_push
skb_pull
skb_reserve
设置网卡为混杂模式
==========================================
dev_set_promiscuity
多播只适用于L2和L3
netif_rx //数据包基层调用接收函数
dev_queue_xmit //数据包发送
通知链
==========================================
notifier_chain_register //注册一个通知链
notifier_chain_unregister //注销一个通知链
因为注册参数需要一个总链表,所以一般更为常用的是
被封装的:
register_inetaddr_notifier
register_inet6addr_notifier
register_netdevice_notifier
unregister_inetaddr_notifier
unregister_inet6addr_notifier
unregister_netdevice_notifier
//被注册的handle函数都由notifier_call_chain调用
//所以一般情况下无需重载它
bridge
=========================================
br_add_bridge //添加并注册初始化一个网桥,调用了new_bridge_dev
//new_bridge_dev调用br_dev_setup
br_del_bridge
br_add_if //添加端口
br_del_if
br_dev_setup //桥的初始化
br_change_mtu //改变MTU大小
br_stp_recalculate_bridge_id //可设置MAC地址
dev_open //通过指针调用br_dev_open
dev_close
br_stp_enable_port //允许端口
br_stp_disable_port //禁止
br_make_forwarding //更改端口状态
br_make_blocking
br_fdb_changeaddr //改变MAC地址
br_fdb_update //更新数据库
br_fdb_cleanup //删除数据库
br_fdb_delete_by_port //同上,它们都调用fdb_delete,只是简单减少引用计数
在br_stp_enable_bridge中更改br_stp_timer_init可以设置MAC地址超时值
Neighbor
===========================================
数据包经过dev_queue_xmit函数后才竟如QoS模块,
Note that dev_queue_xmit is called when the packet to transmit is ready to go
neigh_event_ns //创建或者更新一个neighbour entry,一般用在源地址上
pneigh_lookup //从数据库中寻找出口IP,带参数指定是否创建
__neigh_lookup_errno //同pneigh_lookup,一定会创建
struct neighbor中的refcnt为引用计数,
通过neigh_hold和neigh_release来增加和减少计数
neigh_create //创建一个neighbour,参数中的tbl使用arp_tbl(ipv4)。
//pkey为IP地址,作为搜索关键字
neigh_release //减少计数并测试是否为0,为0就删除此条neighbour
neighbour也维护了net_device的引用计数,所以net_device的撤销需要等待neighbour的撤销
hh_cache是和neighbour成对的,如果neighbour撤销了hh_cache也应该撤销,
所以在neigh_destroy中也有对hh_cache的检测
neighbour subsystem中函数成对出现,有带p开头的,有不带p开头的
(如:neigh_lookup 和 pneigh_lookup),它们的区别就是p代表proxy,在proxy时使用
ARP请求包会获得一个随机数,并被加入队列,建立timer,延迟发送,
这样做的原因是为了避免同一子网大量主机同时开机(或重启等)所造成的网络堵塞
hh_cache就是L2协议头(一般Ethernet)的一个缓存
dest_entry中的neighbour成员指向下一跳的NIC地址,具体见图

linux的IP是基于主机的,而不是基于NIC的,它会出现ARP flux problem,具体见下图

linux没有限制默认网管的数量
arp_init //ARP协议初始化
skb_share_check //可以克隆skb