diff options
| author | Qiuwen Lu <[email protected]> | 2017-09-18 14:28:18 +0800 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2017-09-18 14:28:18 +0800 |
| commit | 2b9b23b50e15ef9ab8c4ab84987c0044e600b82f (patch) | |
| tree | 571e4a18977d9cccf22443da5a407853a0511fba | |
| parent | 89818554f1460f95469feeeffa3103fa935ef71c (diff) | |
增加HDLC、PPP支持;修正Neigh表在SMP架构上初始化的问题;v4.2.17-20170918
- 增加Tunnat对HDLC、PPP内层封装报文的解析和构建功能;
- 修正Neigh表在SMP架构上初始化失败的问题。原实现没有指定Hash表使用的内存的NUMA节点,在memset时填充为0。在非NUMA架构上,NUMA0节点上可能没有内存,导致初始化失败。
- 修正部分笔误。
| -rw-r--r-- | app/src/monit.c | 2 | ||||
| -rw-r--r-- | app/src/neigh.c | 1 | ||||
| -rw-r--r-- | service/src/phydev.c | 1 | ||||
| -rw-r--r-- | tunnat/include/tunnel.h | 37 | ||||
| -rw-r--r-- | tunnat/src/tunnel.cc | 27 |
5 files changed, 52 insertions, 16 deletions
diff --git a/app/src/monit.c b/app/src/monit.c index 46fc515..7fce98f 100644 --- a/app/src/monit.c +++ b/app/src/monit.c @@ -30,7 +30,7 @@ int vdev_instance_stats_get(struct vdev_instance * vdi, struct vdev_stat_info * stat_info->tx_on_line[i] = rte_atomic64_read(&st_prod_tx[i].on_line); stat_info->tx_deliver[i] = rte_atomic64_read(&st_prod_tx[i].deliver); stat_info->tx_missed[i] = rte_atomic64_read(&st_prod_tx[i].missed); - stat_info->tx_total_len[i] = rte_atomic16_read(&st_prod_tx[i].total_len); + stat_info->tx_total_len[i] = rte_atomic64_read(&st_prod_tx[i].total_len); stat_info->ftx_on_line[i] = rte_atomic64_read(&st_prod_ftx[i].on_line); stat_info->ftx_deliver[i] = rte_atomic64_read(&st_prod_ftx[i].deliver); diff --git a/app/src/neigh.c b/app/src/neigh.c index 18536c4..bb7aa30 100644 --- a/app/src/neigh.c +++ b/app/src/neigh.c @@ -80,6 +80,7 @@ int neighbour_mamanger_init(struct neighbour_manager * object, .key_len = sizeof(struct in_addr), .hash_func = NULL, .hash_func_init_val = 0, + .socket_id = SOCKET_ID_ANY }; /* 检查是否存在以前的哈希表 */ diff --git a/service/src/phydev.c b/service/src/phydev.c index 35a7bbe..22bf4c5 100644 --- a/service/src/phydev.c +++ b/service/src/phydev.c @@ -3,6 +3,7 @@ #include <sys/queue.h> #include <assert.h> #include <stdio.h> +#include <unistd.h> #include <rte_malloc.h> #include <rte_pci.h> diff --git a/tunnat/include/tunnel.h b/tunnat/include/tunnel.h index 1ccbdf4..654120e 100644 --- a/tunnat/include/tunnel.h +++ b/tunnat/include/tunnel.h @@ -154,7 +154,10 @@ public: std::swap<ether_addr>(ether_hdr_.s_addr, ether_hdr_.d_addr); } - static int PacketForwardModify(const char * pkt, unsigned int pkt_len); + static int PacketForwardModify(const char * pkt, unsigned int pkt_len) + { + return 0; + } }; class TunInnerIPv4 : public Tunnel @@ -192,16 +195,48 @@ class TunInnerPPP : public Tunnel { public: int PacketParse(const char * pkt, unsigned int pkt_len); + int PacketConstruct(const char * pkt, unsigned int pkt_len) + { + *(uint32_t *)pkt = ppp_header_;
+ return 0; + } + + static int PacketForwardModify(const char * pkt, unsigned int pkt_len) + { + return 0; + } + void ReverseAddress() { return; } + +protected: + uint32_t ppp_header_; }; class TunInnerHDLC : public Tunnel { public: int PacketParse(const char * pkt, unsigned int pkt_len); + int PacketConstruct(const char * pkt, unsigned int pkt_len) + { + *(uint32_t *)pkt = hdlc_header_;
+ return 0; + } + + static int PacketForwardModify(const char * pkt, unsigned int pkt_len) + { + return 0; + } + + void ReverseAddress() + { + return; + } + +protected: + uint32_t hdlc_header_; }; class TunnelContainer diff --git a/tunnat/src/tunnel.cc b/tunnat/src/tunnel.cc index 50fa84a..f78136e 100644 --- a/tunnat/src/tunnel.cc +++ b/tunnat/src/tunnel.cc @@ -254,7 +254,6 @@ l3: int TunInnerEther::PacketConstruct(const char * pkt, unsigned int pkt_len) { - struct ether_hdr * eth_hdr = (struct ether_hdr *)pkt; *eth_hdr = ether_hdr_; @@ -278,12 +277,6 @@ int TunInnerEther::PacketConstruct(const char * pkt, unsigned int pkt_len) return RT_ERR; } -int TunInnerEther::PacketForwardModify(const char * pkt, unsigned int pkt_len) -{ - // 内层以太网转发时什么也不做 - return 0; -} - int TunInnerPPP::PacketParse(const char * pkt, unsigned int pkt_len) { switch (PPP_PROTOCOL(pkt)) @@ -298,13 +291,13 @@ int TunInnerPPP::PacketParse(const char * pkt, unsigned int pkt_len) return RT_ERR; } + ppp_header_ = *(const uint32_t *)pkt; this_layer_type = TUNNEL_TYPE_PPP; this_layer_length = PPP_HDRLEN; - TUNNAT_THREAD_STAT_ADD(TUNNAT_STAT_INNER_PPP_INPUT, 1); return 0; -} - +}
+
int TunnelContainer::PacketParse(const char * pkt, unsigned int pkt_len, tunnel_type tunnel_type) { @@ -482,19 +475,25 @@ int TunInnerIPv6::GetAddressInfo(AddressInfo & addr_info) int TunInnerHDLC::PacketParse(const char * pkt, unsigned int pkt_len) { - switch (PPP_PROTOCOL(pkt)) + uint16_t hdlc_proto = *(const uint16_t *)(pkt + 2); + + /* HDLC的协议字段与以太网的类似,对于IPv4,为0x0800 */ + switch (ntohs(hdlc_proto)) { - case PPP_IP: + case ETHER_TYPE_IPv4: next_layer_type = TUNNEL_TYPE_IPV4; break; - case PPP_IPV6: + case ETHER_TYPE_IPv6: next_layer_type = TUNNEL_TYPE_IPV6; break; + + /* 其他协议不处理,只处理IPv4和IPv6*/ default: return RT_ERR; } - this_layer_length = PPP_HDRLEN; + hdlc_header_ = *(const uint32_t *)pkt; + this_layer_length = 4; this_layer_type = TUNNEL_TYPE_HDLC; TUNNAT_THREAD_STAT_ADD(TUNNAT_STAT_INNER_HDLC_INPUT, 1); |
