diff options
| author | 杨威 <[email protected]> | 2020-11-03 20:14:17 +0800 |
|---|---|---|
| committer | lijia <[email protected]> | 2020-11-03 20:26:18 +0800 |
| commit | 7b94d5338cafda7e0b67bc686a67f6ce1396bf82 (patch) | |
| tree | 1f25ec16c64dcf1c59f3a1899cbbd957dcc5e9d0 | |
| parent | d8737ead68dc9695ac34be8011a029676fa26110 (diff) | |
✨feat(marsio BPF): marsio模式支持BPF,命中计数记录在lib_dropv4.2.3
Conflicts:
src/packet_io/packet_io_marsio.c
| -rw-r--r-- | src/packet_io/packet_io_marsio.c | 51 |
1 files changed, 49 insertions, 2 deletions
diff --git a/src/packet_io/packet_io_marsio.c b/src/packet_io/packet_io_marsio.c index 97a2f3a..58b0d0d 100644 --- a/src/packet_io/packet_io_marsio.c +++ b/src/packet_io/packet_io_marsio.c @@ -105,6 +105,15 @@ int (*ptr_marsio_buff_set_metadata)(marsio_buff_t *m, enum mr_buff_metadata_type int (*ptr_marsio_buff_unset_metadata)(marsio_buff_t *m, enum mr_buff_metadata_type type); +static struct bpf_program MARSIO_BPF_FILTER[MAX_THREAD_NUM]; +static int g_marsio_have_bpf; + +struct __marsio_bpf_counter_t +{ + long count; +} __attribute__((aligned(64))); /* for multi-thread, must 64byte alignment */ +struct __marsio_bpf_counter_t g_marsio_bpf_counter[MAX_THREAD_NUM]; + /************************ funcitons for dynamic link *************************/ int marsio_dl_io_set_cap_level(int cap_level) @@ -223,7 +232,26 @@ int marsio_dl_io_set_capdev_serial(const char *up_dev, const char *down_dev) int marsio_dl_io_set_capture_filter(const char *filter_rule) { + memset(&g_marsio_bpf_counter, 0, sizeof(g_marsio_bpf_counter)); + g_marsio_have_bpf=0; (void)filter_rule; /* marsioģʽ��֧�ֹ��˹��� */ + if(strlen(filter_rule) <= 0)return -1; + int i,j; + + int pcap_link_type = DLT_EN10MB; + for (i = 0; i < (unsigned int)g_packet_io_thread_num; i++) + { + if (pcap_compile_nopcap(65535, pcap_link_type, &MARSIO_BPF_FILTER[i], filter_rule, 100, 0) < 0) + { + printf("Compile pcap filter '%s' error\n", filter_rule); + for(j = 0; j < (unsigned int )g_packet_io_thread_num; j++) + { + pcap_freecode(&MARSIO_BPF_FILTER[j]); + } + return -1; + } + } + g_marsio_have_bpf=1; return 0; } @@ -249,8 +277,13 @@ long marsio_dl_io_get_app_drop_num(int thread_num) long marsio_dl_io_get_lib_drop_num(void) { - /* pagģʽ�鿴������ר�ù���, ����Ŀǰ���ṩ�˹��� */ - return 0; + long total_drop = 0; + int i; + for(i = 0; i < g_marsio4_work_thread_num; i++) + { + total_drop +=g_marsio_bpf_counter[i].count; + } + return total_drop; } @@ -562,6 +595,9 @@ static int marsio4_pkt_forward(int tid, struct mr_sendpath * sendpath, marsio_bu static inline int marsio4_pkt_hand(int tid, marsio_buff_t *rx_buff, raw_pkt_t *raw_pkt, unsigned char dir) { int ret; + + + struct mr_tunnat_ctrlzone *mr_ctrlzone = (struct mr_tunnat_ctrlzone *)ptr_marsio_buff_ctrlzone(rx_buff, 0); /* index */ raw_pkt->__lib_raw_pkt_data = ptr_marsio_buff_mtod(rx_buff); @@ -571,6 +607,17 @@ static inline int marsio4_pkt_hand(int tid, marsio_buff_t *rx_buff, raw_pkt_t *r raw_pkt->io_lib_pkt_reference = rx_buff; raw_pkt->route_dir = mr_ctrlzone->route_dir; + if(unlikely(g_marsio_have_bpf == 1)) + { + if (0 == bpf_filter(MARSIO_BPF_FILTER[tid].bf_insns, + (const unsigned char *)raw_pkt->raw_pkt_data, + raw_pkt->raw_pkt_len, raw_pkt->raw_pkt_len)) + { + g_marsio_bpf_counter[tid].count++; + return DROP; + } + } + if(0 == sapp_global_val->config.packet_io.packet_io_tunnel.l2_l3_tunnel_support){ raw_pkt->is_overlay_pkt = mr_ctrlzone->action & TUNNAT_CZ_ACTION_FORWARD; }else{ |
