| 106 | } |
| 107 | |
| 108 | int |
| 109 | ipsec_sad_create(const char *name, struct ipsec_sad *sad, |
| 110 | int socket_id, struct ipsec_sa_cnt *sa_cnt) |
| 111 | { |
| 112 | int ret; |
| 113 | struct rte_ipsec_sad_conf sad_conf; |
| 114 | char sad_name[RTE_IPSEC_SAD_NAMESIZE]; |
| 115 | |
| 116 | if ((name == NULL) || (sad == NULL) || (sa_cnt == NULL)) |
| 117 | return -EINVAL; |
| 118 | |
| 119 | ret = snprintf(sad_name, RTE_IPSEC_SAD_NAMESIZE, "%s_v4", name); |
| 120 | if (ret < 0 || ret >= RTE_IPSEC_SAD_NAMESIZE) |
| 121 | return -ENAMETOOLONG; |
| 122 | |
| 123 | sad_conf.socket_id = socket_id; |
| 124 | sad_conf.flags = 0; |
| 125 | /* Make SAD have extra 25% of required number of entries */ |
| 126 | sad_conf.max_sa[RTE_IPSEC_SAD_SPI_ONLY] = sa_cnt->nb_v4 * 5 / 4; |
| 127 | sad_conf.max_sa[RTE_IPSEC_SAD_SPI_DIP] = 0; |
| 128 | sad_conf.max_sa[RTE_IPSEC_SAD_SPI_DIP_SIP] = 0; |
| 129 | |
| 130 | if (sa_cnt->nb_v4 != 0) { |
| 131 | sad->sad_v4 = rte_ipsec_sad_create(sad_name, &sad_conf); |
| 132 | if (sad->sad_v4 == NULL) |
| 133 | return -rte_errno; |
| 134 | } |
| 135 | |
| 136 | ret = snprintf(sad_name, RTE_IPSEC_SAD_NAMESIZE, "%s_v6", name); |
| 137 | if (ret < 0 || ret >= RTE_IPSEC_SAD_NAMESIZE) |
| 138 | return -ENAMETOOLONG; |
| 139 | sad_conf.flags = RTE_IPSEC_SAD_FLAG_IPV6; |
| 140 | sad_conf.max_sa[RTE_IPSEC_SAD_SPI_ONLY] = sa_cnt->nb_v6 * 5 / 4; |
| 141 | |
| 142 | if (sa_cnt->nb_v6 != 0) { |
| 143 | sad->sad_v6 = rte_ipsec_sad_create(name, &sad_conf); |
| 144 | if (sad->sad_v6 == NULL) |
| 145 | return -rte_errno; |
| 146 | } |
| 147 | |
| 148 | return 0; |
| 149 | } |
no test coverage detected