diff options
| author | lijia <[email protected]> | 2021-12-14 17:53:18 +0800 |
|---|---|---|
| committer | lijia <[email protected]> | 2021-12-14 17:53:18 +0800 |
| commit | 153e1673bc596fb545258db224ec9e84a1c8e455 (patch) | |
| tree | 6d2bbd628ece780d1e79dbab9796ab455e099c99 | |
| parent | 1a0555a13985768c7d334af617ccb0b57972f789 (diff) | |
TSG-9029, 修复inline模式非对称链路注入数据包vxlan地址错误.v4.2.71
| -rw-r--r-- | include/public/stream_inc/stream_base.h | 10 | ||||
| -rw-r--r-- | src/common/stream_addr_inet.c | 26 | ||||
| -rw-r--r-- | src/dealpkt/deal_vxlan.c | 21 | ||||
| -rw-r--r-- | src/dealpkt/stream_manage.c | 20 | ||||
| -rw-r--r-- | src/packet_io/sendpacket.c | 87 |
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) |
