免费注册 查看新帖 |

Chinaunix

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

[虚拟化] 内核net/ipv4/ipconfig.c中dev-type问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-03-09 15:37 |只看该作者 |倒序浏览
重新编译了内核,启动时挂载nfs系统时dhcp获取ip出错。


查看内核源码:

在内核文件ipconfig.c里找到了这么一段,不知道该怎么设置dhcp
/*
*  Send DHCP/BOOTP request to single interface.
*/
static void __init ic_bootp_send_if(struct ic_device *d, unsigned long jiffies_diff)
{
        struct net_device *dev = d->dev;
        struct sk_buff *skb;
        struct bootp_pkt *b;
        struct iphdr *h;

        /* Allocate packet */
        skb = alloc_skb(sizeof(struct bootp_pkt) + LL_ALLOCATED_SPACE(dev) + 15,
                        GFP_KERNEL);
        if (!skb)
                return;
        skb_reserve(skb, LL_RESERVED_SPACE(dev));
        b = (struct bootp_pkt *) skb_put(skb, sizeof(struct bootp_pkt));
        memset(b, 0, sizeof(struct bootp_pkt));

        /* Construct IP header */
        skb_reset_network_header(skb);
        h = ip_hdr(skb);
        h->version = 4;
        h->ihl = 5;
        h->tot_len = htons(sizeof(struct bootp_pkt));
        h->frag_off = htons(IP_DF);
        h->ttl = 64;
        h->protocol = IPPROTO_UDP;
        h->daddr = htonl(INADDR_BROADCAST);
        h->check = ip_fast_csum((unsigned char *) h, h->ihl);

        /* Construct UDP header */
        b->udph.source = htons(6;
        b->udph.dest = htons(67);
        b->udph.len = htons(sizeof(struct bootp_pkt) - sizeof(struct iphdr));
        /* UDP checksum not calculated -- explicitly allowed in BOOTP RFC */

        /* Construct DHCP/BOOTP header */
        b->op = BOOTP_REQUEST;
        if (dev->type < 256) /* check for false types */
                b->htype = dev->type;
        else if (dev->type == ARPHRD_IEEE802_TR) /* fix for token ring */
                b->htype = ARPHRD_IEEE802;
        else if (dev->type == ARPHRD_FDDI)
                b->htype = ARPHRD_ETHER;
        else {
               printk("Unknown ARP type 0x%04x for device %s\n", dev->type, dev->name);
                b->htype = dev->type; /* can cause undefined behavior */
        }

        /* server_ip and your_ip address are both already zero per RFC2131 */
        b->hlen = dev->addr_len;
        memcpy(b->hw_addr, dev->dev_addr, dev->addr_len);
        b->secs = htons(jiffies_diff / HZ);
        b->xid = d->xid;

        /* add DHCP options or BOOTP extensions */
#ifdef IPCONFIG_DHCP
        if (ic_proto_enabled & IC_USE_DHCP)
                ic_dhcp_init_options(b->exten);
        else
#endif
                ic_bootp_init_ext(b->exten);

        /* Chain packet down the line... */
        skb->dev = dev;
        skb->protocol = htons(ETH_P_IP);
        if (dev_hard_header(skb, dev, ntohs(skb->protocol),
                            dev->broadcast, dev->dev_addr, skb->len) < 0 ||
            dev_queue_xmit(skb) < 0)
                printk("E";
}





dev->type, dev->name是怎么得到的,该如何解决这个问题?

论坛徽章:
1
IT运维版块每日发帖之星
日期:2016-07-14 06:20:00
2 [报告]
发表于 2015-07-03 15:43 |只看该作者
本帖最后由 ken1980 于 2015-07-03 15:43 编辑

dev->type, dev->name是设备驱动注册的时候写入的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP