TCP/IP协议栈中IP层架构

/*
 *  Main IP Receive routine.
 * 对IP头部合法性进行严格检查,然后把具体功能交给ip_rcv_finish
 */
int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)
{
    const struct iphdr *iph;
    u32 len;

    /* 
     * 当网卡处于混杂模式时,丢掉所有接收到的的垃圾数据,不要试图解析它
     */
     //noted: 其实也就是丢弃掉不是发往本地的数据包。网卡在混杂模式下会接收一切到达网卡的数据,不管目的地mac是否是本网卡
     //noted: 在调用ip_rcv之前,内核会将该数据包交给嗅探器,所以该函数仅丢弃该包
    if (skb->pkt_type == PACKET_OTHERHOST)
        goto drop;


    //noted:该宏用于内核做一些统计,关于网络层snmp统计的信息,也可以通过netstat 指令看到这些统计值
    IP_UPD_PO_STATS_BH(dev_net(dev), IPSTATS_MIB_IN, skb->len);

    //noted: ip_rcv是由netif_receive_skb函数调用,如果嗅探器或者其他的用户对数据包需要进
    //进行处理,则在调用ip_rcv之前,netif_receive_skb会增加skb的引用计数,既该引
    //用计数会大于1。若如此次,则skb_share_check会创建sk_buff的一份拷贝。
    if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) {
        //noted: SNMP所需要的统计数据,忽略
        IP_INC_STATS_BH(dev_net(dev), IPSTATS_MIB_INDISCARDS);
        goto out;
    }

    //noted:pskb_may_pull确保skb->data指向的内存包含的数据至少为IP头部大小,由于每个
    //IP数据包包括IP分片必须包含一个完整的IP头部。如果小于IP头部大小,则缺失
    //的部分将从数据分片中拷贝。这些分片保存在skb_shinfo(skb)->frags[]中。
    if (!pskb_may_pull(skb, sizeof(struct iphdr)))
        goto inhdr_error;

    //noted: pskb_may_pull可能会调整skb中的指针,所以需要重新定义IP头部
    iph = ip_hdr(skb);

    /*
     *  RFC1122: 3.2.1.2 必须默默地放弃任何IP帧校验和失败.
     *
     *  数据报可接收?
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值