|
|
|
@ -157,6 +157,8 @@ enum {
|
|
|
|
|
OPT_PSID,
|
|
|
|
|
OPT_BR,
|
|
|
|
|
OPT_DMR,
|
|
|
|
|
OPT_PD,
|
|
|
|
|
OPT_PDLEN,
|
|
|
|
|
OPT_MAX
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -173,6 +175,8 @@ static char *const token[] = {
|
|
|
|
|
[OPT_PSID] = "psid",
|
|
|
|
|
[OPT_BR] = "br",
|
|
|
|
|
[OPT_DMR] = "dmr",
|
|
|
|
|
[OPT_PD] = "pd",
|
|
|
|
|
[OPT_PDLEN] = "pdlen",
|
|
|
|
|
[OPT_MAX] = NULL
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -239,10 +243,14 @@ int main(int argc, char *argv[])
|
|
|
|
|
// dummy
|
|
|
|
|
} else if (idx == OPT_IPV6PREFIX && inet_pton(AF_INET6, value, &ipv6prefix) == 1) {
|
|
|
|
|
// dummy
|
|
|
|
|
} else if (idx == OPT_PD && inet_pton(AF_INET6, value, &pd) == 1) {
|
|
|
|
|
// dummy
|
|
|
|
|
} else if (idx == OPT_OFFSET && (intval = strtoul(value, NULL, 0)) <= 16 && !errno) {
|
|
|
|
|
offset = intval;
|
|
|
|
|
} else if (idx == OPT_PSIDLEN && (intval = strtoul(value, NULL, 0)) <= 16 && !errno) {
|
|
|
|
|
psidlen = intval;
|
|
|
|
|
} else if (idx == OPT_PDLEN && (intval = strtoul(value, NULL, 0)) <= 128 && !errno) {
|
|
|
|
|
pdlen = intval;
|
|
|
|
|
} else if (idx == OPT_PSID && (intval = strtoul(value, NULL, 0)) <= 65535 && !errno) {
|
|
|
|
|
psid = intval;
|
|
|
|
|
} else if (idx == OPT_DMR) {
|
|
|
|
@ -270,24 +278,26 @@ int main(int argc, char *argv[])
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Find PD
|
|
|
|
|
struct blob_attr *c;
|
|
|
|
|
unsigned rem;
|
|
|
|
|
blobmsg_for_each_attr(c, dump, rem) {
|
|
|
|
|
struct blob_attr *tb[IFACE_ATTR_MAX];
|
|
|
|
|
blobmsg_parse(iface_attrs, IFACE_ATTR_MAX, tb, blobmsg_data(c), blobmsg_data_len(c));
|
|
|
|
|
|
|
|
|
|
if (!tb[IFACE_ATTR_INTERFACE] || (strcmp(argv[1], "*") && strcmp(argv[1],
|
|
|
|
|
blobmsg_get_string(tb[IFACE_ATTR_INTERFACE]))))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
match_prefix(&pdlen, &pd, tb[IFACE_ATTR_PREFIX], &ipv6prefix, prefix6len);
|
|
|
|
|
|
|
|
|
|
if (lw4o6)
|
|
|
|
|
match_prefix(&pdlen, &pd, tb[IFACE_ATTR_ADDRESS], &ipv6prefix, prefix6len);
|
|
|
|
|
|
|
|
|
|
if (pdlen >= 0) {
|
|
|
|
|
iface = blobmsg_get_string(tb[IFACE_ATTR_INTERFACE]);
|
|
|
|
|
break;
|
|
|
|
|
if (pdlen < 0) {
|
|
|
|
|
struct blob_attr *c;
|
|
|
|
|
unsigned rem;
|
|
|
|
|
blobmsg_for_each_attr(c, dump, rem) {
|
|
|
|
|
struct blob_attr *tb[IFACE_ATTR_MAX];
|
|
|
|
|
blobmsg_parse(iface_attrs, IFACE_ATTR_MAX, tb, blobmsg_data(c), blobmsg_data_len(c));
|
|
|
|
|
|
|
|
|
|
if (!tb[IFACE_ATTR_INTERFACE] || (strcmp(argv[1], "*") && strcmp(argv[1],
|
|
|
|
|
blobmsg_get_string(tb[IFACE_ATTR_INTERFACE]))))
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
match_prefix(&pdlen, &pd, tb[IFACE_ATTR_PREFIX], &ipv6prefix, prefix6len);
|
|
|
|
|
|
|
|
|
|
if (lw4o6)
|
|
|
|
|
match_prefix(&pdlen, &pd, tb[IFACE_ATTR_ADDRESS], &ipv6prefix, prefix6len);
|
|
|
|
|
|
|
|
|
|
if (pdlen >= 0) {
|
|
|
|
|
iface = blobmsg_get_string(tb[IFACE_ATTR_INTERFACE]);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|