| 217 | #define NAT64STL_HAS_TABLE6 0x02 |
| 218 | #define NAT64STL_HAS_PREFIX6 0x04 |
| 219 | static void |
| 220 | nat64stl_create(const char *name, uint8_t set, int ac, char *av[]) |
| 221 | { |
| 222 | char buf[sizeof(ipfw_obj_lheader) + sizeof(ipfw_nat64stl_cfg)]; |
| 223 | ipfw_nat64stl_cfg *cfg; |
| 224 | ipfw_obj_lheader *olh; |
| 225 | int tcmd, flags; |
| 226 | char *p; |
| 227 | |
| 228 | memset(buf, 0, sizeof(buf)); |
| 229 | olh = (ipfw_obj_lheader *)buf; |
| 230 | cfg = (ipfw_nat64stl_cfg *)(olh + 1); |
| 231 | |
| 232 | /* Some reasonable defaults */ |
| 233 | inet_pton(AF_INET6, "64:ff9b::", &cfg->prefix6); |
| 234 | cfg->plen6 = 96; |
| 235 | cfg->set = set; |
| 236 | flags = NAT64STL_HAS_PREFIX6; |
| 237 | while (ac > 0) { |
| 238 | tcmd = get_token(nat64newcmds, *av, "option"); |
| 239 | ac--; av++; |
| 240 | |
| 241 | switch (tcmd) { |
| 242 | case TOK_TABLE4: |
| 243 | NEED1("table name required"); |
| 244 | table_fill_ntlv(&cfg->ntlv4, *av, set, 4); |
| 245 | flags |= NAT64STL_HAS_TABLE4; |
| 246 | ac--; av++; |
| 247 | break; |
| 248 | case TOK_TABLE6: |
| 249 | NEED1("table name required"); |
| 250 | table_fill_ntlv(&cfg->ntlv6, *av, set, 6); |
| 251 | flags |= NAT64STL_HAS_TABLE6; |
| 252 | ac--; av++; |
| 253 | break; |
| 254 | case TOK_PREFIX6: |
| 255 | NEED1("IPv6 prefix6 required"); |
| 256 | if ((p = strchr(*av, '/')) != NULL) |
| 257 | *p++ = '\0'; |
| 258 | else |
| 259 | errx(EX_USAGE, |
| 260 | "Prefix length required: %s", *av); |
| 261 | if (inet_pton(AF_INET6, *av, &cfg->prefix6) != 1) |
| 262 | errx(EX_USAGE, |
| 263 | "Bad prefix: %s", *av); |
| 264 | cfg->plen6 = strtol(p, NULL, 10); |
| 265 | if (ipfw_check_nat64prefix(&cfg->prefix6, |
| 266 | cfg->plen6) != 0) |
| 267 | errx(EX_USAGE, |
| 268 | "Bad prefix length: %s", p); |
| 269 | flags |= NAT64STL_HAS_PREFIX6; |
| 270 | ac--; av++; |
| 271 | break; |
| 272 | case TOK_LOG: |
| 273 | cfg->flags |= NAT64_LOG; |
| 274 | break; |
| 275 | case TOK_LOGOFF: |
| 276 | cfg->flags &= ~NAT64_LOG; |
no test coverage detected