1 /*- 2 * BSD LICENSE 3 * 4 * Copyright(c) 2016 Intel Corporation. All rights reserved. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * * Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * * Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the 16 * distribution. 17 * * Neither the name of Intel Corporation nor the names of its 18 * contributors may be used to endorse or promote products derived 19 * from this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34 /* 35 * Routing Table (RT) 36 */ 37 #include <rte_lpm.h> 38 #include <rte_errno.h> 39 40 #include "ipsec.h" 41 42 #define RT_IPV4_MAX_RULES 64 43 44 struct ipv4_route { 45 uint32_t ip; 46 uint8_t depth; 47 uint8_t if_out; 48 }; 49 50 /* In the default routing table we have: 51 * ep0 protected ports 0 and 1, and unprotected ports 2 and 3. 52 */ 53 static struct ipv4_route rt_ipv4_ep0[] = { 54 { IPv4(172, 16, 2, 5), 32, 0 }, 55 { IPv4(172, 16, 2, 6), 32, 0 }, 56 { IPv4(172, 16, 2, 7), 32, 1 }, 57 { IPv4(172, 16, 2, 8), 32, 1 }, 58 59 { IPv4(192, 168, 115, 0), 24, 2 }, 60 { IPv4(192, 168, 116, 0), 24, 2 }, 61 { IPv4(192, 168, 117, 0), 24, 3 }, 62 { IPv4(192, 168, 118, 0), 24, 3 }, 63 64 { IPv4(192, 168, 210, 0), 24, 2 }, 65 66 { IPv4(192, 168, 240, 0), 24, 2 }, 67 { IPv4(192, 168, 250, 0), 24, 0 } 68 }; 69 70 /* In the default routing table we have: 71 * ep1 protected ports 0 and 1, and unprotected ports 2 and 3. 72 */ 73 static struct ipv4_route rt_ipv4_ep1[] = { 74 { IPv4(172, 16, 1, 5), 32, 2 }, 75 { IPv4(172, 16, 1, 6), 32, 2 }, 76 { IPv4(172, 16, 1, 7), 32, 3 }, 77 { IPv4(172, 16, 1, 8), 32, 3 }, 78 79 { IPv4(192, 168, 105, 0), 24, 0 }, 80 { IPv4(192, 168, 106, 0), 24, 0 }, 81 { IPv4(192, 168, 107, 0), 24, 1 }, 82 { IPv4(192, 168, 108, 0), 24, 1 }, 83 84 { IPv4(192, 168, 200, 0), 24, 0 }, 85 86 { IPv4(192, 168, 240, 0), 24, 2 }, 87 { IPv4(192, 168, 250, 0), 24, 0 } 88 }; 89 90 void 91 rt_init(struct socket_ctx *ctx, int socket_id, unsigned ep) 92 { 93 char name[PATH_MAX]; 94 unsigned i; 95 int ret; 96 struct rte_lpm *lpm; 97 struct ipv4_route *rt; 98 char a, b, c, d; 99 unsigned nb_routes; 100 struct rte_lpm_config conf = { 0 }; 101 102 if (ctx == NULL) 103 rte_exit(EXIT_FAILURE, "NULL context.\n"); 104 105 if (ctx->rt_ipv4 != NULL) 106 rte_exit(EXIT_FAILURE, "Routing Table for socket %u already " 107 "initialized\n", socket_id); 108 109 printf("Creating Routing Table (RT) context with %u max routes\n", 110 RT_IPV4_MAX_RULES); 111 112 if (ep == 0) { 113 rt = rt_ipv4_ep0; 114 nb_routes = RTE_DIM(rt_ipv4_ep0); 115 } else if (ep == 1) { 116 rt = rt_ipv4_ep1; 117 nb_routes = RTE_DIM(rt_ipv4_ep1); 118 } else 119 rte_exit(EXIT_FAILURE, "Invalid EP value %u. Only 0 or 1 " 120 "supported.\n", ep); 121 122 /* create the LPM table */ 123 snprintf(name, sizeof(name), "%s_%u", "rt_ipv4", socket_id); 124 conf.max_rules = RT_IPV4_MAX_RULES; 125 conf.number_tbl8s = RTE_LPM_TBL8_NUM_ENTRIES; 126 lpm = rte_lpm_create(name, socket_id, &conf); 127 if (lpm == NULL) 128 rte_exit(EXIT_FAILURE, "Unable to create LPM table " 129 "on socket %d\n", socket_id); 130 131 /* populate the LPM table */ 132 for (i = 0; i < nb_routes; i++) { 133 ret = rte_lpm_add(lpm, rt[i].ip, rt[i].depth, rt[i].if_out); 134 if (ret < 0) 135 rte_exit(EXIT_FAILURE, "Unable to add entry num %u to " 136 "LPM table on socket %d\n", i, socket_id); 137 138 uint32_t_to_char(rt[i].ip, &a, &b, &c, &d); 139 printf("LPM: Adding route %hhu.%hhu.%hhu.%hhu/%hhu (%hhu)\n", 140 a, b, c, d, rt[i].depth, rt[i].if_out); 141 } 142 143 ctx->rt_ipv4 = (struct rt_ctx *)lpm; 144 } 145