2013年8月28日

IPV6 实现

摘要: 看代码实现前,请先保证了解ipv6的概念,可以先看ipv6介绍一文。code extract from 2.6.24.在文件 net/ipv6/af_inet6.c 中包含了ipv6协议初始化的主函数。static int __init inet6_init(void){ struct sk_buff *dummy_skb; struct list_head *r; int err; //inet6_skb_parm必须小于等于skb中的cb BUILD_BUG_ON(sizeof(struct inet6_skb_parm) > sizeof(dummy_skb... 阅读全文

posted @ 2013-08-28 10:45 SuperKing 阅读(4015) 评论(0) 推荐(0) 编辑

ICMP 实现

摘要: 以下代码取自 kernel-2.6.24 .[数据结构]struct icmp_control { void (*handler)(struct sk_buff *skb); //icmp处理函数,根据icmp的类型字段 short error; /* This ICMP is classed as an error message */};static const struct icmp_control icmp_pointers[NR_ICMP_TYPES+1]; //每个icmp类型有一个项[/数据结构][初始化]文件net/ipv4/af_inet.c... 阅读全文

posted @ 2013-08-28 10:30 SuperKing 阅读(2711) 评论(0) 推荐(0) 编辑

Bridge实现

摘要: 网桥原理:传统的中继器,如HUB,是一个单纯的物理层设备,它将每一个收到的数据包,在其所有的端口上广播,由接收主机来判断这个数据包是否是给自己的。这样,网络资源被极大的浪费掉了。网桥之所以不同于中继器,主要在于其除了有中继的作用外,还有一个更重要的作用,就是学习MAC地址,然后根据每个数据包的目的MAC与自身端口的对应,从关联端口发送数据,而不完全地在整个网段中进行广播。所以,网桥的实现中,有两个关键点:1、 学习MAC地址,起初,网桥是没有任何地址与端口的对应关系的,它发送数据,还是得想HUB一样,但是每发送一个数据,它都会关心数据包的来源MAC是从自己的哪个端口来的,由于学习,建立地址-端 阅读全文

posted @ 2013-08-28 10:14 SuperKing 阅读(3382) 评论(0) 推荐(0) 编辑

2013年8月27日

kernel 校验和实现

摘要: kernel 校验和实现Kernel checksum implementation1) TCP包的错误检测使用16位累加和校验. 除了TCP包本身,TCP校验数据块还包括源IP地址,目的IP地址, TCP包长度, TCP协议号组成的12字节伪头标.2) 校验和为16位字补码和, 数据块长度为奇数时, 数据块末尾添零处理.校验和的计算与顺序无关, 可以从数据块开始计算, 也可以从未尾开始向前计算.3) 为了提高计算效率, TCP包的校验和并不一次算出,而是采用32位部分累加和(sk->csum)进行增量计算.csum_partial()用来计算数据块的32位部分累加和, 累加和可以用cs 阅读全文

posted @ 2013-08-27 14:47 SuperKing 阅读(3335) 评论(0) 推荐(0) 编辑

ARP 实现

摘要: ARP 实现现在我们介绍一下arp的实现,内核版本2.6.24.[数据结构]协议栈通过ARP协议获取到的网络上邻居主机的IP地址与MAC地址的对应关 系都会保存在这个表中,以备下次与邻居通讯时使用,同时,ARP模块自身也会提供一套相应的机制来更新和维护这个邻居表.struct neigh_table{ struct neigh_table *next; //下一个邻居表 int family; //协议簇 int entry_size;//入口长度,也就是一个邻居结构的大小,初始化为si... 阅读全文

posted @ 2013-08-27 14:40 SuperKing 阅读(1914) 评论(0) 推荐(0) 编辑

Linux协议栈函数调用流程

摘要: 普通网络驱动程序中必须要调用的函数是eth_type_trans(略),然后向上递交sk_buff时调用netif_rx()(net/core/dev.c).其函数中主要几行 __skb_queue_tail(&queue->input_pkt_queue, skb);添加skb到接受队列中 netif_rx_schedule(&queue->backlog_dev); 开启接受软中断处理. struct softnet_data * queue 在net_dev_init()(dev.c)中初始化.其中有: open... 阅读全文

posted @ 2013-08-27 14:11 SuperKing 阅读(1552) 评论(0) 推荐(0) 编辑

IPVS实现分析

只有注册用户登录后才能阅读该文。 阅读全文

posted @ 2013-08-27 14:09 SuperKing 阅读(1081) 评论(5) 推荐(0) 编辑

IP 碎片重组

摘要: IP 碎片重组内核中的IP重组函数.struct sk_buff * ip_defrag(struct sk_buff * skb, u32 user){ ...... //如果内核范围超出限制 if (atomic_read(&ip_frag_mem) > sysctl_ipfrag_high_thresh) ip_evictor(); //回收内存到限制之内 ...... if ((qp = ip_find(iph, user)) != NULL) { //查找或者创建一个队列头 ...... ip_frag_queu... 阅读全文

posted @ 2013-08-27 10:29 SuperKing 阅读(1378) 评论(0) 推荐(0) 编辑

导航