文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>关于ip_finish_output2的一点分析

关于ip_finish_output2的一点分析

时间:2009-04-19  来源:ggyyunix

首先声明,因为刚开始看linux内核协议栈,所以肯定有许多不正确的地方,如果大家发现不对的地方请帮我指正。在此先谢过了。

ip_finish_output2函数在文件“net/ipv4/ip_output.c”中定义,如下:

    kfree_skb(skb);
    return -EINVAL;
}

对于“hh->hh_output(skb);”,这里hh_output的赋值,在google上没找到,粗略看了一下代码,估计是在函数neigh_hh_init中赋值的(我也不能确定,还需要以后更熟悉协议栈代码后,如有错再更正),此函数在文件“net/core/neighbour.c”中定义,如下

         The only thing, that I can say now:
         It is very sad that we need to keep ugly obsolete
         code to make them happy.

         They should be moved to more reasonable state, now
         they use rebuild_header INSTEAD OF
         Besides that, they are sort of out of date
         (a lot of redundant clones/copies, useless in 2.1),
         I wonder why people believe that they work.
         */
        switch (dev->type) {
        default:
            break;
        case ARPHRD_ROSE:    
#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
        case ARPHRD_AX25:
#if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE)
        case ARPHRD_NETROM:
#endif
            neigh->ops = &arp_broken_ops;
            neigh->output = neigh->ops->output;
            return 0;
#endif
        ;}
#endif
        if (neigh->type == RTN_MULTICAST) {
            neigh->nud_state = NUD_NOARP;
            arp_mc_map(addr, neigh->ha, dev, 1);
        } else if (dev->flags&(IFF_NOARP|IFF_LOOPBACK)) {
            neigh->nud_state = NUD_NOARP;
            memcpy(neigh->ha, dev->dev_addr, dev->addr_len);
        } else if (neigh->type == RTN_BROADCAST || dev->flags&IFF_POINTOPOINT) {
            neigh->nud_state = NUD_NOARP;
            memcpy(neigh->ha, dev->broadcast, dev->addr_len);
        }
        if (dev->hard_header_cache)
            neigh->ops = &arp_hh_ops;
        else
            neigh->ops = &arp_generic_ops;
        if (neigh->nud_state&NUD_VALID)
            neigh->output = neigh->ops->connected_output;
        else
            neigh->output = neigh->ops->output;
    }
    return 0;
}

这个netgh->ops赋值为函数arp_generic_ops或者arp_hh_ops或者arp_broken_ops或者arp_direct_ops的地址, 这四个结构体变量的具体定义在“net/ipv4/arp.c”中找到,代码如下:

相关阅读 更多 +
排行榜 更多 +
兔子跳一跳游戏

兔子跳一跳游戏

休闲益智 下载
球球跳跃游戏

球球跳跃游戏

休闲益智 下载
森林之灵游戏

森林之灵游戏

休闲益智 下载