summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2016-11-24 16:36:53 +0800
committerQiuwen Lu <[email protected]>2016-11-24 16:36:53 +0800
commit2fcd29356903c0a6c042d509f885fe53295207f3 (patch)
tree6210965838b00153cc160db79d51d248374229af
parent1c5874491599665aa88d01de6757ede8648031d6 (diff)
完成ARP报文请求、应答数据处理通路。
-rw-r--r--service/src/register.c10
-rw-r--r--service/src/rxtx.c52
-rw-r--r--stack/src/protocol-arp.c10
-rw-r--r--stack/src/rxtx.c10
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(&ether_hdr->s_addr, &reply_arp_hdr->arp_data.arp_sha);
ether_addr_copy(&ether_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,