免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1513 | 回复: 0
打印 上一主题 下一主题

ifconfig promisc内核处理流程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-14 12:36 |只看该作者 |倒序浏览

                ifconfig promisc内核处理流程:
ioctl(skfd, SIOCSIFFLAGS, &ifr)
...
int dev_ioctl(unsigned int cmd, void __user *arg) /*net/core/dev.c*/
    |
     ——>dev_ifsioc(struct ifreq *ifr, unsigned int cmd)
        |
         ——>int dev_change_flags(struct net_device *dev, unsigned flags)
                |
                 ——>void dev_set_promiscuity(struct net_device *dev, int inc)
                        |
                         ——>void dev_mc_upload(struct net_device *dev) /*net/core/dev_mcast.c*/
                            |
                             ——>dev->set_multicast_list(dev)
                                    |
                                    |
                               hw;
    struct e1000_mac_info *mac = &hw->mac;
    struct dev_mc_list *mc_ptr;
    u8  *mta_list;
    u32 rctl;
    int i;
    /* Check for Promiscuous and All Multicast modes */
    rctl = E1000_READ_REG(hw, E1000_RCTL);
    if (netdev->flags & IFF_PROMISC) {
        rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE);
    } else if (netdev->flags & IFF_ALLMULTI) {
        rctl |= E1000_RCTL_MPE;
        rctl &= ~E1000_RCTL_UPE;
    } else {
        rctl &= ~(E1000_RCTL_UPE | E1000_RCTL_MPE);
    }
    E1000_WRITE_REG(hw, E1000_RCTL, rctl); /*写网卡寄存器*/
    /* 82542 2.0 needs to be in reset to write receive address registers */
    if (hw->mac.type == e1000_82542)
        e1000_enter_82542_rst(adapter);
    mta_list = kmalloc(netdev->mc_count * 6, GFP_ATOMIC);
    if (!mta_list)
        return;
    /* The shared function expects a packed array of only addresses. */
    mc_ptr = netdev->mc_list;
    for (i = 0; i mc_count; i++) {
        if (!mc_ptr)
            break;
        memcpy(mta_list + (i*ETH_ALEN), mc_ptr->dmi_addr, ETH_ALEN);
        mc_ptr = mc_ptr->next;
    }
    e1000_update_mc_addr_list(hw, mta_list, i, 1, mac->rar_entry_count);
    kfree(mta_list);
    if (hw->mac.type == e1000_82542)
        e1000_leave_82542_rst(adapter);
}
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/33173/showart_1130511.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP