linux TCP/IP协议栈 ---ip_rcv_finish()
来源:互联网 发布:易语言调用淘宝api 编辑:程序博客网 时间:2024/06/06 12:27
- static int ip_rcv_finish(struct sk_buff*skb)
- {
- const struct iphdr *iph = ip_hdr(skb);
- struct rtable *rt;
- /*
- * Initialise the virtual path cachefor the packet. It describes
- * how the packet travels inside Linux networking.
- */
- /*
- * 通常从外界接收的数据包,skb->dst不会包含路由信息,暂时还不知道在何处会设置
- * 这个字段。ip_route_input函数会根据路由表设置路由信息,暂时不考虑路由系统。
- */
- if (skb->dst==NULL){
- int err = ip_route_input(skb, iph->daddr, iph->saddr, iph->tos,
- skb->dev);
- if (unlikely(err)){
- if (err == -EHOSTUNREACH)
- IP_INC_STATS_BH(IPSTATS_MIB_INADDRERRORS);
- else if (err==-ENETUNREACH)
- IP_INC_STATS_BH(IPSTATS_MIB_INNOROUTES);
- goto drop;
- }
- }
- /* 更新流量控制所需要的统计数据,忽略*/
- #ifdef CONFIG_NET_CLS_ROUTE
- if (unlikely(skb->dst->tclassid)){
- struct ip_rt_acct *st = ip_rt_acct + 256*smp_processor_id();
- u32 idx = skb->dst->tclassid;
- st[idx&0xFF].o_packets++;
- st[idx&0xFF].o_bytes+=skb->len;
- st[(idx>>16)&0xFF].i_packets++;
- st[(idx>>16)&0xFF].i_bytes+=skb->len;
- }
- #endif
- /* 如果IP头部大于20字节,则表示IP头部包含IP选项,需要进行选项处理.暂时忽略,毕竟很少用*/
- if (iph->ihl> 5&& ip_rcv_options(skb))
- goto drop;
- /* skb->dst包含路由信息。根据路由类型更新SNMP统计数据*/
- rt = (struct rtable*)skb->dst;
- if (rt->rt_type== RTN_MULTICAST)
- IP_INC_STATS_BH(IPSTATS_MIB_INMCASTPKTS);
- else if (rt->rt_type== RTN_BROADCAST)
- IP_INC_STATS_BH(IPSTATS_MIB_INBCASTPKTS);
- /*
- * dst_input实际上会调用skb->dst->input(skb).input函数会根据路由信息设置为合适的
- * 函数指针,如果是递交到本地的则为ip_local_deliver,若是转发则为ip_forward.
- * 暂时仅先考虑ip_local_deliver。
- */
- return dst_input(skb);
- drop:
- kfree_skb(skb);
- return NET_RX_DROP;
- }
0 0
- linux TCP/IP协议栈 ---ip_rcv_finish()
- linux TCP/IP协议栈 ---ip_rcv_finish()
- Linux TCP/IP协议
- Linux TCP/IP协议栈笔记
- Linux的TCP/IP协议栈
- Linux TCP/IP协议栈笔记
- Linux TCP/IP协议栈笔记(1)
- Linux TCP/IP协议栈笔记(2)
- Linux TCP/IP协议栈笔记(3)
- Linux TCP/IP协议栈笔记(4)
- Linux TCP/IP协议栈笔记(5)
- linux tcp ip 协议栈 优化
- Linux TCP/IP 协议栈源码分析
- Linux TCP/IP 协议栈源码分析
- Linux TCP/IP 协议栈源码分析
- Linux TCP/IP 协议栈源码分析
- Linux TCP/IP协议栈笔记
- Linux TCP/IP 协议栈源码分析
- TCP/IP 相关知识点与面试题集
- Java--集合(Map)
- 技术晋升的评定与博弈
- Github Pages使用
- 使用非const指针修改const int的值
- linux TCP/IP协议栈 ---ip_rcv_finish()
- Java计算器实现加减乘除功能
- java集合系列——Map介绍(七)
- android 输入框EditText禁止输入Emoji表情符
- 顺序表-----C++实现
- java中线程常用的方法
- Linux网络层 ip_rcv()函数代码分析(__pskb_pull_tail)
- 理解MySQL——索引与优化
- mysql数据库 sql语句学习笔记03 查询 聚合 表连接 记录联合