enum addrchange_type type;
struct sockaddr_storage addr;
+ uint32_t if_index;
};
static void addrchange_done(struct tevent_req *subreq);
ifa = (struct ifaddrmsg *)NLMSG_DATA(h);
state->addr.ss_family = ifa->ifa_family;
+ state->if_index = ifa->ifa_index;
len = h->nlmsg_len - sizeof(struct nlmsghdr) + sizeof(struct ifaddrmsg);
tevent_req_set_callback(subreq, addrchange_done, req);
}
-NTSTATUS addrchange_recv(struct tevent_req *req, enum addrchange_type *type,
- struct sockaddr_storage *addr)
+NTSTATUS addrchange_recv(struct tevent_req *req,
+ enum addrchange_type *type,
+ struct sockaddr_storage *addr,
+ uint32_t *if_index)
{
struct addrchange_state *state = tevent_req_data(
req, struct addrchange_state);
*type = state->type;
*addr = state->addr;
+ if (if_index != NULL) {
+ *if_index = state->if_index;
+ }
tevent_req_received(req);
return NT_STATUS_OK;
}
}
NTSTATUS addrchange_recv(struct tevent_req *req, enum addrchange_type *type,
- struct sockaddr_storage *addr)
+ struct sockaddr_storage *addr, uint32_t *if_index)
{
return NT_STATUS_NOT_IMPLEMENTED;
}
ADDRCHANGE_DEL
};
-NTSTATUS addrchange_recv(struct tevent_req *req, enum addrchange_type *type,
- struct sockaddr_storage *addr);
+NTSTATUS addrchange_recv(struct tevent_req *req,
+ enum addrchange_type *type,
+ struct sockaddr_storage *addr,
+ uint32_t *if_index);
#endif
enum addrchange_type type;
struct sockaddr_storage addr;
NTSTATUS status;
+ uint32_t if_index;
- status = addrchange_recv(req, &type, &addr);
+ status = addrchange_recv(req, &type, &addr, &if_index);
TALLOC_FREE(req);
if (!NT_STATUS_IS_OK(status)) {
DBG_DEBUG("addrchange_recv failed: %s, stop listening\n",
print_sockaddr(addrstr, sizeof(addrstr), &addr);
- DBG_NOTICE("smbd: kernel (AF_NETLINK) dropped ip %s\n",
- addrstr);
+ DBG_NOTICE("smbd: kernel (AF_NETLINK) dropped ip %s "
+ "on if_index %u\n",
+ addrstr, if_index);
goto rearm;
}
print_sockaddr(addrstr, sizeof(addrstr), &addr);
- DBG_NOTICE("smbd: kernel (AF_NETLINK) added ip %s\n",
- addrstr);
+ DBG_NOTICE("smbd: kernel (AF_NETLINK) added ip %s "
+ "on if_index %u\n",
+ addrstr, if_index);
}
rearm:
req = addrchange_send(state, state->ev, state->ctx);
return false;
}
- status = addrchange_recv(req, &type, &addr);
+ status = addrchange_recv(req, &type, &addr, NULL);
TALLOC_FREE(req);
if (!NT_STATUS_IS_OK(status)) {
d_fprintf(stderr, "addrchange_recv failed: %s\n",
struct sockaddr_storage addr;
NTSTATUS status;
- status = addrchange_recv(req, &type, &addr);
+ status = addrchange_recv(req, &type, &addr, NULL);
TALLOC_FREE(req);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(10, ("addrchange_recv failed: %s, stop listening\n",