diff options
| author | Qiuwen Lu <[email protected]> | 2016-11-24 16:36:53 +0800 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2016-11-24 16:36:53 +0800 |
| commit | 2fcd29356903c0a6c042d509f885fe53295207f3 (patch) | |
| tree | 6210965838b00153cc160db79d51d248374229af | |
| parent | 1c5874491599665aa88d01de6757ede8648031d6 (diff) | |
完成ARP报文请求、应答数据处理通路。
| -rw-r--r-- | service/src/register.c | 10 | ||||
| -rw-r--r-- | service/src/rxtx.c | 52 | ||||
| -rw-r--r-- | stack/src/protocol-arp.c | 10 | ||||
| -rw-r--r-- | stack/src/rxtx.c | 10 |
4 files changed, 65 insertions, 17 deletions
diff --git a/service/src/register.c b/service/src/register.c index 3de011b..72b562b 100644 --- a/service/src/register.c +++ b/service/src/register.c @@ -130,6 +130,13 @@ static int __sk_dev_register(struct sc_instance * instance, return 0; } + // 从真实设备中,填充MAC地址等信息 + struct mr_dev * dev = mr_device_lookup(sc_dev->mr_dev_param.symbol); + assert(dev != NULL); + + sc_dev->sk_dev_param.mtu = dev->mtu; + ether_addr_copy(&dev->ether_addr, &sc_dev->sk_dev_param.mac_addr); + struct sc_param * sc_param = &instance->sc_param; struct rte_mempool * direct_pool = mr_device_direct_pool_get(sc_dev->dev); struct rte_mempool * indirect_pool = mr_device_direct_pool_get(sc_dev->dev); @@ -143,7 +150,8 @@ static int __sk_dev_register(struct sc_instance * instance, MR_LOG(WARNING, SERVICE, "StackDevice %s create failed. \n", sc_dev->sk_dev_param.symbol); return -1; } - + + sc_dev->en_sk_dev = 1; MR_LOG(WARNING, SERVICE, "StackDevice %s created. \n", sc_dev->sk_dev_param.symbol); return 0; } diff --git a/service/src/rxtx.c b/service/src/rxtx.c index 53c84e9..653904d 100644 --- a/service/src/rxtx.c +++ b/service/src/rxtx.c @@ -4,6 +4,7 @@ #include <mr_vman.h> #include <mr_stat.h> #include <mr_vnode.h> +#include <unistd.h> extern int distributer_hash_caculate(unsigned int distmode, struct rte_mbuf * mbufs[], unsigned int nr_mbufs, hash_t result[]); @@ -41,31 +42,62 @@ int rt_serv_device_rx_bulk(struct rtdev_desc * dev_desc, thread_id_t sid, } int rt_serv_device_tx_bulk(struct rtdev_desc * dev_desc, thread_id_t sid, - struct rte_mbuf * mbufs_out[], int nr_mbufs, int * nr_mbufs_out) + struct rte_mbuf * mbufs_out[], int nr_mbufs) { int __nr_mbufs_out = 0; int __nr_mbufs_left = nr_mbufs; - struct rte_mbuf ** mbufs_out_curser = mbufs_out; // ��FTXͨ��ȡ�� int ret = vnode_dequeue_burst(dev_desc->vnode_cons_ftx, &dev_desc->ops, sid, - (void **)mbufs_out_curser, __nr_mbufs_left); + (void **)&mbufs_out[__nr_mbufs_out], __nr_mbufs_left); __nr_mbufs_out += ret; - __nr_mbufs_left -= __nr_mbufs_out; - mbufs_out_curser += __nr_mbufs_out; + __nr_mbufs_left -= ret; + assert(__nr_mbufs_left >= 0); // ʣ�����������TXͨ��ȡ ret = vnode_dequeue_burst(dev_desc->vnode_cons_tx, &dev_desc->ops, sid, - (void **)mbufs_out_curser, __nr_mbufs_left); + (void **)&mbufs_out[__nr_mbufs_out], __nr_mbufs_left); __nr_mbufs_out += ret; - *nr_mbufs_out = __nr_mbufs_out; - return 0; + __nr_mbufs_left -= ret; + assert(__nr_mbufs_left >= 0); + + return __nr_mbufs_out; } static inline void __tx_loop_one_device(struct sc_instance * instance, thread_id_t tid, - struct sc_device * sc_dev, unsigned int nr_rx_burst) + struct sc_device * sc_dev, unsigned int nr_tx_burst) { + struct rte_mbuf * tx_bufs[MR_BURST_MAX]; + int nr_tx_bufs = 0; + int nr_tx_bufs_left = nr_tx_burst; + int ret; + + struct mr_dev_q * devq = sc_dev->rx_devq[tid]; + assert(devq != NULL); + + // ����Э��ջ���豸��ȫ���͵�Э��ջ + if (sc_dev->en_sk_dev) + { + ret = sk_serv_device_tx_bulk(sc_dev->sk_dev, tid, &tx_bufs[nr_tx_bufs], nr_tx_bufs_left); + nr_tx_bufs += ret; + nr_tx_bufs_left -= ret; + } + else + { + ret = rt_serv_device_tx_bulk(sc_dev->rt_dev, tid, &tx_bufs[nr_tx_bufs], nr_tx_bufs_left); + nr_tx_bufs += ret; + nr_tx_bufs_left -= ret; + } + + ret = rte_eth_tx_burst(devq->port_id, devq->queue_id, tx_bufs, nr_tx_bufs); + if(unlikely(ret < nr_tx_bufs)) + { + for (int i = ret; i < nr_tx_bufs; i++) rte_pktmbuf_free(tx_bufs[i]); + printf("drop packet!\n"); + //TODO: ͳ�Ƽ��� + } + return; } @@ -107,7 +139,7 @@ static inline void __rx_loop_one_device(struct sc_instance * instance, thread_id rt_serv_device_rx_bulk(sc_dev->rt_dev, tid, rx_bufs_in, rx_bufs_out, nr_rx_bufs_in , &nr_rx_bufs_out); } - + clean: for (int i = 0; i < nr_rx_bufs_out; i++) rte_pktmbuf_free(rx_bufs_out[i]); diff --git a/stack/src/protocol-arp.c b/stack/src/protocol-arp.c index 48bc296..59126ef 100644 --- a/stack/src/protocol-arp.c +++ b/stack/src/protocol-arp.c @@ -50,8 +50,8 @@ static void arp_request_entry(struct sk_dev_desc * dev_desc, thread_id_t sid, struct ether_addr * s_eth_addr = (struct ether_addr *)&arp_header->arp_data.arp_sha; struct ether_addr * d_eth_addr = (struct ether_addr *)&arp_header->arp_data.arp_tha; - // 过滤非广播报文,请求应全部是广播的 - if (!sk_device_local_frame_filter(dev_desc->dev_info, d_eth_addr)) + // 过滤非广播报文,请求报文应全部填零 + if (!is_zero_ether_addr(d_eth_addr)) goto done; // 根据广播的ARP报文,更新邻居表 @@ -81,9 +81,9 @@ static void arp_request_entry(struct sk_dev_desc * dev_desc, thread_id_t sid, reply_arp_hdr->arp_op = ntohs(ARP_OP_REPLY); ether_addr_copy(ðer_hdr->s_addr, &reply_arp_hdr->arp_data.arp_sha); ether_addr_copy(ðer_hdr->d_addr, &reply_arp_hdr->arp_data.arp_tha); - reply_arp_hdr->arp_data.arp_sip = s_in_addr->s_addr; - reply_arp_hdr->arp_data.arp_tip = dev_desc->dev_info->in_addr.s_addr; - + reply_arp_hdr->arp_data.arp_sip = dev_desc->dev_info->in_addr.s_addr; + reply_arp_hdr->arp_data.arp_tip = s_in_addr->s_addr; + // 写应答包到线路 int ret = sk_device_serv_packet_send(dev_desc, sid, &reply_mbuf, 1); if (ret != 1) sk_packet_free(reply_mbuf, sid, SK_FREE_ARP_REQUEST_REPLY_FAILED); diff --git a/stack/src/rxtx.c b/stack/src/rxtx.c index b3905a0..715efe4 100644 --- a/stack/src/rxtx.c +++ b/stack/src/rxtx.c @@ -6,6 +6,7 @@ * \date 2016-10-21
*/
+#include <unistd.h>
#include <assert.h>
#include <sk_device.h>
#include <sk_stack.h>
@@ -45,7 +46,14 @@ static inline enum sk_packet_type __get_packet_type(struct rte_mbuf * mbuf) int sk_serv_device_tx_bulk(struct sk_dev_desc * dev_desc, thread_id_t sid,
struct rte_mbuf * mbufs_out[], int nr_mbufs_max)
{
- return 0;
+ int nr_mbufs_out = 0;
+ int nr_mbufs_left = nr_mbufs_max;
+
+ // ��ѭ�����Ļ�����
+ nr_mbufs_out += rte_ring_sc_dequeue_burst(dev_desc->tx_loop_buffer[sid],
+ (void **)&mbufs_out[nr_mbufs_out], nr_mbufs_left);
+
+ return nr_mbufs_out;
}
int sk_serv_device_rx_bulk(struct sk_dev_desc * dev_desc, thread_id_t sid,
|
