summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryangwei <[email protected]>2024-03-20 18:55:00 +0800
committeryangwei <[email protected]>2024-03-20 18:55:00 +0800
commit94baa4d78625e646950a0d0a2e75c93973937637 (patch)
tree52e55566caf009cc5c660e341c2120327f31a12a
parent3dd91440cbacbb8842c88c336a10d4ddf9e1d133 (diff)
✨ feat(get meta by stream dir): 支持按流方向获取meta信息v4.3.40
-rw-r--r--include/public/stream_inc/stream_control.h60
-rw-r--r--include/public/stream_inc/stream_rawpkt.h37
-rw-r--r--src/dealpkt/plug_support.c75
3 files changed, 122 insertions, 50 deletions
diff --git a/include/public/stream_inc/stream_control.h b/include/public/stream_inc/stream_control.h
index 13c6262..64af912 100644
--- a/include/public/stream_inc/stream_control.h
+++ b/include/public/stream_inc/stream_control.h
@@ -59,6 +59,10 @@ enum MESA_stream_opt{
MSO_STREAM_C2S_ROUTE_DIRECTION,
MSO_STREAM_INBOND_ROUTE_CTX,
MSO_STREAM_OUTBOND_ROUTE_CTX,
+ MSO_STREAM_C2S_LINK_ID,
+ MSO_STREAM_S2C_LINK_ID,
+ MSO_STREAM_C2S_ROUTE_CTX,
+ MSO_STREAM_S2C_ROUTE_CTX,
__MSO_MAX,
};
@@ -154,8 +158,8 @@ enum stream_timer_return_value{
};
-#define MAX_TCP_OPT_LEN (38) /* TCPͷ�������Ϊ60�ֽ�, ȥ����׼ͷ��ʣ��ѡ����40�ֽ�, ѡ�����ݲ����38�ֽ� */
-#define MAX_TCP_OPT_NUM (20) /* ����TCP�����ѡ������ */
+#define MAX_TCP_OPT_LEN (38) /* TCP头部长度最长为60字节, 去除标准头部剩余选项部分最长40字节, 选项数据部分最长38字节 */
+#define MAX_TCP_OPT_NUM (20) /* 单个TCP包最大选项数量 */
enum tcp_option_value{
TCP_OPT_EOL = 0,
@@ -202,21 +206,21 @@ struct tcp_option_ext{
} __attribute__((packed, aligned(1)));
-/* 2018-10-24 lijia add, for pangu ��Ŀmac_in_mac����.
- ������, sappƽ̨��Ӧ�ù��ĺ�ҵ��������صĶ���, ����mac���ĸ��ֶ���link_id, �ĸ���dev_id,
- ���������̫�ײ���, ƽ̨����GDEV����RST��ҲҪ�����Щֵ, ����ƽ̨����!!
+/* 2018-10-24 lijia add, for pangu 项目mac_in_mac回流.
+ 理论上, sapp平台不应该关心和业务密切相关的东西, 比如mac里哪个字段是link_id, 哪个是dev_id,
+ 但这个玩意太底层了, 平台借用GDEV发送RST包也要填充这些值, 必须平台处理!!
*/
-/* Ϊ�˷���ҵ������ȡmac_in_mac��ַ��ľ�����Ϣ, ����ʹ��ԭʼ��bitλ��, ת���ɱ�����ʽ */
+/* 为了方便业务插件获取mac_in_mac地址里的具体信息, 不再使用原始的bit位域, 转换成变量形式 */
struct vxlan_info{
- unsigned char encap_type; /* ԭʼ�����װ��ʽ */
- unsigned char entrance_id; /* �豸���ڳ����ID */
- unsigned char dev_id; /* �豸ID */
- unsigned char link_id; /* ��·ID */
- unsigned char link_dir; /* ��·����, ָ��ǰ��Ԫ���IP������ʱ�Ĵ��䷽��, ����TCP, SYN���Ĵ��䷽��; ����UDP, �˿ڴ�IP�Ĵ��䷽�� */
- unsigned char inner_smac[18]; /* �ڲ���ʵSMAC, string����, ��: "11:22:33:44:55:66" */
- unsigned char inner_dmac[18]; /* �ڲ���ʵDMAC, string����, ��: "11:22:33:44:55:66" */
- unsigned char inner_smac_hex[6]; /* �ڲ���ʵSMAC, ԭʼ���������� */
- unsigned char inner_dmac_hex[6]; /* �ڲ���ʵDMAC, ԭʼ���������� */
+ unsigned char encap_type; /* 原始二层封装格式 */
+ unsigned char entrance_id; /* 设备所在出入口ID */
+ unsigned char dev_id; /* 设备ID */
+ unsigned char link_id; /* 链路ID */
+ unsigned char link_dir; /* 链路方向, 指当前四元组的IP被捕获时的传输方向, 对于TCP, SYN包的传输方向; 对于UDP, 端口大IP的传输方向 */
+ unsigned char inner_smac[18]; /* 内层真实SMAC, string类型, 例: "11:22:33:44:55:66" */
+ unsigned char inner_dmac[18]; /* 内层真实DMAC, string类型, 例: "11:22:33:44:55:66" */
+ unsigned char inner_smac_hex[6]; /* 内层真实SMAC, 原始二进制类型 */
+ unsigned char inner_dmac_hex[6]; /* 内层真实DMAC, 原始二进制类型 */
};
@@ -334,14 +338,14 @@ int sapp_get_device_opt(const char *device, enum sapp_device_opt opt_type, void
/***************************************************************************************
NOTE:
- �ڱ���ģʽ��, ����������route_dir�ľ���ֵ, ֻ��Ҫ����ͬ��ͷ��򼴿�,
- ��������������Ҫ��ȷ����route_dir��0����1, �������������ģʽ��ͬ, ������ʱ��仯,
- �������ô˽ӿ�, ���ֻ�贫����������ķ���human_dir, ���ص�ǰ��·��link route dir,
- ע���״β���ʱ, etc/sapp.toml->inbound_route_dirһ��Ҫ������ȷ.
+ 在被动模式下, 插件无需关心route_dir的绝对值, 只需要理解同向和反向即可,
+ 但主动发包必须要精确理解route_dir是0还是1, 因外界网络拓扑模式不同, 可能随时会变化,
+ 所以设置此接口, 插件只需传入人易理解的方向human_dir, 返回当前链路的link route dir,
+ 注意首次部署时, etc/sapp.toml->inbound_route_dir一定要设置正确.
- args: ��ʾ����Ŀ������ڵ�ǰ�豸���ڵĵ���λ��,
- 'E' or 'e': ��ʾ���ݰ����䷽���Ǵ�Internal to External.
- 'I' or 'i': ��ʾ���ݰ����䷽���Ǵ�External to Internal.
+ args: 表示发包目标相对于当前设备所在的地理位置,
+ 'E' or 'e': 表示数据包传输方向是从Internal to External.
+ 'I' or 'i': 表示数据包传输方向是从External to Internal.
return value:
0 or 1: success.
@@ -351,19 +355,19 @@ int MESA_dir_human_to_link(int human_dir);
/*
args:
- ��·���䷽��: 0��1, ͨ������stream->routedir;
+ 链路传输方向: 0或1, 通常来自stream->routedir;
- ����ֵ:
- 'E' or 'e': ��ʾ���ݰ����䷽���Ǵ�Internal to External.
- 'I' or 'i': ��ʾ���ݰ����䷽���Ǵ�External to Internal.
- 'x': ��������;
+ 返回值:
+ 'E' or 'e': 表示数据包传输方向是从Internal to External.
+ 'I' or 'i': 表示数据包传输方向是从External to Internal.
+ 'x': 参数错误;
*/
int MESA_dir_link_to_human(int link_route_dir);
/****************************************************************************************
- CHN : ��Ϊ��ʷ��������,���ຯ��������Ϊ������,��ʹ���½ӿ�:MESA_set_stream_opt().
+ CHN : 因为历史遗留问题,此类函数保留仅为向后兼容,请使用新接口:MESA_set_stream_opt().
ENG : for compat old version, keep these functions, but we suggest you use new API MESA_set_stream_opt().
*****************************************************************************************/
int tcp_set_single_stream_max_unorder(const struct streaminfo *stream, unsigned char dir, unsigned short unorder_num);
diff --git a/include/public/stream_inc/stream_rawpkt.h b/include/public/stream_inc/stream_rawpkt.h
index 22b2422..7f0c698 100644
--- a/include/public/stream_inc/stream_rawpkt.h
+++ b/include/public/stream_inc/stream_rawpkt.h
@@ -24,8 +24,8 @@ enum{
RAW_PKT_GET_VXLAN_VPNID, // network-order, VPN_ID, value type is int, out_value should be int *
RAW_PKT_GET_VXLAN_LOCAL_IP, // network-order, VXLAN Local IP, value type is int, out_value should be int *
- RAW_PKT_GET_ORIGINAL_LOWEST_ETH_SMAC, /* value type is char[6],��ʵԭʼ��������smac��ַ,mirrorģʽ��, ��ͬ��RAW_PKT_GET_DATA, ����ʹ��stream->pfather����ƫ��; inline + vxlan + mrtunnatģʽ��, ��ͬ��RAW_PKT_GET_VXLAN_OUTER_GDEV_MAC; */
- RAW_PKT_GET_ORIGINAL_LOWEST_ETH_DMAC, /* value type is char[6],��ʵԭʼ��������dmac��ַ,mirrorģʽ��, ��ͬ��RAW_PKT_GET_DATA, ����ʹ��stream->pfather����ƫ��; inline + vxlan + mrtunnatģʽ��, ��ͬ��RAW_PKT_GET_VXLAN_OUTER_LOCAL_MAC; */
+ RAW_PKT_GET_ORIGINAL_LOWEST_ETH_SMAC, /* value type is char[6],真实原始包最外层的smac地址,mirror模式下, 等同于RAW_PKT_GET_DATA, 或者使用stream->pfather自行偏移; inline + vxlan + mrtunnat模式下, 等同于RAW_PKT_GET_VXLAN_OUTER_GDEV_MAC; */
+ RAW_PKT_GET_ORIGINAL_LOWEST_ETH_DMAC, /* value type is char[6],真实原始包最外层的dmac地址,mirror模式下, 等同于RAW_PKT_GET_DATA, 或者使用stream->pfather自行偏移; inline + vxlan + mrtunnat模式下, 等同于RAW_PKT_GET_VXLAN_OUTER_LOCAL_MAC; */
RAW_PKT_GET_ROUTE_CTX, /* get current stream route_dir route_ctx, max value size char[64] */
RAW_PKT_GET_SID_LIST, /* get current stream route_dir route_ctx, value defined in stream_control.h, struct segment_id_list */
@@ -42,7 +42,7 @@ extern "C" {
get option from raw packet.
for example:
- CHN : ��ȡԭʼ������, (���ݲ������͵IJ�ͬ, ���ܴ�MAC��ʼ, Ҳ���ܴ�IPͷ����ʼ, ��Ҫʹ��RAW_PKT_GET_RAW_PKT_TYPE��ȡ);
+ CHN : 获取原始包数据, (根据捕包类型的不同, 可能从MAC开始, 也可能从IP头部开始, 需要使用RAW_PKT_GET_RAW_PKT_TYPE获取);
ENG : get raw packet header, header's type depend on raw pacekt type, you should use RAW_PKT_GET_RAW_PKT_TYPE first;
void *raw_pkt_data;
@@ -55,17 +55,17 @@ for example:
error!
}
- CHN : ��ȡԭʼ���ܳ���;
+ CHN : 获取原始包总长度;
ENG : get raw packet size;
int tot_len;
get_opt_from_rawpkt(voidpkt, RAW_PKT_GET_TOT_LEN, &tot_len);
- CHN : ��ȡ�����ͷ��ʼ��ַ:
+ CHN : 获取本层包头起始地址:
ENG : get this layer header;
void *this_layer_hdr;
get_opt_from_rawpkt(voidpkt, RAW_PKT_GET_THIS_LAYER_HDR, &this_layer_hdr);
- CHN : ��ȡԭʼ��ʱ���, ���������ײ㲶���ⲻ֧��ʱ�������, ֵΪȫ0:
+ CHN : 获取原始包时间戳, 如果网卡或底层捕包库不支持时间戳功能, 值为全0:
ENG : get raw packet timestamp, maybe zero if network card or library not support.
struct timeval pkt_stamp;
get_opt_from_rawpkt(voidpkt, RAW_PKT_GET_TIMESTAMP, &pkt_stamp);
@@ -77,34 +77,34 @@ for example:
int get_opt_from_rawpkt(const void *rawpkt, int type, void *out_value);
/*
- CHN: ����ͬ��, ���������ͬ.
+ CHN: 功能同上, 传入参数不同.
ENG: Function ibid, except args pstream.
*/
int get_rawpkt_opt_from_streaminfo(const struct streaminfo *pstream, int type, void *out_value);
/*
TCP UDP only
- ��ȡ���ڵ�ǰ���ж�Ӧ��l3����l4ͷ����ʼλ��,
+ 获取流在当前包中对应的l3或者l4头部起始位置,
*/
const void *get_current_layer3_header(const struct streaminfo *pstream);
const void *get_current_layer4_header(const struct streaminfo *pstream);
/*
- CHN : ���ݰ�ͷ��ƫ�ƺ���.
+ CHN : 数据包头部偏移函数.
ENG :
- ����:
- raw_data: ��ǰ���ͷ��ָ��;
- raw_layer_type: ��ǰ��ĵ�ַ����, ���: enum addr_type_t ;
- expect_layer_type: ������ת���ĵ�ַ����, ���: enum addr_type_t ;
+ 参数:
+ raw_data: 当前层的头部指针;
+ raw_layer_type: 当前层的地址类型, 详见: enum addr_type_t ;
+ expect_layer_type: 期望跳转到的地址类型, 详见: enum addr_type_t ;
- ����ֵ:
- NULL: �޴˵�ַ;
- NON-NULL: ��Ӧ���ͷ����ַ.
+ 返回值:
+ NULL: 无此地址;
+ NON-NULL: 对应层的头部地址.
- ����:
- ���赱ǰ��ΪEthernet, ��ʼ��ͷ��ַΪthis_layer_hdr, ����ת��IPv6��ͷ��:
+ 举例:
+ 假设当前层为Ethernet, 起始包头地址为this_layer_hdr, 想跳转到IPv6层头部:
struct ip6_hdr *ip6_header;
ip6_header = MESA_jump_layer(this_layer_hdr, ADDR_TYPE_MAC, ADDR_TYPE_IPV6);
*/
@@ -113,6 +113,7 @@ const void *MESA_jump_layer(const void *raw_data, int raw_layer_type, int expec
const void *get_current_rawpkt_from_streaminfo(const struct streaminfo *pstream);
const void *get_rawpkt_from_streaminfo(const struct streaminfo *pstream, int route_direction);
+const void *get_rawpkt_by_stream_dir(const struct streaminfo *pstream, int stream_direction);
struct detain_pkt;
struct detain_pkt* MESA_rawpkt_detain(const struct streaminfo *pstream, const void *rawpkt);
diff --git a/src/dealpkt/plug_support.c b/src/dealpkt/plug_support.c
index 11f839b..f744f66 100644
--- a/src/dealpkt/plug_support.c
+++ b/src/dealpkt/plug_support.c
@@ -410,11 +410,33 @@ const void *get_rawpkt_from_streaminfo(const struct streaminfo *pstream, int rou
{
const struct streaminfo_private *pstream_pr = (const struct streaminfo_private *)pstream;
if(pstream_pr->polling_inject_context == NULL)return NULL;
- if (pstream_pr->stream_c2s_route_dir == DIR_ROUTE_UP)
+ int c2s_route_dir=MESA_dir_link_to_human(pstream_pr->stream_c2s_route_dir);
+ if (c2s_route_dir==(int)'E')
{
- return pstream_pr->polling_inject_context->raw_pkt_stream_dir[DIR_C2S - 1];
+ if(route_direction == DIR_ROUTE_UP)
+ return pstream_pr->polling_inject_context->raw_pkt_stream_dir[DIR_C2S - 1];
+ else
+ return pstream_pr->polling_inject_context->raw_pkt_stream_dir[DIR_S2C - 1];
}
- else if (pstream_pr->stream_c2s_route_dir == DIR_ROUTE_DOWN)
+ if (c2s_route_dir==(int)'I')
+ {
+ if(route_direction == DIR_ROUTE_UP)
+ return pstream_pr->polling_inject_context->raw_pkt_stream_dir[DIR_S2C - 1];
+ else
+ return pstream_pr->polling_inject_context->raw_pkt_stream_dir[DIR_C2S - 1];
+ }
+ return NULL;
+}
+
+const void *get_rawpkt_by_stream_dir(const struct streaminfo *pstream, int stream_direction)
+{
+ const struct streaminfo_private *pstream_pr = (const struct streaminfo_private *)pstream;
+ if(pstream_pr->polling_inject_context == NULL)return NULL;
+ if (stream_direction==DIR_C2S)
+ {
+ return pstream_pr->polling_inject_context->raw_pkt_stream_dir[DIR_C2S - 1];
+ }
+ if (stream_direction==DIR_S2C)
{
return pstream_pr->polling_inject_context->raw_pkt_stream_dir[DIR_S2C - 1];
}
@@ -1756,7 +1778,8 @@ int MESA_get_stream_opt(const struct streaminfo *pstream, enum MESA_stream_opt o
{
ret = -1;
struct rawpkt_metadata *meta = NULL;
- if (pstream_pr->stream_c2s_route_dir == DIR_ROUTE_UP)
+ int c2s_route_dir=MESA_dir_link_to_human(pstream_pr->stream_c2s_route_dir);
+ if (c2s_route_dir==(int)'E')
{
if (opt == MSO_STREAM_OUTBOND_LINK_ID)
{
@@ -1872,6 +1895,50 @@ int MESA_get_stream_opt(const struct streaminfo *pstream, enum MESA_stream_opt o
}
}
break;
+ case MSO_STREAM_C2S_LINK_ID:
+ case MSO_STREAM_S2C_LINK_ID:
+ {
+ ret = -1;
+ struct rawpkt_metadata *meta = NULL;
+ if (opt == MSO_STREAM_C2S_LINK_ID)
+ {
+ meta = pstream_pr->polling_inject_context->meta_stream_dir[DIR_C2S - 1];
+ }
+ else
+ {
+ meta = pstream_pr->polling_inject_context->meta_stream_dir[DIR_S2C - 1];
+ }
+ if (meta)
+ {
+ *(unsigned int *)(opt_val) = meta->link_id;
+ *opt_val_len = sizeof(meta->link_id);
+ ret = 0;
+ }
+ }
+ break;
+ case MSO_STREAM_C2S_ROUTE_CTX:
+ case MSO_STREAM_S2C_ROUTE_CTX:
+ {
+ ret = -1;
+ *opt_val_len = 0;
+ void **value = (void **)opt_val;
+ struct rawpkt_metadata *meta = NULL;
+ if (opt == MSO_STREAM_C2S_ROUTE_CTX)
+ {
+ meta = pstream_pr->polling_inject_context->meta_stream_dir[DIR_C2S - 1];
+ }
+ else
+ {
+ meta = pstream_pr->polling_inject_context->meta_stream_dir[DIR_S2C - 1];
+ }
+ if (meta)
+ {
+ *value = (void *)meta->data;
+ *opt_val_len = meta->sz_data;
+ ret = meta->sz_data;
+ }
+ }
+ break;
default:
sapp_runtime_log(RLOG_LV_INFO, "%s,MESA_get_stream_opt() error:unsupport MESA_stream_opt type:%d!\n",printaddr(&pstream->addr, pstream->threadnum), (int)opt);
ret = -1;