| 403 | #define NAT64LSN_HAS_PREFIX4 0x01 |
| 404 | #define NAT64LSN_HAS_PREFIX6 0x02 |
| 405 | static void |
| 406 | nat64lsn_create(const char *name, uint8_t set, int ac, char **av) |
| 407 | { |
| 408 | char buf[sizeof(ipfw_obj_lheader) + sizeof(ipfw_nat64lsn_cfg)]; |
| 409 | ipfw_nat64lsn_cfg *cfg; |
| 410 | ipfw_obj_lheader *olh; |
| 411 | int tcmd, flags; |
| 412 | char *opt; |
| 413 | |
| 414 | memset(&buf, 0, sizeof(buf)); |
| 415 | olh = (ipfw_obj_lheader *)buf; |
| 416 | cfg = (ipfw_nat64lsn_cfg *)(olh + 1); |
| 417 | |
| 418 | /* Some reasonable defaults */ |
| 419 | inet_pton(AF_INET6, "64:ff9b::", &cfg->prefix6); |
| 420 | cfg->plen6 = 96; |
| 421 | cfg->set = set; |
| 422 | cfg->max_ports = NAT64LSN_MAX_PORTS; |
| 423 | cfg->jmaxlen = NAT64LSN_JMAXLEN; |
| 424 | cfg->nh_delete_delay = NAT64LSN_HOST_AGE; |
| 425 | cfg->pg_delete_delay = NAT64LSN_PG_AGE; |
| 426 | cfg->st_syn_ttl = NAT64LSN_TCP_SYN_AGE; |
| 427 | cfg->st_estab_ttl = NAT64LSN_TCP_EST_AGE; |
| 428 | cfg->st_close_ttl = NAT64LSN_TCP_FIN_AGE; |
| 429 | cfg->st_udp_ttl = NAT64LSN_UDP_AGE; |
| 430 | cfg->st_icmp_ttl = NAT64LSN_ICMP_AGE; |
| 431 | flags = NAT64LSN_HAS_PREFIX6; |
| 432 | while (ac > 0) { |
| 433 | tcmd = get_token(nat64newcmds, *av, "option"); |
| 434 | opt = *av; |
| 435 | ac--; av++; |
| 436 | |
| 437 | switch (tcmd) { |
| 438 | case TOK_PREFIX4: |
| 439 | NEED1("IPv4 prefix required"); |
| 440 | nat64lsn_parse_prefix(*av, AF_INET, &cfg->prefix4, |
| 441 | &cfg->plen4); |
| 442 | flags |= NAT64LSN_HAS_PREFIX4; |
| 443 | ac--; av++; |
| 444 | break; |
| 445 | case TOK_PREFIX6: |
| 446 | NEED1("IPv6 prefix required"); |
| 447 | nat64lsn_parse_prefix(*av, AF_INET6, &cfg->prefix6, |
| 448 | &cfg->plen6); |
| 449 | if (ipfw_check_nat64prefix(&cfg->prefix6, |
| 450 | cfg->plen6) != 0 && |
| 451 | !IN6_IS_ADDR_UNSPECIFIED(&cfg->prefix6)) |
| 452 | errx(EX_USAGE, "Bad prefix6 %s", *av); |
| 453 | |
| 454 | ac--; av++; |
| 455 | break; |
| 456 | case TOK_JMAXLEN: |
| 457 | NEED1("job queue length required"); |
| 458 | cfg->jmaxlen = nat64lsn_parse_int(*av, opt); |
| 459 | ac--; av++; |
| 460 | break; |
| 461 | case TOK_MAX_PORTS: |
| 462 | NEED1("Max per-user ports required"); |
no test coverage detected