summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlijia <[email protected]>2021-12-14 17:53:18 +0800
committerlijia <[email protected]>2021-12-14 17:53:18 +0800
commit153e1673bc596fb545258db224ec9e84a1c8e455 (patch)
tree6d2bbd628ece780d1e79dbab9796ab455e099c99
parent1a0555a13985768c7d334af617ccb0b57972f789 (diff)
TSG-9029, 修复inline模式非对称链路注入数据包vxlan地址错误.v4.2.71
-rw-r--r--include/public/stream_inc/stream_base.h10
-rw-r--r--src/common/stream_addr_inet.c26
-rw-r--r--src/dealpkt/deal_vxlan.c21
-rw-r--r--src/dealpkt/stream_manage.c20
-rw-r--r--src/packet_io/sendpacket.c87
5 files changed, 149 insertions, 15 deletions
diff --git a/include/public/stream_inc/stream_base.h b/include/public/stream_inc/stream_base.h
index f7d8dea..d4b3fa7 100644
--- a/include/public/stream_inc/stream_base.h
+++ b/include/public/stream_inc/stream_base.h
@@ -369,15 +369,23 @@ struct layer_addr_mac_in_mac
UCHAR inner_src_mac[MAC_ADDR_LEN]; /* �ڲ�mac��ַ, network order */
};
-struct layer_addr_vxlan
+struct single_layer_addr_vxlan
{
UINT16 vlan_id; /* network order */
+ UCHAR flag;
UCHAR dir;
UCHAR link_id;
UCHAR link_type;
};
+struct layer_addr_vxlan
+{
+ struct single_layer_addr_vxlan C2S_vxlan_addr;
+ struct single_layer_addr_vxlan S2C_vxlan_addr;
+};
+
+
struct layer_addr
{
UCHAR addrtype; /* definition in enum addr_type_t */
diff --git a/src/common/stream_addr_inet.c b/src/common/stream_addr_inet.c
index 606e3ff..be9a632 100644
--- a/src/common/stream_addr_inet.c
+++ b/src/common/stream_addr_inet.c
@@ -824,6 +824,8 @@ err:
}
/* vxlan��ַ��ʽ: vlan_id-dir-link_id-link_type*/
+
+/* TODO: ����������ת�� */
static int __addr_vxlan_pton(char *addr_str, addr_continuous_bin_t *addr_bin_val)
{
char *vxlan_struct_item;
@@ -835,31 +837,34 @@ static int __addr_vxlan_pton(char *addr_str, addr_continuous_bin_t *addr_bin_val
addr_bin_val->stream.addr.addrlen = sizeof(struct layer_addr_vxlan);
addr_bin_val->stream.addr.paddr = addr_bin_val->addr_value;
+ /* C2S addr */
vxlan_struct_item = strtok_r(addr_str, delim, &save_ptr);
if(NULL == vxlan_struct_item){
return -1;
}
- vxlan_bin_addr->vlan_id = strtol(vxlan_struct_item, NULL, 10);
+ vxlan_bin_addr->C2S_vxlan_addr.vlan_id = strtol(vxlan_struct_item, NULL, 10);
vxlan_struct_item = strtok_r(NULL, delim, &save_ptr);
if(NULL == vxlan_struct_item){
return -1;
}
- vxlan_bin_addr->dir = strtol(vxlan_struct_item, NULL, 10);
+ vxlan_bin_addr->C2S_vxlan_addr.dir = strtol(vxlan_struct_item, NULL, 10);
vxlan_struct_item = strtok_r(NULL, delim, &save_ptr);
if(NULL == vxlan_struct_item){
return -1;
}
- vxlan_bin_addr->link_id = strtol(vxlan_struct_item, NULL, 10);
+ vxlan_bin_addr->C2S_vxlan_addr.link_id = strtol(vxlan_struct_item, NULL, 10);
vxlan_struct_item = strtok_r(NULL, delim, &save_ptr);
if(NULL == vxlan_struct_item){
return -1;
}
- vxlan_bin_addr->link_type = strtol(vxlan_struct_item, NULL, 10);
+ vxlan_bin_addr->C2S_vxlan_addr.link_type = strtol(vxlan_struct_item, NULL, 10);
+ /* TODO: S2C addr */
+ //////////////////////
return 0;
}
@@ -1690,14 +1695,21 @@ static int __addr_openvpn_n2p_fun(const struct layer_addr *paddr, char *buf, int
return strlen(buf) + 1;
}
-
+/*
+ ��ʽ:
+ <C2S_addr, S2C_addr>,
+ addr��ϸ��ʽ:
+ <vlan_id-dir-linkid-linktype, vlan_id-dir-linkid-link-type>
+*/
static int __addr_vxlan_n2p_fun(const struct layer_addr *paddr, char *buf, int buf_len)
{
- const struct layer_addr_vxlan *vxlan_addr = paddr->vxlan;
+ const struct single_layer_addr_vxlan *single_vxlan_addr = &paddr->vxlan->C2S_vxlan_addr;
int addr_len;
+ /* TODO: ����������ת�� */
+
/* ��vxlan�ṹ��˳������ */
- snprintf(buf, buf_len, "%u-%u-%u-%u", vxlan_addr->vlan_id, vxlan_addr->dir, vxlan_addr->link_id, vxlan_addr->link_type);
+ snprintf(buf, buf_len, "%u-%u-%u-%u", single_vxlan_addr->vlan_id, single_vxlan_addr->dir, single_vxlan_addr->link_id, single_vxlan_addr->link_type);
addr_len = strlen(buf) + 1; //add EOF
diff --git a/src/dealpkt/deal_vxlan.c b/src/dealpkt/deal_vxlan.c
index 7ab8ddf..67e3b33 100644
--- a/src/dealpkt/deal_vxlan.c
+++ b/src/dealpkt/deal_vxlan.c
@@ -11,16 +11,17 @@ int set_vxlan_addr(const void *this_layer_hdr, struct layer_addr_vxlan_private *
const inline_vxlan_hdr_t *vxlan_hdr = (inline_vxlan_hdr_t *)this_layer_hdr;
- addr_pr->addr_public.dir = vxlan_hdr->dir;
- addr_pr->addr_public.link_id = vxlan_hdr->link_id;
- addr_pr->addr_public.link_type = vxlan_hdr->link_layer_type;
+ addr_pr->addr_public.C2S_vxlan_addr.dir = vxlan_hdr->dir;
+ addr_pr->addr_public.C2S_vxlan_addr.link_id = vxlan_hdr->link_id;
+ addr_pr->addr_public.C2S_vxlan_addr.link_type = vxlan_hdr->link_layer_type;
vlan_id_high = vxlan_hdr->vlan_id_half_high;
vlan_id_low = vxlan_hdr->vlan_id_half_low;
- addr_pr->addr_public.vlan_id = htons((vlan_id_high<<4) | vlan_id_low);
+ addr_pr->addr_public.C2S_vxlan_addr.vlan_id = htons((vlan_id_high<<4) | vlan_id_low);
+ addr_pr->addr_public.C2S_vxlan_addr.flag = vxlan_hdr->flags;
addr_pr->actual_total_len = sizeof(inline_vxlan_hdr_t);
- switch(addr_pr->addr_public.link_type){
+ switch(addr_pr->addr_public.C2S_vxlan_addr.link_type){
case VXLAN_ENCAP_HDLC:
{
const struct hdlc_net_hdr *net_hdlc_hdr = (struct hdlc_net_hdr *)((char *)this_layer_hdr + sizeof(inline_vxlan_hdr_t));
@@ -83,13 +84,19 @@ int vxlan_entry(struct streaminfo_private *pfstream_pr,const void *this_layer_hd
pstream->routedir=routedir;
pstream->threadnum=thread_num;
+ if(g_asymmetric_addr_layer_set.layer_type_index[ADDR_TYPE_VXLAN][pstream_pr->layer_index] != 0){
+ pstream_pr->need_update_opposite_addr = 1;//两侧地址不一样,需要更新对侧信息
+ }else{
+ pstream_pr->need_update_opposite_addr = 0;
+ }
+
/*
vxlan ppp和hdlc字段基本不变, 不像ethernet, 涉及到反向发包, 要将mac地址颠倒方向.
所以不再创建一个新的streaminfo结构, 浪费内存也耗费CPU, 意义不大,
将hdlc, ppp的字段和vxlan合并, 类似ip层和tcp/udp的关系一样.
*/
- switch(addr_pr.addr_public.link_type){
+ switch(addr_pr.addr_public.C2S_vxlan_addr.link_type){
case VXLAN_ENCAP_ETH:
ret = eth_entry(pstream_pr,next_layer_data,thread_num,routedir,raw_pkt, next_layer_offset);
break;
@@ -125,7 +132,7 @@ int vxlan_entry(struct streaminfo_private *pfstream_pr,const void *this_layer_hd
default:
local_sys_stat->count[SAPP_STAT_RCV_UNKNOWN]++;
local_sys_stat->length[SAPP_STAT_RCV_UNKNOWN]+=raw_pkt->raw_pkt_len;
- sapp_runtime_log(RLOG_LV_INFO, "vxlan etnry: unsupport link type:%d\n", addr_pr.addr_public.link_type);
+ sapp_runtime_log(RLOG_LV_INFO, "vxlan etnry: unsupport link type:%d\n", addr_pr.addr_public.C2S_vxlan_addr.link_type);
ret = PASS;
break;
}
diff --git a/src/dealpkt/stream_manage.c b/src/dealpkt/stream_manage.c
index 758b89c..413cdcf 100644
--- a/src/dealpkt/stream_manage.c
+++ b/src/dealpkt/stream_manage.c
@@ -2826,6 +2826,26 @@ void update_opposite_addr_info(struct streaminfo_private *top_stream_pr, struct
}
break;
+ case ADDR_TYPE_VXLAN:
+ {
+ if(ADDR_TYPE_VXLAN == pstream_pr->stream_public.addr.addrtype){
+ if(cur_dir == DIR_C2S){
+ memcpy(&pstream_pr->stream_public.addr.vxlan->C2S_vxlan_addr,
+ &p_stack->stream_public.addr.vxlan->C2S_vxlan_addr,
+ sizeof(p_stack->stream_public.addr.vxlan->C2S_vxlan_addr));
+ }
+ else{
+ memcpy(&pstream_pr->stream_public.addr.vxlan->S2C_vxlan_addr,
+ &p_stack->stream_public.addr.vxlan->C2S_vxlan_addr, //ע��, ����̶���src����!!
+ sizeof(p_stack->stream_public.addr.vxlan->S2C_vxlan_addr));
+ }
+ }else{
+ sapp_runtime_log(RLOG_LV_INFO, "update_opposite_addr_info() error, current addrtype is vxlan, but pstream->addrtype is not vxlan!");
+ }
+
+ }
+ break;
+
default:
/* ����Э��㲻�漰C2S, S2C���������ַ�ǶԳ����� */
break;
diff --git a/src/packet_io/sendpacket.c b/src/packet_io/sendpacket.c
index 5508185..56a8d2d 100644
--- a/src/packet_io/sendpacket.c
+++ b/src/packet_io/sendpacket.c
@@ -1893,6 +1893,7 @@ static int build_net_layer_ppp(struct streaminfo_private *stream_pr, int carry_l
return ppp_hdr_len;
}
+#if 0
static int build_net_layer_vxlan(struct streaminfo_private *stream_pr, int carry_layer_type,
int carry_layer_len, unsigned char *buf, UCHAR send_stream_dir, const raw_pkt_t *raw_pkt, const struct layer_addr_vxlan_private *raw_vxlan_hdr)
{
@@ -1929,7 +1930,93 @@ static int build_net_layer_vxlan(struct streaminfo_private *stream_pr, int carry
return raw_vxlan_hdr->actual_total_len;
}
+#else
+
+static void build_net_single_layer_vxlan(struct streaminfo_private *stream_pr, inline_vxlan_hdr_t *send_vxlan_hdr, const struct layer_addr_vxlan_private *raw_vxlan_hdr, UCHAR send_stream_dir)
+{
+ const struct single_layer_addr_vxlan *single_addr;
+
+ if(DIR_C2S == send_stream_dir){
+ single_addr = &raw_vxlan_hdr->addr_public.C2S_vxlan_addr;
+ }else{
+ single_addr = &raw_vxlan_hdr->addr_public.S2C_vxlan_addr;
+ }
+
+ memset(send_vxlan_hdr, 0, sizeof(inline_vxlan_hdr_t));
+ send_vxlan_hdr->flags = 0x08;
+ send_vxlan_hdr->vlan_id_half_high = ntohs(single_addr->vlan_id) >> 4;
+ send_vxlan_hdr->vlan_id_half_low = ntohs(single_addr->vlan_id) & 0xF;
+ send_vxlan_hdr->link_layer_type = single_addr->link_type;
+ send_vxlan_hdr->link_id = single_addr->link_id;
+
+ if(DIR_C2S == send_stream_dir){
+ send_vxlan_hdr->dir = stream_pr->stream_c2s_route_dir;
+ }else{
+ send_vxlan_hdr->dir = stream_pr->stream_c2s_route_dir ^ 1;
+ }
+
+}
+
+static int build_net_layer_vxlan(struct streaminfo_private *stream_pr, int carry_layer_type,
+ int carry_layer_len, unsigned char *buf, UCHAR send_stream_dir, const raw_pkt_t *raw_pkt, const struct layer_addr_vxlan_private *raw_vxlan_hdr)
+
+{
+ const struct layer_addr_vxlan *in_stream_addr;
+ inline_vxlan_hdr_t *send_vxlan_hdr = (inline_vxlan_hdr_t *)buf;
+
+ in_stream_addr = (struct layer_addr_vxlan *)(stream_pr->stream_public.addr.vxlan);
+
+ if(DIR_C2S == send_stream_dir){
+ if(in_stream_addr->C2S_vxlan_addr.flag != 0){
+ build_net_single_layer_vxlan(stream_pr, send_vxlan_hdr, raw_vxlan_hdr, send_stream_dir);
+ }else{
+ /* ����û�е�ַ, ȡ���������ļ�asymmetric_addr_layer�Ƿ�����öԲ��ַ */
+ if(0 == g_asymmetric_addr_layer_set.layer_type_index[ADDR_TYPE_VXLAN][stream_pr->layer_index]){
+ build_net_single_layer_vxlan(stream_pr, send_vxlan_hdr, raw_vxlan_hdr, send_stream_dir ^ DIR_DOUBLE);
+ }else{
+ sapp_global_val->mthread_volatile[stream_pr->stream_public.threadnum]->sys_stat.count[SAPP_STAT_SND_ERROR]++;
+ sapp_runtime_log(RLOG_LV_INFO, "build_net_layer_vxlan() error, no c2s vxlan addr, but asymmetric_addr_layer is set!\n");
+ return -1;
+ }
+ }
+ }else{
+ if(in_stream_addr->S2C_vxlan_addr.flag > 0){
+ build_net_single_layer_vxlan(stream_pr, send_vxlan_hdr, raw_vxlan_hdr, send_stream_dir);
+ }else{
+ /* ����û�е�ַ, ȡ���������ļ�asymmetric_addr_layer�Ƿ�����öԲ��ַ */
+ if(0 == g_asymmetric_addr_layer_set.layer_type_index[ADDR_TYPE_VXLAN][stream_pr->layer_index]){
+ build_net_single_layer_vxlan(stream_pr, send_vxlan_hdr, raw_vxlan_hdr, send_stream_dir ^ DIR_DOUBLE);
+ }else{
+ sapp_global_val->mthread_volatile[stream_pr->stream_public.threadnum]->sys_stat.count[SAPP_STAT_SND_ERROR]++;
+ sapp_runtime_log(RLOG_LV_INFO, "build_net_layer_vxlan() error, no s2c vxlan addr, but asymmetric_addr_layer is set!\n");
+ return -1;
+ }
+ }
+ }
+
+ /*
+ TODO: ppp, hdlc��Ҳ��c2s, s2c��������洢.
+ */
+ if(VXLAN_ENCAP_HDLC == raw_vxlan_hdr->addr_public.C2S_vxlan_addr.link_type){
+ struct hdlc_net_hdr *snd_hdlc_hdr = (struct hdlc_net_hdr *)(buf + sizeof(inline_vxlan_hdr_t));
+ snd_hdlc_hdr->address = raw_vxlan_hdr->inner_hdlc.address;
+ snd_hdlc_hdr->control = raw_vxlan_hdr->inner_hdlc.control;
+ snd_hdlc_hdr->protocol = raw_vxlan_hdr->inner_hdlc.protocol;
+ }else if(VXLAN_ENCAP_PPP == raw_vxlan_hdr->addr_public.C2S_vxlan_addr.link_type){
+ struct layer_ppp_hdr *snd_ppp_hdr = (struct layer_ppp_hdr *)(buf + sizeof(inline_vxlan_hdr_t));
+ snd_ppp_hdr->address = raw_vxlan_hdr->inner_ppp.address;
+ snd_ppp_hdr->control = raw_vxlan_hdr->inner_ppp.control;
+ snd_ppp_hdr->protocol = raw_vxlan_hdr->inner_ppp.protocol;
+ }else{
+ ;//ethernet, do nothing!
+ }
+
+
+ return raw_vxlan_hdr->actual_total_len;
+
+}
+#endif
static int build_net_layer_l2tp(const struct streaminfo *top_stream, struct streaminfo_private *stream_pr, int carry_layer_type,
int carry_layer_len, unsigned char *buf, unsigned char send_stream_dir, const raw_pkt_t *raw_pkt, int l2tp_raw_hdr_len)