rpcd-mod-luci: parse prefix size from DHCPv6 leases
Remember the prefix size when parsing odhcpd lease entries and expose
it in the ip6addrs array.
Fixes: #4345
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 4424424366
)
This commit is contained in:
parent
5624b5c2e4
commit
b4aeac7262
1 changed files with 30 additions and 7 deletions
|
@ -347,6 +347,7 @@ struct lease_entry {
|
||||||
struct in_addr in;
|
struct in_addr in;
|
||||||
struct in6_addr in6;
|
struct in6_addr in6;
|
||||||
} addr[10];
|
} addr[10];
|
||||||
|
uint8_t mask;
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
|
@ -480,11 +481,18 @@ lease_next(void)
|
||||||
|
|
||||||
p = strtok(NULL, " \t\n"); /* iaid */
|
p = strtok(NULL, " \t\n"); /* iaid */
|
||||||
|
|
||||||
if (p)
|
if (!p)
|
||||||
e.af = strcmp(p, "ipv4") ? AF_INET6 : AF_INET;
|
|
||||||
else
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (!strcmp(p, "ipv4")) {
|
||||||
|
e.af = AF_INET;
|
||||||
|
e.mask = 32;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
e.af = AF_INET6;
|
||||||
|
e.mask = 128;
|
||||||
|
}
|
||||||
|
|
||||||
e.hostname = strtok(NULL, " \t\n"); /* name */
|
e.hostname = strtok(NULL, " \t\n"); /* name */
|
||||||
|
|
||||||
if (!e.hostname)
|
if (!e.hostname)
|
||||||
|
@ -505,7 +513,16 @@ lease_next(void)
|
||||||
e.expire = -1;
|
e.expire = -1;
|
||||||
|
|
||||||
strtok(NULL, " \t\n"); /* id */
|
strtok(NULL, " \t\n"); /* id */
|
||||||
strtok(NULL, " \t\n"); /* length */
|
|
||||||
|
p = strtok(NULL, " \t\n"); /* length */
|
||||||
|
|
||||||
|
if (!p)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
n = atoi(p); /* length */
|
||||||
|
|
||||||
|
if (n != 0)
|
||||||
|
e.mask = n;
|
||||||
|
|
||||||
for (e.n_addr = 0, p = strtok(NULL, "/ \t\n");
|
for (e.n_addr = 0, p = strtok(NULL, "/ \t\n");
|
||||||
e.n_addr < ARRAY_SIZE(e.addr) && p != NULL;
|
e.n_addr < ARRAY_SIZE(e.addr) && p != NULL;
|
||||||
|
@ -551,10 +568,12 @@ lease_next(void)
|
||||||
|
|
||||||
if (p && inet_pton(AF_INET6, p, &e.addr[0].in6)) {
|
if (p && inet_pton(AF_INET6, p, &e.addr[0].in6)) {
|
||||||
e.af = AF_INET6;
|
e.af = AF_INET6;
|
||||||
|
e.mask = 128;
|
||||||
e.n_addr = 1;
|
e.n_addr = 1;
|
||||||
}
|
}
|
||||||
else if (p && inet_pton(AF_INET, p, &e.addr[0].in)) {
|
else if (p && inet_pton(AF_INET, p, &e.addr[0].in)) {
|
||||||
e.af = AF_INET;
|
e.af = AF_INET;
|
||||||
|
e.mask = 32;
|
||||||
e.n_addr = 1;
|
e.n_addr = 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1918,11 +1937,12 @@ rpc_luci_get_dhcp_leases(struct ubus_context *ctx, struct ubus_object *obj,
|
||||||
struct ubus_request_data *req, const char *method,
|
struct ubus_request_data *req, const char *method,
|
||||||
struct blob_attr *msg)
|
struct blob_attr *msg)
|
||||||
{
|
{
|
||||||
|
char s[INET6_ADDRSTRLEN + strlen("/128")];
|
||||||
struct blob_attr *tb[__RPC_L_MAX];
|
struct blob_attr *tb[__RPC_L_MAX];
|
||||||
struct lease_entry *lease;
|
struct lease_entry *lease;
|
||||||
char s[INET6_ADDRSTRLEN];
|
|
||||||
int af, family = 0;
|
int af, family = 0;
|
||||||
void *a, *a2, *o;
|
void *a, *a2, *o;
|
||||||
|
size_t l;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
blobmsg_parse(rpc_get_leases_policy, __RPC_L_MAX, tb,
|
blobmsg_parse(rpc_get_leases_policy, __RPC_L_MAX, tb,
|
||||||
|
@ -1977,14 +1997,17 @@ rpc_luci_get_dhcp_leases(struct ubus_context *ctx, struct ubus_object *obj,
|
||||||
blobmsg_add_string(&blob, "duid", lease->duid);
|
blobmsg_add_string(&blob, "duid", lease->duid);
|
||||||
|
|
||||||
inet_ntop(lease->af, &lease->addr[0].in6, s, sizeof(s));
|
inet_ntop(lease->af, &lease->addr[0].in6, s, sizeof(s));
|
||||||
blobmsg_add_string(&blob, (af == AF_INET) ? "ipaddr" : "ip6addr",
|
blobmsg_add_string(&blob, (af == AF_INET) ? "ipaddr" : "ip6addr", s);
|
||||||
s);
|
|
||||||
|
|
||||||
if (af == AF_INET6) {
|
if (af == AF_INET6) {
|
||||||
a2 = blobmsg_open_array(&blob, "ip6addrs");
|
a2 = blobmsg_open_array(&blob, "ip6addrs");
|
||||||
|
|
||||||
for (n = 0; n < lease->n_addr; n++) {
|
for (n = 0; n < lease->n_addr; n++) {
|
||||||
inet_ntop(lease->af, &lease->addr[n].in6, s, sizeof(s));
|
inet_ntop(lease->af, &lease->addr[n].in6, s, sizeof(s));
|
||||||
|
|
||||||
|
l = strlen(s);
|
||||||
|
snprintf(s + l, sizeof(s) - l, "/%hhu", lease->mask);
|
||||||
|
|
||||||
blobmsg_add_string(&blob, NULL, s);
|
blobmsg_add_string(&blob, NULL, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue