diff options
| author | 杨威 <[email protected]> | 2020-11-03 20:14:17 +0800 |
|---|---|---|
| committer | 杨威 <[email protected]> | 2020-11-03 20:14:17 +0800 |
| commit | 0d0363d0747f6e06ab8e9748a6cf9efe14256c74 (patch) | |
| tree | 0592e69e8f94bea31910df955027ba9447db94b3 | |
| parent | ed89137adda84b7008cd6ce1a2645b487c78bafc (diff) | |
✨feat(marsio BPF): marsio模式支持BPF,命中计数记录在lib_dropv4.1.14
| -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 687bc26..914193c 100644 --- a/src/packet_io/packet_io_marsio.c +++ b/src/packet_io/packet_io_marsio.c @@ -79,6 +79,15 @@ uint32_t (*ptr_marsio_buff_buflen)(marsio_buff_t *m); marsio_buff_t * (*ptr_marsio_buff_clone_with_options)(struct mr_instance * instance, marsio_buff_t * md, int socket_id, int thread_id, uint16_t options); +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) @@ -197,7 +206,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; } @@ -223,8 +251,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; } @@ -509,6 +542,9 @@ static int marsio4_pkt_forward(int tid, marsio_buff_t * mbufs) 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); @@ -518,6 +554,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; + } + } + ret = (*g_marsio4_work_fun)((const raw_pkt_t *)raw_pkt, mr_ctrlzone->route_dir, tid); return ret; |
