120365d79SSunil Kumar Kori /* SPDX-License-Identifier: BSD-3-Clause 220365d79SSunil Kumar Kori * Copyright(C) 2023 Marvell. 320365d79SSunil Kumar Kori */ 420365d79SSunil Kumar Kori 520365d79SSunil Kumar Kori #include <arpa/inet.h> 620365d79SSunil Kumar Kori #include <sys/socket.h> 720365d79SSunil Kumar Kori 820365d79SSunil Kumar Kori #include <rte_ethdev.h> 920365d79SSunil Kumar Kori #include <rte_ether.h> 1020365d79SSunil Kumar Kori #include <rte_graph.h> 11a2bc0584SZhirun Yan #include <rte_graph_worker.h> 1220365d79SSunil Kumar Kori #include <rte_ip.h> 1320365d79SSunil Kumar Kori #include <rte_lpm6.h> 1420365d79SSunil Kumar Kori 1520365d79SSunil Kumar Kori #include "rte_node_ip6_api.h" 1620365d79SSunil Kumar Kori 1720365d79SSunil Kumar Kori #include "node_private.h" 1820365d79SSunil Kumar Kori 1920365d79SSunil Kumar Kori #define IPV6_L3FWD_LPM_MAX_RULES 1024 2020365d79SSunil Kumar Kori #define IPV6_L3FWD_LPM_NUMBER_TBL8S (1 << 8) 2120365d79SSunil Kumar Kori 2220365d79SSunil Kumar Kori /* IP6 Lookup global data struct */ 2320365d79SSunil Kumar Kori struct ip6_lookup_node_main { 2420365d79SSunil Kumar Kori struct rte_lpm6 *lpm_tbl[RTE_MAX_NUMA_NODES]; 2520365d79SSunil Kumar Kori }; 2620365d79SSunil Kumar Kori 2720365d79SSunil Kumar Kori struct ip6_lookup_node_ctx { 2820365d79SSunil Kumar Kori /* Socket's LPM table */ 2920365d79SSunil Kumar Kori struct rte_lpm6 *lpm6; 3020365d79SSunil Kumar Kori /* Dynamic offset to mbuf priv1 */ 3120365d79SSunil Kumar Kori int mbuf_priv1_off; 3220365d79SSunil Kumar Kori }; 3320365d79SSunil Kumar Kori 3420365d79SSunil Kumar Kori static struct ip6_lookup_node_main ip6_lookup_nm; 3520365d79SSunil Kumar Kori 3620365d79SSunil Kumar Kori #define IP6_LOOKUP_NODE_LPM(ctx) \ 3720365d79SSunil Kumar Kori (((struct ip6_lookup_node_ctx *)ctx)->lpm6) 3820365d79SSunil Kumar Kori 3920365d79SSunil Kumar Kori #define IP6_LOOKUP_NODE_PRIV1_OFF(ctx) \ 4020365d79SSunil Kumar Kori (((struct ip6_lookup_node_ctx *)ctx)->mbuf_priv1_off) 4120365d79SSunil Kumar Kori 4220365d79SSunil Kumar Kori static uint16_t 4320365d79SSunil Kumar Kori ip6_lookup_node_process_scalar(struct rte_graph *graph, struct rte_node *node, 4420365d79SSunil Kumar Kori void **objs, uint16_t nb_objs) 4520365d79SSunil Kumar Kori { 4620365d79SSunil Kumar Kori struct rte_mbuf *mbuf0, *mbuf1, *mbuf2, *mbuf3, **pkts; 4720365d79SSunil Kumar Kori struct rte_lpm6 *lpm6 = IP6_LOOKUP_NODE_LPM(node->ctx); 4820365d79SSunil Kumar Kori const int dyn = IP6_LOOKUP_NODE_PRIV1_OFF(node->ctx); 4920365d79SSunil Kumar Kori struct rte_ipv6_hdr *ipv6_hdr; 5020365d79SSunil Kumar Kori void **to_next, **from; 5120365d79SSunil Kumar Kori uint16_t last_spec = 0; 5220365d79SSunil Kumar Kori rte_edge_t next_index; 5320365d79SSunil Kumar Kori uint16_t n_left_from; 5420365d79SSunil Kumar Kori uint16_t held = 0; 5520365d79SSunil Kumar Kori uint32_t drop_nh; 5620365d79SSunil Kumar Kori int i, rc; 5720365d79SSunil Kumar Kori 5820365d79SSunil Kumar Kori /* Speculative next */ 5920365d79SSunil Kumar Kori next_index = RTE_NODE_IP6_LOOKUP_NEXT_REWRITE; 6020365d79SSunil Kumar Kori /* Drop node */ 6120365d79SSunil Kumar Kori drop_nh = ((uint32_t)RTE_NODE_IP6_LOOKUP_NEXT_PKT_DROP) << 16; 6220365d79SSunil Kumar Kori 6320365d79SSunil Kumar Kori pkts = (struct rte_mbuf **)objs; 6420365d79SSunil Kumar Kori from = objs; 6520365d79SSunil Kumar Kori n_left_from = nb_objs; 6620365d79SSunil Kumar Kori 6720365d79SSunil Kumar Kori for (i = OBJS_PER_CLINE; i < RTE_GRAPH_BURST_SIZE; i += OBJS_PER_CLINE) 6820365d79SSunil Kumar Kori rte_prefetch0(&objs[i]); 6920365d79SSunil Kumar Kori 7020365d79SSunil Kumar Kori for (i = 0; i < 4 && i < n_left_from; i++) 7120365d79SSunil Kumar Kori rte_prefetch0(rte_pktmbuf_mtod_offset(pkts[i], void *, 7220365d79SSunil Kumar Kori sizeof(struct rte_ether_hdr))); 7320365d79SSunil Kumar Kori 7420365d79SSunil Kumar Kori /* Get stream for the speculated next node */ 7520365d79SSunil Kumar Kori to_next = rte_node_next_stream_get(graph, node, next_index, nb_objs); 7620365d79SSunil Kumar Kori while (n_left_from >= 4) { 77e1a06e39SRobin Jarry struct rte_ipv6_addr ip_batch[4]; 7820365d79SSunil Kumar Kori int32_t next_hop[4]; 7920365d79SSunil Kumar Kori uint16_t next[4]; 8020365d79SSunil Kumar Kori 8120365d79SSunil Kumar Kori #if RTE_GRAPH_BURST_SIZE > 64 8220365d79SSunil Kumar Kori /* Prefetch next-next mbufs */ 8320365d79SSunil Kumar Kori if (likely(n_left_from > 11)) { 8420365d79SSunil Kumar Kori rte_prefetch0(pkts[8]); 8520365d79SSunil Kumar Kori rte_prefetch0(pkts[9]); 8620365d79SSunil Kumar Kori rte_prefetch0(pkts[10]); 8720365d79SSunil Kumar Kori rte_prefetch0(pkts[11]); 8820365d79SSunil Kumar Kori } 8920365d79SSunil Kumar Kori #endif 9020365d79SSunil Kumar Kori /* Prefetch next mbuf data */ 9120365d79SSunil Kumar Kori if (likely(n_left_from > 7)) { 9220365d79SSunil Kumar Kori rte_prefetch0(rte_pktmbuf_mtod_offset(pkts[4], void *, 9320365d79SSunil Kumar Kori sizeof(struct rte_ether_hdr))); 9420365d79SSunil Kumar Kori rte_prefetch0(rte_pktmbuf_mtod_offset(pkts[5], void *, 9520365d79SSunil Kumar Kori sizeof(struct rte_ether_hdr))); 9620365d79SSunil Kumar Kori rte_prefetch0(rte_pktmbuf_mtod_offset(pkts[6], void *, 9720365d79SSunil Kumar Kori sizeof(struct rte_ether_hdr))); 9820365d79SSunil Kumar Kori rte_prefetch0(rte_pktmbuf_mtod_offset(pkts[7], void *, 9920365d79SSunil Kumar Kori sizeof(struct rte_ether_hdr))); 10020365d79SSunil Kumar Kori } 10120365d79SSunil Kumar Kori 10220365d79SSunil Kumar Kori mbuf0 = pkts[0]; 10320365d79SSunil Kumar Kori mbuf1 = pkts[1]; 10420365d79SSunil Kumar Kori mbuf2 = pkts[2]; 10520365d79SSunil Kumar Kori mbuf3 = pkts[3]; 10620365d79SSunil Kumar Kori 10720365d79SSunil Kumar Kori pkts += 4; 10820365d79SSunil Kumar Kori n_left_from -= 4; 10920365d79SSunil Kumar Kori 11020365d79SSunil Kumar Kori /* Extract DIP of mbuf0 */ 11120365d79SSunil Kumar Kori ipv6_hdr = rte_pktmbuf_mtod_offset(mbuf0, struct rte_ipv6_hdr *, 11220365d79SSunil Kumar Kori sizeof(struct rte_ether_hdr)); 11320365d79SSunil Kumar Kori /* Extract hop_limits as ipv6 hdr is in cache */ 11420365d79SSunil Kumar Kori node_mbuf_priv1(mbuf0, dyn)->ttl = ipv6_hdr->hop_limits; 115e1a06e39SRobin Jarry ip_batch[0] = ipv6_hdr->dst_addr; 11620365d79SSunil Kumar Kori 11720365d79SSunil Kumar Kori /* Extract DIP of mbuf1 */ 11820365d79SSunil Kumar Kori ipv6_hdr = rte_pktmbuf_mtod_offset(mbuf1, struct rte_ipv6_hdr *, 11920365d79SSunil Kumar Kori sizeof(struct rte_ether_hdr)); 12020365d79SSunil Kumar Kori /* Extract hop_limits as ipv6 hdr is in cache */ 12120365d79SSunil Kumar Kori node_mbuf_priv1(mbuf1, dyn)->ttl = ipv6_hdr->hop_limits; 122e1a06e39SRobin Jarry ip_batch[1] = ipv6_hdr->dst_addr; 12320365d79SSunil Kumar Kori 12420365d79SSunil Kumar Kori /* Extract DIP of mbuf2 */ 12520365d79SSunil Kumar Kori ipv6_hdr = rte_pktmbuf_mtod_offset(mbuf2, struct rte_ipv6_hdr *, 12620365d79SSunil Kumar Kori sizeof(struct rte_ether_hdr)); 12720365d79SSunil Kumar Kori /* Extract hop_limits as ipv6 hdr is in cache */ 12820365d79SSunil Kumar Kori node_mbuf_priv1(mbuf2, dyn)->ttl = ipv6_hdr->hop_limits; 129e1a06e39SRobin Jarry ip_batch[2] = ipv6_hdr->dst_addr; 13020365d79SSunil Kumar Kori 13120365d79SSunil Kumar Kori /* Extract DIP of mbuf3 */ 13220365d79SSunil Kumar Kori ipv6_hdr = rte_pktmbuf_mtod_offset(mbuf3, struct rte_ipv6_hdr *, 13320365d79SSunil Kumar Kori sizeof(struct rte_ether_hdr)); 13420365d79SSunil Kumar Kori /* Extract hop_limits as ipv6 hdr is in cache */ 13520365d79SSunil Kumar Kori node_mbuf_priv1(mbuf3, dyn)->ttl = ipv6_hdr->hop_limits; 136e1a06e39SRobin Jarry ip_batch[3] = ipv6_hdr->dst_addr; 13720365d79SSunil Kumar Kori 1384a53ecebSAmit Prakash Shukla rte_lpm6_lookup_bulk_func(lpm6, ip_batch, next_hop, 4); 13920365d79SSunil Kumar Kori 14020365d79SSunil Kumar Kori next_hop[0] = (next_hop[0] < 0) ? (int32_t)drop_nh : next_hop[0]; 14120365d79SSunil Kumar Kori node_mbuf_priv1(mbuf0, dyn)->nh = (uint16_t)next_hop[0]; 14220365d79SSunil Kumar Kori next[0] = (uint16_t)(next_hop[0] >> 16); 14320365d79SSunil Kumar Kori 14420365d79SSunil Kumar Kori next_hop[1] = (next_hop[1] < 0) ? (int32_t)drop_nh : next_hop[1]; 14520365d79SSunil Kumar Kori node_mbuf_priv1(mbuf1, dyn)->nh = (uint16_t)next_hop[1]; 14620365d79SSunil Kumar Kori next[1] = (uint16_t)(next_hop[1] >> 16); 14720365d79SSunil Kumar Kori 14820365d79SSunil Kumar Kori next_hop[2] = (next_hop[2] < 0) ? (int32_t)drop_nh : next_hop[2]; 14920365d79SSunil Kumar Kori node_mbuf_priv1(mbuf2, dyn)->nh = (uint16_t)next_hop[2]; 15020365d79SSunil Kumar Kori next[2] = (uint16_t)(next_hop[2] >> 16); 15120365d79SSunil Kumar Kori 15220365d79SSunil Kumar Kori next_hop[3] = (next_hop[3] < 0) ? (int32_t)drop_nh : next_hop[3]; 15320365d79SSunil Kumar Kori node_mbuf_priv1(mbuf3, dyn)->nh = (uint16_t)next_hop[3]; 15420365d79SSunil Kumar Kori next[3] = (uint16_t)(next_hop[3] >> 16); 15520365d79SSunil Kumar Kori 15620365d79SSunil Kumar Kori rte_edge_t fix_spec = ((next_index == next[0]) && 15720365d79SSunil Kumar Kori (next_index == next[1]) && 15820365d79SSunil Kumar Kori (next_index == next[2]) && 15920365d79SSunil Kumar Kori (next_index == next[3])); 16020365d79SSunil Kumar Kori 16120365d79SSunil Kumar Kori if (unlikely(fix_spec == 0)) { 16220365d79SSunil Kumar Kori /* Copy things successfully speculated till now */ 16320365d79SSunil Kumar Kori rte_memcpy(to_next, from, last_spec * sizeof(from[0])); 16420365d79SSunil Kumar Kori from += last_spec; 16520365d79SSunil Kumar Kori to_next += last_spec; 16620365d79SSunil Kumar Kori held += last_spec; 16720365d79SSunil Kumar Kori last_spec = 0; 16820365d79SSunil Kumar Kori 16920365d79SSunil Kumar Kori /* Next0 */ 17020365d79SSunil Kumar Kori if (next_index == next[0]) { 17120365d79SSunil Kumar Kori to_next[0] = from[0]; 17220365d79SSunil Kumar Kori to_next++; 17320365d79SSunil Kumar Kori held++; 17420365d79SSunil Kumar Kori } else { 17520365d79SSunil Kumar Kori rte_node_enqueue_x1(graph, node, next[0], from[0]); 17620365d79SSunil Kumar Kori } 17720365d79SSunil Kumar Kori 17820365d79SSunil Kumar Kori /* Next1 */ 17920365d79SSunil Kumar Kori if (next_index == next[1]) { 18020365d79SSunil Kumar Kori to_next[0] = from[1]; 18120365d79SSunil Kumar Kori to_next++; 18220365d79SSunil Kumar Kori held++; 18320365d79SSunil Kumar Kori } else { 18420365d79SSunil Kumar Kori rte_node_enqueue_x1(graph, node, next[1], from[1]); 18520365d79SSunil Kumar Kori } 18620365d79SSunil Kumar Kori 18720365d79SSunil Kumar Kori /* Next2 */ 18820365d79SSunil Kumar Kori if (next_index == next[2]) { 18920365d79SSunil Kumar Kori to_next[0] = from[2]; 19020365d79SSunil Kumar Kori to_next++; 19120365d79SSunil Kumar Kori held++; 19220365d79SSunil Kumar Kori } else { 19320365d79SSunil Kumar Kori rte_node_enqueue_x1(graph, node, next[2], from[2]); 19420365d79SSunil Kumar Kori } 19520365d79SSunil Kumar Kori 19620365d79SSunil Kumar Kori /* Next3 */ 19720365d79SSunil Kumar Kori if (next_index == next[3]) { 19820365d79SSunil Kumar Kori to_next[0] = from[3]; 19920365d79SSunil Kumar Kori to_next++; 20020365d79SSunil Kumar Kori held++; 20120365d79SSunil Kumar Kori } else { 20220365d79SSunil Kumar Kori rte_node_enqueue_x1(graph, node, next[3], from[3]); 20320365d79SSunil Kumar Kori } 20420365d79SSunil Kumar Kori 20520365d79SSunil Kumar Kori from += 4; 20620365d79SSunil Kumar Kori } else { 20720365d79SSunil Kumar Kori last_spec += 4; 20820365d79SSunil Kumar Kori } 20920365d79SSunil Kumar Kori } 21020365d79SSunil Kumar Kori 21120365d79SSunil Kumar Kori while (n_left_from > 0) { 21220365d79SSunil Kumar Kori uint32_t next_hop; 21320365d79SSunil Kumar Kori uint16_t next0; 21420365d79SSunil Kumar Kori 21520365d79SSunil Kumar Kori mbuf0 = pkts[0]; 21620365d79SSunil Kumar Kori 21720365d79SSunil Kumar Kori pkts += 1; 21820365d79SSunil Kumar Kori n_left_from -= 1; 21920365d79SSunil Kumar Kori 22020365d79SSunil Kumar Kori /* Extract DIP of mbuf0 */ 22120365d79SSunil Kumar Kori ipv6_hdr = rte_pktmbuf_mtod_offset(mbuf0, struct rte_ipv6_hdr *, 22220365d79SSunil Kumar Kori sizeof(struct rte_ether_hdr)); 22320365d79SSunil Kumar Kori /* Extract TTL as IPv6 hdr is in cache */ 22420365d79SSunil Kumar Kori node_mbuf_priv1(mbuf0, dyn)->ttl = ipv6_hdr->hop_limits; 22520365d79SSunil Kumar Kori 226e1a06e39SRobin Jarry rc = rte_lpm6_lookup(lpm6, &ipv6_hdr->dst_addr, &next_hop); 22720365d79SSunil Kumar Kori next_hop = (rc == 0) ? next_hop : drop_nh; 22820365d79SSunil Kumar Kori 22920365d79SSunil Kumar Kori node_mbuf_priv1(mbuf0, dyn)->nh = (uint16_t)next_hop; 23020365d79SSunil Kumar Kori next_hop = next_hop >> 16; 23120365d79SSunil Kumar Kori next0 = (uint16_t)next_hop; 23220365d79SSunil Kumar Kori 23320365d79SSunil Kumar Kori if (unlikely(next_index ^ next0)) { 23420365d79SSunil Kumar Kori /* Copy things successfully speculated till now */ 23520365d79SSunil Kumar Kori rte_memcpy(to_next, from, last_spec * sizeof(from[0])); 23620365d79SSunil Kumar Kori from += last_spec; 23720365d79SSunil Kumar Kori to_next += last_spec; 23820365d79SSunil Kumar Kori held += last_spec; 23920365d79SSunil Kumar Kori last_spec = 0; 24020365d79SSunil Kumar Kori 24120365d79SSunil Kumar Kori rte_node_enqueue_x1(graph, node, next0, from[0]); 24220365d79SSunil Kumar Kori from += 1; 24320365d79SSunil Kumar Kori } else { 24420365d79SSunil Kumar Kori last_spec += 1; 24520365d79SSunil Kumar Kori } 24620365d79SSunil Kumar Kori } 24720365d79SSunil Kumar Kori 24820365d79SSunil Kumar Kori /* !!! Home run !!! */ 24920365d79SSunil Kumar Kori if (likely(last_spec == nb_objs)) { 25020365d79SSunil Kumar Kori rte_node_next_stream_move(graph, node, next_index); 25120365d79SSunil Kumar Kori return nb_objs; 25220365d79SSunil Kumar Kori } 25320365d79SSunil Kumar Kori held += last_spec; 25420365d79SSunil Kumar Kori rte_memcpy(to_next, from, last_spec * sizeof(from[0])); 25520365d79SSunil Kumar Kori rte_node_next_stream_put(graph, node, next_index, held); 25620365d79SSunil Kumar Kori 25720365d79SSunil Kumar Kori return nb_objs; 25820365d79SSunil Kumar Kori } 25920365d79SSunil Kumar Kori 26020365d79SSunil Kumar Kori int 261*2cfebc3fSRobin Jarry rte_node_ip6_route_add(const struct rte_ipv6_addr *ip, uint8_t depth, uint16_t next_hop, 26220365d79SSunil Kumar Kori enum rte_node_ip6_lookup_next next_node) 26320365d79SSunil Kumar Kori { 26420365d79SSunil Kumar Kori char abuf[INET6_ADDRSTRLEN]; 26520365d79SSunil Kumar Kori uint8_t socket; 26620365d79SSunil Kumar Kori uint32_t val; 26720365d79SSunil Kumar Kori int ret; 26820365d79SSunil Kumar Kori 269*2cfebc3fSRobin Jarry inet_ntop(AF_INET6, ip, abuf, sizeof(abuf)); 27020365d79SSunil Kumar Kori /* Embedded next node id into 24 bit next hop */ 27120365d79SSunil Kumar Kori val = ((next_node << 16) | next_hop) & ((1ull << 24) - 1); 27220365d79SSunil Kumar Kori node_dbg("ip6_lookup", "LPM: Adding route %s / %d nh (0x%x)", abuf, 27320365d79SSunil Kumar Kori depth, val); 27420365d79SSunil Kumar Kori 27520365d79SSunil Kumar Kori for (socket = 0; socket < RTE_MAX_NUMA_NODES; socket++) { 27620365d79SSunil Kumar Kori if (!ip6_lookup_nm.lpm_tbl[socket]) 27720365d79SSunil Kumar Kori continue; 27820365d79SSunil Kumar Kori 279*2cfebc3fSRobin Jarry ret = rte_lpm6_add(ip6_lookup_nm.lpm_tbl[socket], ip, depth, val); 28020365d79SSunil Kumar Kori if (ret < 0) { 28120365d79SSunil Kumar Kori node_err("ip6_lookup", 28220365d79SSunil Kumar Kori "Unable to add entry %s / %d nh (%x) to LPM " 283ae282b06SDavid Marchand "table on sock %d, rc=%d", 28420365d79SSunil Kumar Kori abuf, depth, val, socket, ret); 28520365d79SSunil Kumar Kori return ret; 28620365d79SSunil Kumar Kori } 28720365d79SSunil Kumar Kori } 28820365d79SSunil Kumar Kori 28920365d79SSunil Kumar Kori return 0; 29020365d79SSunil Kumar Kori } 29120365d79SSunil Kumar Kori 29220365d79SSunil Kumar Kori static int 29320365d79SSunil Kumar Kori setup_lpm6(struct ip6_lookup_node_main *nm, int socket) 29420365d79SSunil Kumar Kori { 29520365d79SSunil Kumar Kori struct rte_lpm6_config config_ipv6; 29620365d79SSunil Kumar Kori char s[RTE_LPM6_NAMESIZE]; 29720365d79SSunil Kumar Kori 29820365d79SSunil Kumar Kori /* One LPM table per socket */ 29920365d79SSunil Kumar Kori if (nm->lpm_tbl[socket]) 30020365d79SSunil Kumar Kori return 0; 30120365d79SSunil Kumar Kori 30220365d79SSunil Kumar Kori /* create the LPM table */ 30320365d79SSunil Kumar Kori config_ipv6.max_rules = IPV6_L3FWD_LPM_MAX_RULES; 30420365d79SSunil Kumar Kori config_ipv6.number_tbl8s = IPV6_L3FWD_LPM_NUMBER_TBL8S; 30520365d79SSunil Kumar Kori config_ipv6.flags = 0; 30620365d79SSunil Kumar Kori snprintf(s, sizeof(s), "IPV6_L3FWD_LPM_%d", socket); 30720365d79SSunil Kumar Kori nm->lpm_tbl[socket] = rte_lpm6_create(s, socket, &config_ipv6); 30820365d79SSunil Kumar Kori if (nm->lpm_tbl[socket] == NULL) 30920365d79SSunil Kumar Kori return -rte_errno; 31020365d79SSunil Kumar Kori 31120365d79SSunil Kumar Kori return 0; 31220365d79SSunil Kumar Kori } 31320365d79SSunil Kumar Kori 31420365d79SSunil Kumar Kori static int 31520365d79SSunil Kumar Kori ip6_lookup_node_init(const struct rte_graph *graph, struct rte_node *node) 31620365d79SSunil Kumar Kori { 31720365d79SSunil Kumar Kori uint16_t socket, lcore_id; 31820365d79SSunil Kumar Kori static uint8_t init_once; 31920365d79SSunil Kumar Kori int rc; 32020365d79SSunil Kumar Kori 32120365d79SSunil Kumar Kori RTE_SET_USED(graph); 32220365d79SSunil Kumar Kori RTE_BUILD_BUG_ON(sizeof(struct ip6_lookup_node_ctx) > RTE_NODE_CTX_SZ); 32320365d79SSunil Kumar Kori 32420365d79SSunil Kumar Kori if (!init_once) { 32520365d79SSunil Kumar Kori node_mbuf_priv1_dynfield_offset = 32620365d79SSunil Kumar Kori rte_mbuf_dynfield_register( 32720365d79SSunil Kumar Kori &node_mbuf_priv1_dynfield_desc); 32820365d79SSunil Kumar Kori if (node_mbuf_priv1_dynfield_offset < 0) 32920365d79SSunil Kumar Kori return -rte_errno; 33020365d79SSunil Kumar Kori 33120365d79SSunil Kumar Kori /* Setup LPM tables for all sockets */ 33220365d79SSunil Kumar Kori RTE_LCORE_FOREACH(lcore_id) 33320365d79SSunil Kumar Kori { 33420365d79SSunil Kumar Kori socket = rte_lcore_to_socket_id(lcore_id); 33520365d79SSunil Kumar Kori rc = setup_lpm6(&ip6_lookup_nm, socket); 33620365d79SSunil Kumar Kori if (rc) { 33720365d79SSunil Kumar Kori node_err("ip6_lookup", 33820365d79SSunil Kumar Kori "Failed to setup lpm6 tbl for " 33920365d79SSunil Kumar Kori "sock %u, rc=%d", socket, rc); 34020365d79SSunil Kumar Kori return rc; 34120365d79SSunil Kumar Kori } 34220365d79SSunil Kumar Kori } 34320365d79SSunil Kumar Kori init_once = 1; 34420365d79SSunil Kumar Kori } 34520365d79SSunil Kumar Kori 34620365d79SSunil Kumar Kori /* Update socket's LPM and mbuf dyn priv1 offset in node ctx */ 34720365d79SSunil Kumar Kori IP6_LOOKUP_NODE_LPM(node->ctx) = ip6_lookup_nm.lpm_tbl[graph->socket]; 34820365d79SSunil Kumar Kori IP6_LOOKUP_NODE_PRIV1_OFF(node->ctx) = 34920365d79SSunil Kumar Kori node_mbuf_priv1_dynfield_offset; 35020365d79SSunil Kumar Kori 35120365d79SSunil Kumar Kori node_dbg("ip6_lookup", "Initialized ip6_lookup node"); 35220365d79SSunil Kumar Kori 35320365d79SSunil Kumar Kori return 0; 35420365d79SSunil Kumar Kori } 35520365d79SSunil Kumar Kori 35620365d79SSunil Kumar Kori static struct rte_node_register ip6_lookup_node = { 35720365d79SSunil Kumar Kori .process = ip6_lookup_node_process_scalar, 35820365d79SSunil Kumar Kori .name = "ip6_lookup", 35920365d79SSunil Kumar Kori 36020365d79SSunil Kumar Kori .init = ip6_lookup_node_init, 36120365d79SSunil Kumar Kori 362d529aa72SRakesh Kudurumalla .nb_edges = RTE_NODE_IP6_LOOKUP_NEXT_PKT_DROP + 1, 36320365d79SSunil Kumar Kori .next_nodes = { 36420365d79SSunil Kumar Kori [RTE_NODE_IP6_LOOKUP_NEXT_REWRITE] = "ip6_rewrite", 36520365d79SSunil Kumar Kori [RTE_NODE_IP6_LOOKUP_NEXT_PKT_DROP] = "pkt_drop", 36620365d79SSunil Kumar Kori }, 36720365d79SSunil Kumar Kori }; 36820365d79SSunil Kumar Kori 36920365d79SSunil Kumar Kori RTE_NODE_REGISTER(ip6_lookup_node); 370