Re: [PATCH 0/4] virtio support for container
From: Tan, Jianfeng <hidden>
Date: 2016-01-12 16:18:38
Subsystem:
the rest · Maintainer:
Linus Torvalds
Hello, On 1/12/2016 11:11 PM, Amit Tomer wrote:
Hello,quoted
In vhost-switch, it judges if a virtio device is ready for processing after receiving a pkt from virtio device. So you'd better construct a pkt, and send it out firstly in l2fwd.I tried to ping the socket interface from host for the same purpose but it didn't work. Could you please suggest some other approach for achieving same(how pkt can be sent out to l2fwd)? Also, before trying this, I have verified that vhost-switch is working ok with testpmd . Thanks, Amit.
You can use below patch for l2fwd to send out an arp packet when it gets started.
diff --git a/examples/l2fwd/main.c b/examples/l2fwd/main.c
index 720fd5a..572b1ac 100644
--- a/examples/l2fwd/main.c
+++ b/examples/l2fwd/main.c@@ -69,6 +69,8 @@ #include <rte_mempool.h> #include <rte_mbuf.h> +#define SEND_ARP + #define RTE_LOGTYPE_L2FWD RTE_LOGTYPE_USER1 #define NB_MBUF 8192
@@ -185,6 +187,53 @@ print_stats(void)printf("\n====================================================\n");
}
+#ifdef SEND_ARP
+static void
+dpdk_send_arp(int portid, struct rte_mempool *mp)
+{
+ /*
+ * len = 14 + 46
+ * ARP, Request who-has 10.0.0.1 tell 10.0.0.2, length 46
+ */
+ static const uint8_t arp_request[] = {
+ /*0x0000:*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xa8,
0x6b, 0xfd, 0x02, 0x29, 0x08, 0x06, 0x00, 0x01,
+ /*0x0010:*/ 0x08, 0x00, 0x06, 0x04, 0x00, 0x01, 0xec, 0xa8,
0x6b, 0xfd, 0x02, 0x29, 0x0a, 0x00, 0x00, 0x01,
+ /*0x0020:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00,
0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ /*0x0030:*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00
+ };
+ int ret;
+ struct rte_mbuf *m;
+ struct ether_addr mac_addr;
+ int pkt_len = sizeof(arp_request) - 1;
+
+ m = rte_pktmbuf_alloc(mp);
+
+ memcpy((void *)((uint64_t)m->buf_addr + m->data_off), arp_request,
pkt_len);
+ rte_pktmbuf_pkt_len(m) = pkt_len;
+ rte_pktmbuf_data_len(m) = pkt_len;
+
+ rte_eth_macaddr_get(portid, &mac_addr);
+ memcpy((void *)((uint64_t)m->buf_addr + m->data_off + 6),
&mac_addr, 6);
+
+ ret = rte_eth_tx_burst(portid, 0, &m, 1);
+ if (ret == 1) {
+ printf("arp sent: ok\n");
+ printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
+ mac_addr.addr_bytes[0],
+ mac_addr.addr_bytes[1],
+ mac_addr.addr_bytes[2],
+ mac_addr.addr_bytes[3],
+ mac_addr.addr_bytes[4],
+ mac_addr.addr_bytes[5]);
+ } else {
+ printf("arp sent: fail\n");
+ }
+
+ rte_pktmbuf_free(m);
+}
+#endif
+
+
/* Send the burst of packets on an output interface */
static int
l2fwd_send_burst(struct lcore_queue_conf *qconf, unsigned n, uint8_t port)@@ -281,6 +330,9 @@ l2fwd_main_loop(void) portid = qconf->rx_port_list[i]; RTE_LOG(INFO, L2FWD, " -- lcoreid=%u portid=%u\n", lcore_id, portid); +#ifdef SEND_ARP + dpdk_send_arp(portid, l2fwd_pktmbuf_pool); +#endif } while (1) {