linux读书笔记(一)

来源:互联网 发布:阿里云是oa系统多少钱 编辑:程序博客网 时间:2024/06/05 14:08

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读书笔记 - wenkai169 - 我的博客
linux的IP是基于主机的,而不是基于NIC的,它会出现ARP flux problem,具体见下图

linux读书笔记 - wenkai169 - 我的博客
linux没有限制默认网管的数量

arp_init  //ARP协议初始化
skb_share_check  //可以克隆skb

原创粉丝点击