|
|
@@ -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;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|