diff options
| author | Qiuwen Lu <[email protected]> | 2016-11-29 09:57:46 +0800 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2016-11-29 09:57:46 +0800 |
| commit | 00c89c6402cc2c7dd31855374a8ac00cc47224fa (patch) | |
| tree | 060692d60dee4c8cf4196ad1cf6d884191a9123d | |
| parent | 4b9e986df676ba61517a582da8bb9f459da86fbc (diff) | |
变更协议处理部分文件名称,完成UDP出站路径协议处理部分功能。
| -rw-r--r-- | core/src/buffer.c | 1 | ||||
| -rw-r--r-- | include/mr_common.h | 1 | ||||
| -rw-r--r-- | service/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | service/src/rxtx.c | 8 | ||||
| -rw-r--r-- | stack/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | stack/include/sk_arp.h (renamed from stack/include/sk_protocol_arp.h) | 0 | ||||
| -rw-r--r-- | stack/include/sk_device.h | 5 | ||||
| -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.h | 6 | ||||
| -rw-r--r-- | stack/include/sk_stack.h | 4 | ||||
| -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.c | 15 | ||||
| -rw-r--r-- | stack/src/neigh.c | 2 | ||||
| -rw-r--r-- | stack/src/pcom.c (renamed from stack/src/protocol-common.c) | 2 | ||||
| -rw-r--r-- | stack/src/protocol-udp.c | 9 | ||||
| -rw-r--r-- | stack/src/route.c | 2 | ||||
| -rw-r--r-- | stack/src/rxtx.c | 26 | ||||
| -rw-r--r-- | stack/src/tcp.c (renamed from stack/src/protocol-tcp.c) | 2 | ||||
| -rw-r--r-- | stack/src/udp.c | 107 |
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, ðer_hdr->s_addr); ether_addr_copy(&destinfo->d_eth_addr, ðer_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 |
