linux 网络协议栈
文章平均质量分 78
白水煮鸡蛋
这个作者很懒,什么都没留下…
展开
-
linux网络协议栈分析笔记2-网桥1
这一章主要看网桥的处理。网桥是一种2层网络互连设备,而不是一种网络协议。它在协议结构上并没有占有一席之地,因此不能通过向协议栈注册协议的方式来申请网桥数据包的处理。skb = handle_bridge(skb, &pt_prev, &ret, orig_dev);static inline struct sk_buff *handle_bridge(str原创 2013-04-05 23:02:52 · 2274 阅读 · 0 评论 -
[网络编程]socket创建流程
今天分析下socket的创建流程关于用户态socket如何通过系统调用进入内核态到sys_socke,这里就不再分析,直接看内核态socket入口SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol){ int retval; struct socket *sock; int原创 2013-04-20 18:25:06 · 1720 阅读 · 0 评论 -
[网络编程]select流程分析
函数原型:int select(int maxfdp1,fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout)主要代码路径与文件 linux/fs/select.c linux/include/linux/poll.h select的调用路径sys_原创 2013-04-21 00:05:39 · 1775 阅读 · 0 评论 -
linux网络协议栈分析笔记14-路由4-FIB3
看完fib的查找,弄清了一些数据结构的组织,我们再来看看路由表是如何创建的从ip_fib_init注册的两个通知链来看,在IP地址发送变动时会触发通知链的处理函数,都会调用fib_add_ifaddr()来添加地址到路由中这个里面由调用了fib_magic来进行路由地址的操作。static void fib_magic(int cmd, int type, __be32 dst, in原创 2013-04-16 21:32:22 · 1665 阅读 · 1 评论 -
linux网络协议栈分析笔记12-路由2-FIB1
上一章我们看到了通过fib_lookup去查找了路由信息,这一章我们就看看fib到底是什么FIB(Forward Information Base) 转发信息库inet_init()->ip_init()->ip_rt_init()->ipv4_dst_ops.kmem_cachep = kmem_cache_create("ip_dst_cache"原创 2013-04-14 19:46:30 · 1906 阅读 · 0 评论 -
linux网络协议栈分析笔记11-路由1-路由缓存
来吧,路由路由是网络的核心,是linux网络协议栈的核心,我们找个入口进去看看还记得在笔记5-IP层的处理1中ip_rcv_finish走到过一个岔口->ip_rcv_finish() ->ip_route_input() 查找路由信息 ->if (iph->ihl > 5 && ip_rcv_options(skb)) 如果IP头部大于20字节,则表原创 2013-04-13 20:20:53 · 3229 阅读 · 0 评论 -
linux网络协议栈分析笔记13-路由3-FIB2
当然,我们选择路由1那章的遗留的接口进入分析fib_lookup() 我们前面提到过fib初始化时,CONFIG_IP_MULTIPLE_TABLES 宏导致了两种方式的fib表初始化,因此存在了有多路由表存在和无多路由表存在的情况,我们先看无多路由表的情况static inline int fib_lookup(struct net *net, const stru原创 2013-04-14 19:48:10 · 2309 阅读 · 0 评论 -
linux网络协议栈分析笔记10-arp邻居子系统3
还是回到neigh_resolve_output()int neigh_resolve_output(struct sk_buff *skb){ struct dst_entry *dst = skb_dst(skb); struct neighbour *neigh; int rc = 0; if (!dst || !(neigh =原创 2013-04-12 19:41:49 · 1853 阅读 · 0 评论 -
linux网络协议栈分析笔记9-arp邻居子系统2
上回说到流量输出会走到neigh_resolve_output 我们来看看邻居这玩意能玩点什么花样,传说的arp学习在哪里int neigh_resolve_output(struct sk_buff *skb){ struct dst_entry *dst = skb_dst(skb); struct neighbour *neigh; int rc原创 2013-04-12 19:40:37 · 2012 阅读 · 0 评论 -
linux网络协议栈分析笔记8-arp邻居子系统1
我们进入arp协议,我们看看linux中号称邻居子系统是啥样的static struct packet_type arp_packet_type __read_mostly = { .type = cpu_to_be16(ETH_P_ARP), .func = arp_rcv,};还记得那个netif_receive_skb吧,选择原创 2013-04-11 21:54:02 · 1748 阅读 · 0 评论 -
linux网络协议栈分析笔记7-VLAN的处理
这次先看看VLAN怎么处理的 主要代码目录linux/net/8021qdev_add_pack(&vlan_packet_type); vlan-802.1qstatic struct packet_type vlan_packet_type __read_mostly = { .type = cpu_to_be16(ETH_P_8021Q)原创 2013-04-10 20:10:32 · 2000 阅读 · 0 评论 -
linux网络协议栈分析笔记6-IP层的处理2
上章说到ip_rcv_finish最后会有两个选择:1)ip_local_deliver2)ip_forward现在我们看下ip_forward()->ip_forward() ->struct ip_options * opt = &(IPCB(skb)->opt); option中保存的是skb的一些ip头中的options信息 ->if原创 2013-04-09 21:07:01 · 1738 阅读 · 0 评论 -
linux网络协议栈分析笔记5-IP层的处理1
前几章稍分析了网桥,接着我们继续1中的收包流程,说到对该数据包转达到其他L3协议的处理函数:type = skb->protocol;list_for_each_entry_rcu(ptype, &ptype_base[ntohs(type) & PTYPE_HASH_MASK], list) { if (ptype->type原创 2013-04-08 22:43:42 · 1534 阅读 · 0 评论 -
linux网络协议栈分析笔记3-网桥2
转发数据库模块,即二层MAC-端口转发表处理模块初始化:->br_fdb_init() 创建net_bridge_fdb_entry结构的高速缓存 br_fdb_cache = kmem_cache_create("bridge_fdb_cache", sizeof(struct net_bridge_fdb_entr原创 2013-04-07 08:48:19 · 1111 阅读 · 0 评论 -
linux网络协议栈分析笔记1-接入部分
初始化部分:->net_dev_init() 网络设备初始化 queue->backlog.poll = process_backlog; 注册非NAPI方式的POLL函数 open_softirq(NET_TX_SOFTIRQ, net_tx_action); 注册发送软中断 open_softirq(NET_RX_SOFTIRQ,原创 2013-04-05 17:58:21 · 1435 阅读 · 0 评论 -
[网络编程]epoll流程浅析
花了半天,把epoll的实现大体看了下,这里稍总结下:epoll相关的三个用户态API接口:1、epoll_create函数函数声明:int epoll_create(int size)该函数生成一个epoll专用的文件描述符。它其实是在内核申请一空间,用来存放你想关注的socket fd上是否发生以及发生了什么事件。size就是你在这个epoll fd上能关注的最大soc原创 2013-04-21 16:08:14 · 2551 阅读 · 0 评论