summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/src/monit.c2
-rw-r--r--app/src/neigh.c1
-rw-r--r--service/src/phydev.c1
-rw-r--r--tunnat/include/tunnel.h37
-rw-r--r--tunnat/src/tunnel.cc27
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);