summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author杨威 <[email protected]>2020-11-03 20:14:17 +0800
committer杨威 <[email protected]>2020-11-03 20:14:17 +0800
commit0d0363d0747f6e06ab8e9748a6cf9efe14256c74 (patch)
tree0592e69e8f94bea31910df955027ba9447db94b3
parented89137adda84b7008cd6ce1a2645b487c78bafc (diff)
✨feat(marsio BPF): marsio模式支持BPF,命中计数记录在lib_dropv4.1.14
-rw-r--r--src/packet_io/packet_io_marsio.c51
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;