欢迎来到 DPDK交流社区 ,有什么问题可以尽管在这里提问,您将会收到社区其他成员的回答;也可以将您的总结写在这里,为社区其他成员提供帮助。 (QQ交流群:127163755)

怎么创建Bond网口的KNI设备?

0 投票

我通过rte_eth_bond_create在用户态创建了一个bond设备:

100     retval = rte_eth_bond_create(bondname, bondmode,
101             0 /*SOCKET_ID_ANY*/);
102     if (retval < 0)
103         rte_exit(EXIT_FAILURE,
104                 "Faled to create bond port\n");
105 
106     BOND_PORT = (uint8_t)retval;

现在希望同时在内核建立KNI映射,目前我的做法是:

 59     snprintf(conf.name, RTE_KNI_NAMESIZE,"%s", bondname);
 60     //conf.group_id = (uint16_t)port_id;
 61     conf.group_id = rte_eth_bond_primary_get(port_id);
 62     conf.mbuf_size = MAX_PACKET_SZ;
 63     printf("conf setup\n");
 64 
 65     //rte_eth_dev_info_get(port_id, &dev_info);
 66     rte_eth_dev_info_get(conf.group_id, &dev_info);
 67     if(dev_info.pci_dev){
 68     ┊   conf.addr = dev_info.pci_dev->addr;
 69     ┊   conf.id = dev_info.pci_dev->id;
 70     }
 71     printf("dev_info setup\n");

先获取Primary Slave的port id,然后将其传入rte_eth_dev_info_get中获取dev_info.pci_dev

否则,如果传入的时bond设备的ID则会导致dev_info.pci_dev为空值,这样会导致段错误

这样我的确可以在内核建立其bond设备,但是这个bond设备却无法up起来,将其up起来时,会报错:

RTNETLINK answers: Timer expired

请问应该怎么为bond网口在内核建立KNI映射呢??

或者怎么样才能使Bond口可以通过ip命令或ifconfig来管理呢????

 

 

最新提问 9月 25, 2017 分类:DPDK API问答 | 用户: duke (120 分)

1个回答

0 投票
似乎没办法给bond口建立kni吧。你可以创建一个虚拟的bond口用来管理,用DPDK的bond口进行收发包操作,与kni类似。
最新回答 9月 28, 2017 用户: admin (260 分)
你好,我这边现在通过KNI接口建立的bond设备了:
    snprintf(conf.name, RTE_KNI_NAMESIZE,"%s", bondname);
    conf.group_id = (uint16_t)port_id;
    //conf.group_id = rte_eth_bond_primary_get(port_id);
    conf.mbuf_size = MAX_PACKET_SZ;

    printf("bond group id=%u\n",conf.group_id);
    printf("conf setup\n");

    //rte_eth_dev_info_get(port_id, &dev_info);
    rte_eth_dev_info_get(conf.group_id, &dev_info);
    //rte_eth_dev_info_get(0, &dev_info);
    if(dev_info.pci_dev){
    ┊   conf.addr = dev_info.pci_dev->addr;
    ┊   conf.id = dev_info.pci_dev->id;
    ┊   printf("dev_info setup port_id=%d\n",port_id);
    }else{
    ┊   printf("no dev_info.pci_dev found for port_id %d\n",port_id);
    }   

    ops.port_id = port_id;
    ops.change_mtu = kni_change_mtu;
    ops.config_network_if = kni_config_network_interface;
    printf("ops setup\n");

    kni = rte_kni_alloc(pktmbuf_pool, &conf, &ops);
    //kni = rte_kni_alloc(pktmbuf_pool, &conf, NULL);
    if (!kni)
    ┊   rte_exit(EXIT_FAILURE, "Fail to create kni for port: %d\n", port_id);

这样可以建立KNI的映射,然后对应的添加上ingress和egress就可以操作这个网口,ingress和egress类似于examples/kni下的方法

现在这种方法在mode=1的模式下是可以正常使用的,对于mode=6的话还不能通信,
我在原生CentOS7下面,使用mode=6好像也不能运行......还在研究......
希望大神可以指点下  --  bowener.chen@gmail.com
...