summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsongyanchao <[email protected]>2023-02-23 12:12:44 +0000
committersongyanchao <[email protected]>2023-02-23 12:12:44 +0000
commit7f0a4a1b5bcd58cada640f5530f142ad5ae04bbf (patch)
tree6618248783c97b3d501c943f32eba6914efcd5c9
parent29b13d2b60b1c23e3eaa7b2e488594244f594c27 (diff)
✨ feat: 添加arp request 处理流程,修改bfd数据包处理流程
添加arp request 处理流程,修改bfd数据包处理流程
-rw-r--r--service/src/node_bfd.c75
-rw-r--r--service/src/node_eth_ingress.c44
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(&ether_hdr->dst_addr, &swap_eth_hdr.dst_addr);
rte_ether_addr_copy(&ether_hdr->src_addr, &swap_eth_hdr.src_addr);
rte_ether_addr_copy(&swap_eth_hdr.src_addr, &ether_hdr->dst_addr);
rte_ether_addr_copy(&swap_eth_hdr.dst_addr, &ether_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(&eth_hdr->src_addr, &eth_hdr->dst_addr);
+ rte_ether_addr_copy(&dev_desc->eth_addr, &eth_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);