Changeset View
Changeset View
Standalone View
Standalone View
head/sbin/ipfw/nptv6.c
Show First 20 Lines • Show All 146 Lines • ▼ Show 20 Lines | nptv6_fill_ntlv(ipfw_obj_ntlv *ntlv, const char *name, uint8_t set) | ||||
ntlv->set = set; | ntlv->set = set; | ||||
strlcpy(ntlv->name, name, sizeof(ntlv->name)); | strlcpy(ntlv->name, name, sizeof(ntlv->name)); | ||||
} | } | ||||
static struct _s_x nptv6newcmds[] = { | static struct _s_x nptv6newcmds[] = { | ||||
{ "int_prefix", TOK_INTPREFIX }, | { "int_prefix", TOK_INTPREFIX }, | ||||
{ "ext_prefix", TOK_EXTPREFIX }, | { "ext_prefix", TOK_EXTPREFIX }, | ||||
{ "prefixlen", TOK_PREFIXLEN }, | { "prefixlen", TOK_PREFIXLEN }, | ||||
{ "ext_if", TOK_EXTIF }, | |||||
{ NULL, 0 } | { NULL, 0 } | ||||
}; | }; | ||||
static void | static void | ||||
nptv6_parse_prefix(const char *arg, struct in6_addr *prefix, int *len) | nptv6_parse_prefix(const char *arg, struct in6_addr *prefix, int *len) | ||||
{ | { | ||||
char *p, *l; | char *p, *l; | ||||
▲ Show 20 Lines • Show All 46 Lines • ▼ Show 20 Lines | case TOK_INTPREFIX: | ||||
NEED1("IPv6 prefix required"); | NEED1("IPv6 prefix required"); | ||||
nptv6_parse_prefix(*av, &cfg->internal, &plen); | nptv6_parse_prefix(*av, &cfg->internal, &plen); | ||||
flags |= NPTV6_HAS_INTPREFIX; | flags |= NPTV6_HAS_INTPREFIX; | ||||
if (plen > 0) | if (plen > 0) | ||||
goto check_prefix; | goto check_prefix; | ||||
ac--; av++; | ac--; av++; | ||||
break; | break; | ||||
case TOK_EXTPREFIX: | case TOK_EXTPREFIX: | ||||
if (flags & NPTV6_HAS_EXTPREFIX) | |||||
errx(EX_USAGE, | |||||
"Only one ext_prefix or ext_if allowed"); | |||||
NEED1("IPv6 prefix required"); | NEED1("IPv6 prefix required"); | ||||
nptv6_parse_prefix(*av, &cfg->external, &plen); | nptv6_parse_prefix(*av, &cfg->external, &plen); | ||||
flags |= NPTV6_HAS_EXTPREFIX; | flags |= NPTV6_HAS_EXTPREFIX; | ||||
if (plen > 0) | if (plen > 0) | ||||
goto check_prefix; | goto check_prefix; | ||||
ac--; av++; | ac--; av++; | ||||
break; | break; | ||||
case TOK_EXTIF: | |||||
if (flags & NPTV6_HAS_EXTPREFIX) | |||||
errx(EX_USAGE, | |||||
"Only one ext_prefix or ext_if allowed"); | |||||
NEED1("Interface name required"); | |||||
if (strlen(*av) >= sizeof(cfg->if_name)) | |||||
errx(EX_USAGE, "Invalid interface name"); | |||||
flags |= NPTV6_HAS_EXTPREFIX; | |||||
cfg->flags |= NPTV6_DYNAMIC_PREFIX; | |||||
strncpy(cfg->if_name, *av, sizeof(cfg->if_name)); | |||||
ac--; av++; | |||||
break; | |||||
case TOK_PREFIXLEN: | case TOK_PREFIXLEN: | ||||
NEED1("IPv6 prefix length required"); | NEED1("IPv6 prefix length required"); | ||||
plen = strtol(*av, &p, 10); | plen = strtol(*av, &p, 10); | ||||
check_prefix: | check_prefix: | ||||
if (*p != '\0' || plen < 8 || plen > 64) | if (*p != '\0' || plen < 8 || plen > 64) | ||||
errx(EX_USAGE, "wrong prefix length: %s", *av); | errx(EX_USAGE, "wrong prefix length: %s", *av); | ||||
/* RFC 6296 Sec. 3.1 */ | /* RFC 6296 Sec. 3.1 */ | ||||
if (cfg->plen > 0 && cfg->plen != plen) { | if (cfg->plen > 0 && cfg->plen != plen) { | ||||
warnx("Prefix length mismatch (%d vs %d). " | warnx("Prefix length mismatch (%d vs %d). " | ||||
"It was extended up to %d", | "It was extended up to %d", | ||||
cfg->plen, plen, MAX(plen, cfg->plen)); | cfg->plen, plen, MAX(plen, cfg->plen)); | ||||
plen = MAX(plen, cfg->plen); | plen = MAX(plen, cfg->plen); | ||||
} | } | ||||
cfg->plen = plen; | cfg->plen = plen; | ||||
flags |= NPTV6_HAS_PREFIXLEN; | flags |= NPTV6_HAS_PREFIXLEN; | ||||
ac--; av++; | ac--; av++; | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
/* Check validness */ | /* Check validness */ | ||||
if ((flags & NPTV6_HAS_INTPREFIX) != NPTV6_HAS_INTPREFIX) | if ((flags & NPTV6_HAS_INTPREFIX) != NPTV6_HAS_INTPREFIX) | ||||
errx(EX_USAGE, "int_prefix required"); | errx(EX_USAGE, "int_prefix required"); | ||||
if ((flags & NPTV6_HAS_EXTPREFIX) != NPTV6_HAS_EXTPREFIX) | if ((flags & NPTV6_HAS_EXTPREFIX) != NPTV6_HAS_EXTPREFIX) | ||||
errx(EX_USAGE, "ext_prefix required"); | errx(EX_USAGE, "ext_prefix or ext_if required"); | ||||
if ((flags & NPTV6_HAS_PREFIXLEN) != NPTV6_HAS_PREFIXLEN) | if ((flags & NPTV6_HAS_PREFIXLEN) != NPTV6_HAS_PREFIXLEN) | ||||
errx(EX_USAGE, "prefixlen required"); | errx(EX_USAGE, "prefixlen required"); | ||||
n2mask(&mask, cfg->plen); | n2mask(&mask, cfg->plen); | ||||
APPLY_MASK(&cfg->internal, &mask); | APPLY_MASK(&cfg->internal, &mask); | ||||
if ((cfg->flags & NPTV6_DYNAMIC_PREFIX) == 0) | |||||
APPLY_MASK(&cfg->external, &mask); | APPLY_MASK(&cfg->external, &mask); | ||||
olh->count = 1; | olh->count = 1; | ||||
olh->objsize = sizeof(*cfg); | olh->objsize = sizeof(*cfg); | ||||
olh->size = sizeof(buf); | olh->size = sizeof(buf); | ||||
strlcpy(cfg->name, name, sizeof(cfg->name)); | strlcpy(cfg->name, name, sizeof(cfg->name)); | ||||
if (do_set3(IP_FW_NPTV6_CREATE, &olh->opheader, sizeof(buf)) != 0) | if (do_set3(IP_FW_NPTV6_CREATE, &olh->opheader, sizeof(buf)) != 0) | ||||
err(EX_OSERR, "nptv6 instance creation failed"); | err(EX_OSERR, "nptv6 instance creation failed"); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 82 Lines • ▼ Show 20 Lines | nptv6_show_cb(ipfw_nptv6_cfg *cfg, const char *name, uint8_t set) | ||||
if (co.use_set != 0 && cfg->set != set) | if (co.use_set != 0 && cfg->set != set) | ||||
return (ESRCH); | return (ESRCH); | ||||
if (co.use_set != 0 || cfg->set != 0) | if (co.use_set != 0 || cfg->set != 0) | ||||
printf("set %u ", cfg->set); | printf("set %u ", cfg->set); | ||||
inet_ntop(AF_INET6, &cfg->internal, abuf, sizeof(abuf)); | inet_ntop(AF_INET6, &cfg->internal, abuf, sizeof(abuf)); | ||||
printf("nptv6 %s int_prefix %s ", cfg->name, abuf); | printf("nptv6 %s int_prefix %s ", cfg->name, abuf); | ||||
if (cfg->flags & NPTV6_DYNAMIC_PREFIX) | |||||
printf("ext_if %s ", cfg->if_name); | |||||
else { | |||||
inet_ntop(AF_INET6, &cfg->external, abuf, sizeof(abuf)); | inet_ntop(AF_INET6, &cfg->external, abuf, sizeof(abuf)); | ||||
printf("ext_prefix %s prefixlen %u\n", abuf, cfg->plen); | printf("ext_prefix %s ", abuf); | ||||
} | |||||
printf("prefixlen %u\n", cfg->plen); | |||||
return (0); | return (0); | ||||
} | } | ||||
static int | static int | ||||
nptv6_destroy_cb(ipfw_nptv6_cfg *cfg, const char *name, uint8_t set) | nptv6_destroy_cb(ipfw_nptv6_cfg *cfg, const char *name, uint8_t set) | ||||
{ | { | ||||
if (co.use_set != 0 && cfg->set != set) | if (co.use_set != 0 && cfg->set != set) | ||||
▲ Show 20 Lines • Show All 68 Lines • Show Last 20 Lines |