diff options
| author | songyanchao <[email protected]> | 2023-02-23 12:12:44 +0000 |
|---|---|---|
| committer | songyanchao <[email protected]> | 2023-02-23 12:12:44 +0000 |
| commit | 7f0a4a1b5bcd58cada640f5530f142ad5ae04bbf (patch) | |
| tree | 6618248783c97b3d501c943f32eba6914efcd5c9 | |
| parent | 29b13d2b60b1c23e3eaa7b2e488594244f594c27 (diff) | |
✨ feat: 添加arp request 处理流程,修改bfd数据包处理流程
添加arp request 处理流程,修改bfd数据包处理流程
| -rw-r--r-- | service/src/node_bfd.c | 75 | ||||
| -rw-r--r-- | service/src/node_eth_ingress.c | 44 |
2 files changed, 86 insertions, 33 deletions
diff --git a/service/src/node_bfd.c b/service/src/node_bfd.c index a6f2035..7f44d15 100644 --- a/service/src/node_bfd.c +++ b/service/src/node_bfd.c @@ -12,25 +12,12 @@ #include <sys/socket.h> /* Global Config */ -#ifndef MR_BFD_MAX_SESSION_NUM #define MR_BFD_MAX_SESSION_NUM 1024 -#endif - -#ifndef MR_BFD_MAX_SESSION_BUF_NUM +#define MR_BFD_START_DISCRIMINATOR 1000 #define MR_BFD_MAX_SESSION_BUF_NUM MR_BFD_MAX_SESSION_NUM + 1 -#endif - -#ifndef MR_BFD_MAX_SESSION_ID #define MR_BFD_MAX_SESSION_ID 1023 -#endif - -#ifndef MR_BFD_INVALID_SESSION_ID #define MR_BFD_INVALID_SESSION_ID MR_BFD_MAX_SESSION_NUM -#endif - -#ifndef TIMEOUT_CHECK_US #define TIMEOUT_CHECK_US 500000 -#endif #define MR_BFD_STAT_ADD_FOR_TOTAL(st, gid, counter, value) \ do \ @@ -69,22 +56,22 @@ enum struct bfd_header_t { - unsigned char version_diag; + uint8_t version_diag; #if __BYTE_ORDER == __LITTLE_ENDIAN - unsigned char flags : 6; - unsigned char state : 2; + uint8_t flags : 6; + uint8_t state : 2; #elif __BYTE_ORDER == __BIG_ENDIAN - unsigned char state : 2; - unsigned char flags : 6; + uint8_t state : 2; + uint8_t flags : 6; #endif - unsigned char detect_time_multiplier; - unsigned char length; - unsigned char my_discriminator[4]; - unsigned char your_discriminator[4]; - unsigned char desired_min_tx_interval[4]; - unsigned char required_min_rx_interval[4]; - unsigned char required_min_echo_interval[4]; + uint8_t detect_time_multiplier; + uint8_t length; + uint8_t my_discriminator[4]; + uint8_t your_discriminator[4]; + uint8_t desired_min_tx_interval[4]; + uint8_t required_min_rx_interval[4]; + uint8_t required_min_echo_interval[4]; }; /* Bfd Stat Field */ @@ -155,23 +142,48 @@ uint16_t get_bfd_session_id(struct bfd_stat_per_lcore * graph_stat, struct rte_i } /* Reply Bfd Request */ -void bfd_reply(struct rte_ether_hdr * ether_hdr, struct rte_ipv4_hdr * ipv4_hdr, struct bfd_header_t * bfd_hdr) +uint8_t bfd_reply(struct rte_ether_hdr * ether_hdr, struct rte_ipv4_hdr * ipv4_hdr, struct rte_udp_hdr * udp_hdr, + uint16_t bfd_session_id) { - struct rte_ether_hdr swap_eth_hdr; - struct rte_ipv4_hdr swap_ip_hdr; - /* Swap ether_hdr */ + struct rte_ether_hdr swap_eth_hdr = {}; rte_ether_addr_copy(ðer_hdr->dst_addr, &swap_eth_hdr.dst_addr); rte_ether_addr_copy(ðer_hdr->src_addr, &swap_eth_hdr.src_addr); rte_ether_addr_copy(&swap_eth_hdr.src_addr, ðer_hdr->dst_addr); rte_ether_addr_copy(&swap_eth_hdr.dst_addr, ðer_hdr->src_addr); + /* Swap ipv4_hdr */ + struct rte_ipv4_hdr swap_ip_hdr = {}; swap_ip_hdr.src_addr = ipv4_hdr->src_addr; swap_ip_hdr.dst_addr = ipv4_hdr->dst_addr; ipv4_hdr->src_addr = swap_ip_hdr.dst_addr; ipv4_hdr->dst_addr = swap_ip_hdr.src_addr; + + /* Swap discriminator */ + struct bfd_header_t * bfd_hdr = (struct bfd_header_t *)(udp_hdr + 1); + uint8_t swap_discriminator[4] = {}; + uint32_t discriminator = htonl(MR_BFD_START_DISCRIMINATOR + bfd_session_id); + memcpy(swap_discriminator, bfd_hdr->my_discriminator, sizeof(swap_discriminator)); + memcpy(bfd_hdr->my_discriminator, &discriminator, sizeof(swap_discriminator)); + memcpy(bfd_hdr->your_discriminator, swap_discriminator, sizeof(swap_discriminator)); + + /* Set udp check sum */ + udp_hdr->dgram_cksum = 0; + /* Set Bfd State */ + uint8_t bfd_state = bfd_hdr->state; + if (bfd_state == BFD_STATE_DOWN) + { + bfd_hdr->state = BFD_STATE_INIT; + return bfd_state; + } + else if (bfd_state == BFD_STATE_INIT) + { + bfd_hdr->state = BFD_STATE_UP; + return bfd_state; + } bfd_hdr->state = BFD_STATE_UP; + return bfd_state; } /* Bfd Node Init Function */ @@ -243,8 +255,7 @@ static __rte_always_inline uint16_t bfd_node_process(struct rte_graph * graph, s } /* Reply Bfd Request */ - struct bfd_header_t * bfd_hdr = (struct bfd_header_t *)(udp_hdr + 1); - bfd_reply(ether_hdr, ipv4_hdr, bfd_hdr); + bfd_reply(ether_hdr, ipv4_hdr, udp_hdr, bfd_session_id); MR_BFD_STAT_ADD_FOR_SESSION_ID(bfd_main, gid, bfd_session_id, total_pkts, 1); /* Update prev_tsc */ diff --git a/service/src/node_eth_ingress.c b/service/src/node_eth_ingress.c index 05b222d..b1d9b0c 100644 --- a/service/src/node_eth_ingress.c +++ b/service/src/node_eth_ingress.c @@ -40,6 +40,7 @@ enum struct eth_ingress_stat_per_lcore { volatile uint64_t total_pkts; + volatile uint64_t arp_request_pkts; volatile uint64_t invalid_pkts; volatile uint64_t not_listen_ip_pkts; volatile uint64_t to_bridge_pkts; @@ -66,7 +67,34 @@ int node_eth_ingress_init(struct node_manager_main * node_mgr_main) return RT_SUCCESS; } -static int kernel_resp_dev_filter(struct mr_dev_desc * dev_desc, struct rte_mbuf * mbuf, struct pkt_parser_result * parser_result) +static int arp_reply_filter(struct mr_dev_desc * dev_desc, struct rte_mbuf * mbuf) +{ + struct rte_ether_hdr * eth_hdr = rte_pktmbuf_mtod(mbuf, struct rte_ether_hdr *); + struct rte_arp_hdr * arp_hdr = (struct rte_arp_hdr *)((char *)eth_hdr + sizeof(struct rte_ether_hdr)); + + if ((eth_hdr->ether_type == rte_cpu_to_be_16(RTE_ETHER_TYPE_ARP)) && + (arp_hdr->arp_opcode == rte_cpu_to_be_16(RTE_ARP_OP_REQUEST)) && + (arp_hdr->arp_data.arp_tip == dev_desc->in_addr.s_addr)) + { + arp_hdr->arp_opcode = rte_cpu_to_be_16(RTE_ARP_OP_REPLY); + + /* Switch src and dst data and set bonding MAC */ + rte_ether_addr_copy(ð_hdr->src_addr, ð_hdr->dst_addr); + rte_ether_addr_copy(&dev_desc->eth_addr, ð_hdr->src_addr); + + rte_ether_addr_copy(&arp_hdr->arp_data.arp_sha, &arp_hdr->arp_data.arp_tha); + arp_hdr->arp_data.arp_tip = arp_hdr->arp_data.arp_sip; + + rte_ether_addr_copy(&dev_desc->eth_addr, &arp_hdr->arp_data.arp_sha); + arp_hdr->arp_data.arp_sip = dev_desc->in_addr.s_addr; + + return RT_SUCCESS; + } + return RT_ERR; +} + +static int kernel_resp_dev_filter(struct mr_dev_desc * dev_desc, struct rte_mbuf * mbuf, + struct pkt_parser_result * parser_result) { struct representor_config * resp_cfg = dev_desc->representor_config; const struct rte_ether_hdr * ether_hdr = rte_pktmbuf_mtod(mbuf, const struct rte_ether_hdr *); @@ -149,6 +177,19 @@ static int endpoint_dev_packet_handler(struct mr_dev_desc * dev_desc, unsigned i return ETH_INGRESS_NEXT_ETH_EGRESS; } + if (unlikely(parser_result->nr_layers < 3)) + { + if (arp_reply_filter(dev_desc, mbuf) == RT_SUCCESS) + { + ETH_INGRESS_STAT_ADD(g_eth_ingress_main, graph_id, arp_request_pkts, 1); + mrb_meta->port_egress = mrb_meta->port_ingress; + return ETH_INGRESS_NEXT_ETH_EGRESS; + } + + ETH_INGRESS_STAT_ADD(g_eth_ingress_main, graph_id, invalid_pkts, 1); + return ETH_INGRESS_NEXT_PKT_DROP; + } + /* check this packet is to local programs or not, * packet should be like: Eth, IPv4, TCP/UDP, et al. */ if (parser_result->nr_layers < 3) @@ -332,6 +373,7 @@ cJSON * eth_ingress_node_monit_loop(struct sc_main * sc) cJSON * graph_obj = cJSON_CreateObject(); cJSON_AddNumberToObject(graph_obj, "total_pkts", stat_item->total_pkts); + cJSON_AddNumberToObject(graph_obj, "arp_request_pkts", stat_item->arp_request_pkts); cJSON_AddNumberToObject(graph_obj, "invalid_pkts", stat_item->invalid_pkts); cJSON_AddNumberToObject(graph_obj, "not_listen_ip_pkts", stat_item->not_listen_ip_pkts); cJSON_AddNumberToObject(graph_obj, "to_bridge_pkts", stat_item->to_bridge_pkts); |
