| 191 | #define NPTV6_HAS_EXTPREFIX 0x02 |
| 192 | #define NPTV6_HAS_PREFIXLEN 0x04 |
| 193 | static void |
| 194 | nptv6_create(const char *name, uint8_t set, int ac, char *av[]) |
| 195 | { |
| 196 | char buf[sizeof(ipfw_obj_lheader) + sizeof(ipfw_nptv6_cfg)]; |
| 197 | struct in6_addr mask; |
| 198 | ipfw_nptv6_cfg *cfg; |
| 199 | ipfw_obj_lheader *olh; |
| 200 | int tcmd, flags, plen; |
| 201 | char *p; |
| 202 | |
| 203 | plen = 0; |
| 204 | memset(buf, 0, sizeof(buf)); |
| 205 | olh = (ipfw_obj_lheader *)buf; |
| 206 | cfg = (ipfw_nptv6_cfg *)(olh + 1); |
| 207 | cfg->set = set; |
| 208 | flags = 0; |
| 209 | while (ac > 0) { |
| 210 | tcmd = get_token(nptv6newcmds, *av, "option"); |
| 211 | ac--; av++; |
| 212 | |
| 213 | switch (tcmd) { |
| 214 | case TOK_INTPREFIX: |
| 215 | NEED1("IPv6 prefix required"); |
| 216 | nptv6_parse_prefix(*av, &cfg->internal, &plen); |
| 217 | flags |= NPTV6_HAS_INTPREFIX; |
| 218 | if (plen > 0) |
| 219 | goto check_prefix; |
| 220 | ac--; av++; |
| 221 | break; |
| 222 | case TOK_EXTPREFIX: |
| 223 | if (flags & NPTV6_HAS_EXTPREFIX) |
| 224 | errx(EX_USAGE, |
| 225 | "Only one ext_prefix or ext_if allowed"); |
| 226 | NEED1("IPv6 prefix required"); |
| 227 | nptv6_parse_prefix(*av, &cfg->external, &plen); |
| 228 | flags |= NPTV6_HAS_EXTPREFIX; |
| 229 | if (plen > 0) |
| 230 | goto check_prefix; |
| 231 | ac--; av++; |
| 232 | break; |
| 233 | case TOK_EXTIF: |
| 234 | if (flags & NPTV6_HAS_EXTPREFIX) |
| 235 | errx(EX_USAGE, |
| 236 | "Only one ext_prefix or ext_if allowed"); |
| 237 | NEED1("Interface name required"); |
| 238 | if (strlen(*av) >= sizeof(cfg->if_name)) |
| 239 | errx(EX_USAGE, "Invalid interface name"); |
| 240 | flags |= NPTV6_HAS_EXTPREFIX; |
| 241 | cfg->flags |= NPTV6_DYNAMIC_PREFIX; |
| 242 | strncpy(cfg->if_name, *av, sizeof(cfg->if_name)); |
| 243 | ac--; av++; |
| 244 | break; |
| 245 | case TOK_PREFIXLEN: |
| 246 | NEED1("IPv6 prefix length required"); |
| 247 | plen = strtol(*av, &p, 10); |
| 248 | check_prefix: |
| 249 | if (*p != '\0' || plen < 8 || plen > 64) |
| 250 | errx(EX_USAGE, "wrong prefix length: %s", *av); |
no test coverage detected