summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2016-11-29 09:57:46 +0800
committerQiuwen Lu <[email protected]>2016-11-29 09:57:46 +0800
commit00c89c6402cc2c7dd31855374a8ac00cc47224fa (patch)
tree060692d60dee4c8cf4196ad1cf6d884191a9123d
parent4b9e986df676ba61517a582da8bb9f459da86fbc (diff)
变更协议处理部分文件名称,完成UDP出站路径协议处理部分功能。
-rw-r--r--core/src/buffer.c1
-rw-r--r--include/mr_common.h1
-rw-r--r--service/CMakeLists.txt2
-rw-r--r--service/src/rxtx.c8
-rw-r--r--stack/CMakeLists.txt2
-rw-r--r--stack/include/sk_arp.h (renamed from stack/include/sk_protocol_arp.h)0
-rw-r--r--stack/include/sk_device.h5
-rw-r--r--stack/include/sk_icmp.h (renamed from stack/include/sk_protocol_icmp.h)0
-rw-r--r--stack/include/sk_pcom.h (renamed from stack/include/sk_protocol_common.h)0
-rw-r--r--stack/include/sk_route.h6
-rw-r--r--stack/include/sk_stack.h4
-rw-r--r--stack/include/sk_tcp.h (renamed from stack/include/sk_protocol_tcp.h)0
-rw-r--r--stack/include/sk_udp.h (renamed from stack/include/sk_protocol_udp.h)2
-rw-r--r--stack/src/arp.c (renamed from stack/src/protocol-arp.c)0
-rw-r--r--stack/src/icmp.c (renamed from stack/src/protocol-icmp.c)2
-rw-r--r--stack/src/ip.c15
-rw-r--r--stack/src/neigh.c2
-rw-r--r--stack/src/pcom.c (renamed from stack/src/protocol-common.c)2
-rw-r--r--stack/src/protocol-udp.c9
-rw-r--r--stack/src/route.c2
-rw-r--r--stack/src/rxtx.c26
-rw-r--r--stack/src/tcp.c (renamed from stack/src/protocol-tcp.c)2
-rw-r--r--stack/src/udp.c107
23 files changed, 148 insertions, 50 deletions
diff --git a/core/src/buffer.c b/core/src/buffer.c
index 2d913a9..fe640b7 100644
--- a/core/src/buffer.c
+++ b/core/src/buffer.c
@@ -17,6 +17,7 @@
#include <rte_malloc.h>
#include <rte_mbuf.h>
#include <rte_common.h>
+#include <marsio_buffer_user_api.h>
#define MRB_MAX_CTRLZONE_NUM 16
diff --git a/include/mr_common.h b/include/mr_common.h
index 667cbf9..3911a26 100644
--- a/include/mr_common.h
+++ b/include/mr_common.h
@@ -103,6 +103,7 @@ typedef rte_spinlock_t mr_spinlock_t;
/* Only use in Visual Studio, to avoid IDE errors */
#ifdef _MSC_VER
#define rte_cpu_to_be_16(x) htons(x)
+#define rte_cpu_to_be_32(x) htonl(x)
#define rte_be_to_cpu_32(x) ntohl(x)
#define likely(x) x
#define unlikely(x) x
diff --git a/service/CMakeLists.txt b/service/CMakeLists.txt
index 4a00981..8747c73 100644
--- a/service/CMakeLists.txt
+++ b/service/CMakeLists.txt
@@ -7,7 +7,7 @@ include_directories(${DPDK_INCLUDE_DIR})
include_directories(include)
add_definitions(${DPDK_C_PREDEFINED})
-add_executable(zcpd src/core.c src/runtime.c src/config.c src/register.c src/rxtx.c src/ldbc.c)
+add_executable(zcpd src/core.c src/config.c src/register.c src/rxtx.c src/ldbc.c)
target_link_libraries(zcpd ${DPDK_LIBRARY} MESA_prof_load_static)
target_link_libraries(zcpd rt pthread dl core stack)
target_include_directories(zcpd INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include/")
diff --git a/service/src/rxtx.c b/service/src/rxtx.c
index 653904d..cc038f4 100644
--- a/service/src/rxtx.c
+++ b/service/src/rxtx.c
@@ -1,7 +1,6 @@
#include <rte_ethdev.h>
#include <sc_common.h>
#include <mr_common.h>
-#include <mr_vman.h>
#include <mr_stat.h>
#include <mr_vnode.h>
#include <unistd.h>
@@ -94,8 +93,6 @@ static inline void __tx_loop_one_device(struct sc_instance * instance, thread_id
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;
@@ -131,8 +128,7 @@ static inline void __rx_loop_one_device(struct sc_instance * instance, thread_id
// ����Э��ջ���豸��ȫ���͵�Э��ջ
if (sc_dev->en_sk_dev)
{
- sk_serv_device_rx_bulk(sc_dev->sk_dev, tid, rx_bufs_in, rx_bufs_out, nr_rx_bufs_in
- , &nr_rx_bufs_out);
+ sk_serv_device_rx_bulk(sc_dev->sk_dev, tid, rx_bufs_in, nr_rx_bufs_in);
}
else
{
@@ -175,7 +171,7 @@ void * sc_runtime_thread(void * args)
struct sc_instance * instance = (struct sc_instance *)args;
thread_id_t tid = mr_thread_id();
- MR_LOG(INFO, SERVICE, "Thread ID=%d Running, CPU_ID=%d, Socket_ID=%d\n",
+ MR_LOG(INFO, SERVICE, "Thread Running(ThreadID=%d, CPU=%d, SocketID=%d\n",
mr_thread_id(), mr_cpu_id(), mr_socket_id());
while (1)
diff --git a/stack/CMakeLists.txt b/stack/CMakeLists.txt
index 201027a..c7d14cf 100644
--- a/stack/CMakeLists.txt
+++ b/stack/CMakeLists.txt
@@ -7,7 +7,7 @@ include_directories(${DPDK_INCLUDE_DIR})
add_definitions(${DPDK_C_PREDEFINED})
include_directories(include)
add_library(stack src/stack.c src/device.c src/neigh.c src/rxtx.c src/route.c src/ip.c
- src/protocol-common.c src/protocol-arp.c src/protocol-icmp.c src/protocol-tcp.c src/protocol-udp.c)
+ src/pcom.c src/arp.c src/icmp.c src/tcp.c src/udp.c)
target_link_libraries(stack MESA_prof_load_static mruntime core)
target_link_libraries(stack rt pthread dl)
target_include_directories(stack INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include/") \ No newline at end of file
diff --git a/stack/include/sk_protocol_arp.h b/stack/include/sk_arp.h
index 6a1daf3..6a1daf3 100644
--- a/stack/include/sk_protocol_arp.h
+++ b/stack/include/sk_arp.h
diff --git a/stack/include/sk_device.h b/stack/include/sk_device.h
index 1ba5d34..b0e13b4 100644
--- a/stack/include/sk_device.h
+++ b/stack/include/sk_device.h
@@ -212,11 +212,6 @@ static inline int sk_device_local_inaddr_filter(struct sk_dev_info * dev_info, s
return (dev_info->in_addr.s_addr == in_addr->s_addr);
}
-int sk_device_mamanger_init(struct sk_instance * instance);
-
-int sk_device_manager_slave_init(struct sk_instance * instance, struct sk_app_instance * slave_instance);
-
-
#ifdef __cplusplus
}
#endif \ No newline at end of file
diff --git a/stack/include/sk_protocol_icmp.h b/stack/include/sk_icmp.h
index 46e8a73..46e8a73 100644
--- a/stack/include/sk_protocol_icmp.h
+++ b/stack/include/sk_icmp.h
diff --git a/stack/include/sk_protocol_common.h b/stack/include/sk_pcom.h
index 9a0c59e..9a0c59e 100644
--- a/stack/include/sk_protocol_common.h
+++ b/stack/include/sk_pcom.h
diff --git a/stack/include/sk_route.h b/stack/include/sk_route.h
index afc5dee..560da38 100644
--- a/stack/include/sk_route.h
+++ b/stack/include/sk_route.h
@@ -3,6 +3,7 @@
#include <netinet/in.h>
#include <sk_device.h>
+#include <rte_ether.h>
struct sk_route_tbl;
@@ -18,10 +19,13 @@ int route_tbl_insert(struct sk_route_tbl * tbl_object, struct in_addr in_addr,
struct sk_dev_info * route_tbl_lookup(struct sk_route_tbl * tbl_object, struct in_addr in_addr,
char * result_is_gateway);
-
/* Ŀ����Ϣ���� */
struct sk_destinfo
{
+ /* Դ�˿ں� */
+ in_port_t s_trans_port;
+ /* Ŀ�Ķ˿ں� */
+ in_port_t d_trans_port;
/* ԴIP��ַ */
struct in_addr s_in_addr;
/* Ŀ��IP��ַ */
diff --git a/stack/include/sk_stack.h b/stack/include/sk_stack.h
index d862fd0..4b3b19b 100644
--- a/stack/include/sk_stack.h
+++ b/stack/include/sk_stack.h
@@ -79,7 +79,7 @@ struct sk_instance * sk_instance_create(struct mr_core_instance * core_instance,
struct sk_app_instance * sk_app_instance_create(struct sk_instance * instance, const char* appsym);
int sk_serv_device_rx_bulk(struct sk_dev_desc * dev_desc, thread_id_t sid,
- struct rte_mbuf * mbufs_in[], struct rte_mbuf * mbufs_out[], int nr_mbufs_in, int * nr_mbufs_out);
+ struct rte_mbuf * mbufs_in[], int nr_mbufs_in);
-int sk_serv_device_tx_bulk(struct sk_dev_desc * dev_desc, thread_id_t sid,
+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); \ No newline at end of file
diff --git a/stack/include/sk_protocol_tcp.h b/stack/include/sk_tcp.h
index 9db4f2b..9db4f2b 100644
--- a/stack/include/sk_protocol_tcp.h
+++ b/stack/include/sk_tcp.h
diff --git a/stack/include/sk_protocol_udp.h b/stack/include/sk_udp.h
index 50c7c1f..ac61e9e 100644
--- a/stack/include/sk_protocol_udp.h
+++ b/stack/include/sk_udp.h
@@ -3,5 +3,5 @@
#include <rte_mbuf.h>
#include <sk_device.h>
-void protocol_serv_udp_entry(struct sk_dev_desc* dev_desc,
+int protocol_serv_udp_entry(struct sk_dev_desc* dev_desc,
thread_id_t sid, struct rte_mbuf* mbufs_in[], int nr_mbufs_in); \ No newline at end of file
diff --git a/stack/src/protocol-arp.c b/stack/src/arp.c
index 74e9379..74e9379 100644
--- a/stack/src/protocol-arp.c
+++ b/stack/src/arp.c
diff --git a/stack/src/protocol-icmp.c b/stack/src/icmp.c
index ba9584b..630e70c 100644
--- a/stack/src/protocol-icmp.c
+++ b/stack/src/icmp.c
@@ -77,4 +77,4 @@ int protocol_serv_icmp_entry(struct sk_dev_desc* dev_desc, thread_id_t sid,
}
return handled_packets;
-}
+} \ No newline at end of file
diff --git a/stack/src/ip.c b/stack/src/ip.c
index d8f6004..73c8455 100644
--- a/stack/src/ip.c
+++ b/stack/src/ip.c
@@ -17,7 +17,18 @@ uint16_t __get_ip_counter(struct sk_app_instance * app_instance, struct sk_desti
return rte_atomic16_add_return(&app_instance->instance->ip_counter, 1);
}
-void sk_ip_packet_construct(struct sk_app_instance * app_instance, struct rte_mbuf * mbuf,
+struct sk_packet_info
+{
+ struct ether_addr s_ether_addr;
+ struct ether_addr d_ether_addr;
+ struct in_addr s_in_addr;
+ struct in_addr d_in_addr;
+ in_port_t s_in_port;
+ in_port_t d_in_port;
+};
+
+
+int sk_ip_packet_construct(struct sk_app_instance * app_instance, struct rte_mbuf * mbuf,
struct sk_destinfo * destinfo, uint8_t l4_proto)
{
struct ipv4_hdr * ip_hdr = (struct ipv4_hdr *)rte_pktmbuf_prepend(mbuf, sizeof(struct ipv4_hdr));
@@ -46,5 +57,5 @@ void sk_ip_packet_construct(struct sk_app_instance * app_instance, struct rte_mb
ether_addr_copy(&destinfo->s_eth_addr, &ether_hdr->s_addr);
ether_addr_copy(&destinfo->d_eth_addr, &ether_hdr->d_addr);
ether_hdr->ether_type = rte_cpu_to_be_16(ETHER_TYPE_IPv4);
- return;
+ return 0;
} \ No newline at end of file
diff --git a/stack/src/neigh.c b/stack/src/neigh.c
index 377ec38..a7ab285 100644
--- a/stack/src/neigh.c
+++ b/stack/src/neigh.c
@@ -21,7 +21,7 @@
#include <errno.h>
#include <assert.h>
#include <sk_neigh.h>
-#include "sk_protocol_arp.h"
+#include <sk_arp.h>
enum neigh_state
{
diff --git a/stack/src/protocol-common.c b/stack/src/pcom.c
index b16079d..0683822 100644
--- a/stack/src/protocol-common.c
+++ b/stack/src/pcom.c
@@ -2,7 +2,7 @@
#include <mr_rtdev.h>
#include <sk_device.h>
#include <sk_stack.h>
-#include <sk_protocol_common.h>
+#include <sk_pcom.h>
// ����Э���ʼ��������������Ӧ������ʱ�豸��
int protocol_common_dev_desc_init(struct sk_instance * instance,
diff --git a/stack/src/protocol-udp.c b/stack/src/protocol-udp.c
deleted file mode 100644
index adf2c12..0000000
--- a/stack/src/protocol-udp.c
+++ /dev/null
@@ -1,9 +0,0 @@
-
-#include <sk_device.h>
-#include <sk_stack.h>
-
-void protocol_serv_udp_entry(struct sk_dev_desc* dev_desc,
- thread_id_t sid, struct rte_mbuf* mbufs_in[], int nr_mbufs_in)
-{
- return;
-} \ No newline at end of file
diff --git a/stack/src/route.c b/stack/src/route.c
index 6afabdc..d62aa1d 100644
--- a/stack/src/route.c
+++ b/stack/src/route.c
@@ -135,7 +135,7 @@ struct sk_destinfo * sk_destinfo_create_by_route(struct sk_app_instance * app_in
inet_ntop(AF_INET, &d_in_addr, str_in_addr, sizeof(str_in_addr));
struct in_addr query_in_addr = d_in_addr;
- struct ether_addr d_eth_addr = {0};
+ struct ether_addr d_eth_addr = { {0} };
struct sk_dev_info * dev_info = NULL;
struct sk_dev_desc * dev_desc = NULL;
diff --git a/stack/src/rxtx.c b/stack/src/rxtx.c
index d71e4eb..ded77d0 100644
--- a/stack/src/rxtx.c
+++ b/stack/src/rxtx.c
@@ -10,10 +10,10 @@
#include <assert.h>
#include <sk_device.h>
#include <sk_stack.h>
-#include <sk_protocol_udp.h>
-#include <sk_protocol_arp.h>
-#include <sk_protocol_tcp.h>
-#include <sk_protocol_icmp.h>
+#include <sk_udp.h>
+#include <sk_arp.h>
+#include <sk_tcp.h>
+#include <sk_icmp.h>
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)
@@ -29,25 +29,17 @@ int sk_serv_device_tx_bulk(struct sk_dev_desc * dev_desc, thread_id_t sid,
}
int sk_serv_device_rx_bulk(struct sk_dev_desc * dev_desc, thread_id_t sid,
- struct rte_mbuf * mbufs_in[], struct rte_mbuf * mbufs_out[], int nr_mbufs_in, int * nr_mbufs_out)
+ struct rte_mbuf * mbufs_in[], int nr_mbufs_in)
{
// ARP���Ĵ���
- int nr_handled;
- nr_handled = protocol_serv_arp_entry(dev_desc, sid, mbufs_in, nr_mbufs_in);
+ int nr_handled = 0;
+ nr_handled += protocol_serv_arp_entry(dev_desc, sid, mbufs_in, nr_mbufs_in);
// ICMP���Ĵ���
nr_handled += protocol_serv_icmp_entry(dev_desc, sid, mbufs_in, nr_mbufs_in);
-
-#if 0
- // TCP���Ĵ���
- protocol_serv_tcp_entry(dev_desc, sid, packets[__PACKET_TYPE_TCP].packets,
- packets[__PACKET_TYPE_TCP].nr_packets);
-
// UDP���Ĵ���
- protocol_serv_udp_entry(dev_desc, sid, packets[__PACKET_TYPE_UDP].packets,
- packets[__PACKET_TYPE_UDP].nr_packets);
+ nr_handled += protocol_serv_udp_entry(dev_desc, sid, mbufs_in, nr_mbufs_in);
-#endif
- return 0;
+ return nr_handled;
} \ No newline at end of file
diff --git a/stack/src/protocol-tcp.c b/stack/src/tcp.c
index 138e81d..57ebebf 100644
--- a/stack/src/protocol-tcp.c
+++ b/stack/src/tcp.c
@@ -1,5 +1,5 @@
#include <mr_common.h>
-#include <sk_protocol_tcp.h>
+#include <sk_tcp.h>
void protocol_serv_tcp_entry(struct sk_dev_desc* dev_desc,
thread_id_t sid, struct rte_mbuf* mbufs_in[], int nr_mbufs_in)
diff --git a/stack/src/udp.c b/stack/src/udp.c
new file mode 100644
index 0000000..5b5e93f
--- /dev/null
+++ b/stack/src/udp.c
@@ -0,0 +1,107 @@
+
+#include <mr_rtdev.h>
+#include <mr_vnode.h>
+#include <sk_device.h>
+#include <sk_stack.h>
+#include <rte_udp.h>
+#include <mr_common.h>
+#include <rte_ip.h>
+#include <sk_ip.h>
+
+int protocol_serv_udp_entry(struct sk_dev_desc * dev_desc,
+ thread_id_t sid, struct rte_mbuf* mbufs_in[], int nr_mbufs_in)
+{
+ return 0;
+}
+
+int protocol_serv_udp_drain(struct sk_dev_desc * dev_desc,
+ thread_id_t sid, struct rte_mbuf * mbuf_out[], int nr_mbufs_max)
+{
+ int nr_drain = 0;
+ struct rtdev_desc * rtdev_desc = dev_desc->udp_device;
+ assert(dev_desc != NULL);
+
+ nr_drain += vnode_dequeue_burst(rtdev_desc->vnode_cons_ftx, &rtdev_desc->ops,
+ sid, (void **)&mbuf_out[nr_drain], nr_mbufs_max - nr_drain);
+
+ nr_drain += vnode_dequeue_burst(rtdev_desc->vnode_cons_tx, &rtdev_desc->ops,
+ sid, (void **)&mbuf_out[nr_drain], nr_mbufs_max - nr_drain);
+
+ assert(nr_mbufs_max >= nr_drain);
+ return nr_drain;
+}
+
+int sk_udp_segment_construct(struct sk_destinfo * destinfo, struct rte_mbuf * mbuf)
+{
+ struct udp_hdr * udp_hdr = (struct udp_hdr *)rte_pktmbuf_prepend(mbuf, sizeof(struct udp_hdr));
+ assert(udp_hdr != NULL);
+
+ unsigned int l4_len = rte_pktmbuf_pkt_len(mbuf);
+ udp_hdr->src_port = destinfo->s_trans_port;
+ udp_hdr->dst_port = destinfo->d_trans_port;
+ udp_hdr->dgram_len = htonl(l4_len);
+ udp_hdr->dgram_cksum = 0;
+
+ // Ӳ��У���Offload��־
+ mbuf->tx_offload = 0;
+ mbuf->l4_len = sizeof(struct udp_hdr);
+ mbuf->ol_flags |= PKT_TX_UDP_CKSUM;
+
+ // ����αͷ��У��ͣ�Ӳ��Offload��Ҫαͷ��У���
+ struct ipv4_psd_header {
+ uint32_t src_addr; /* IP address of source host. */
+ uint32_t dst_addr; /* IP address of destination host. */
+ uint8_t zero; /* zero. */
+ uint8_t proto; /* L4 protocol type. */
+ uint16_t len; /* L4 length. */
+ } psd_hdr;
+
+ psd_hdr.src_addr = destinfo->s_in_addr.s_addr;
+ psd_hdr.dst_addr = destinfo->d_in_addr.s_addr;
+ psd_hdr.proto = IPPROTO_UDP;
+ psd_hdr.len = htons(l4_len);
+ udp_hdr->dgram_cksum = rte_raw_cksum(&psd_hdr, sizeof(psd_hdr));
+ return 0;
+}
+
+int sk_udp_send_burst(struct sk_app_instance * app_instance, thread_id_t sid,
+ struct sk_destinfo * destinfo, struct rte_mbuf * mbuf[], unsigned int nr_mbuf,
+ unsigned char is_fast)
+{
+ struct sk_dev_desc * dev_desc = destinfo->d_dev_desc;
+ struct rte_mbuf * header[MR_BURST_MAX];
+ hash_t hash[MR_BURST_MAX];
+
+ assert(nr_mbuf <= MR_BURST_MAX);
+
+ for (int i = 0; i < nr_mbuf; i++)
+ {
+ header[i] = rte_pktmbuf_alloc(dev_desc->direct_pool);
+ if (unlikely(header[i] == NULL)) goto errout;
+
+ int ret = rte_pktmbuf_chain(header[i], mbuf[i]);
+ assert(ret >= 0);
+
+ sk_udp_segment_construct(destinfo, header[i]);
+ sk_ip_packet_construct(app_instance, header[i], destinfo, IPPROTO_UDP);
+ }
+
+ struct vnode_prod * prod;
+ if (is_fast) prod = dev_desc->udp_app_device->vnode_prod_ftx;
+ else prod = dev_desc->udp_app_device->vnode_prod_tx;
+
+ // TODO: ��ϣ�㷨�Ľ�
+ hash_t _hash = destinfo->s_trans_port ^ destinfo->d_trans_port;
+ for (int i = 0; i < nr_mbuf; i++) hash[i] = _hash;
+
+ vnode_enqueue_burst_with_hash(prod, &dev_desc->udp_app_device->ops, sid,
+ (void **)&header, hash, nr_mbuf);
+
+errout: // TODO: �������
+ for(int i = 0; i < nr_mbuf; i++)
+ {
+ if (header[i] != NULL) rte_pktmbuf_free(header[i]);
+ }
+
+ return -1;
+} \ No newline at end of file