From: Vinit Agnihotri Date: Thu, 15 Feb 2024 13:23:37 +0000 (-0800) Subject: lib-addrchange: Change API to fill up if_index value from netlink msg X-Git-Tag: tdb-1.4.11~1099 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6f18422aadce109ca30b7703ddd8574f49d8aff0;p=thirdparty%2Fsamba.git lib-addrchange: Change API to fill up if_index value from netlink msg Signed-off-by: Vinit Agnihotri Reviewed-by: Martin Schwenke Reviewed-by: Andrew Bartlett --- diff --git a/source3/lib/addrchange.c b/source3/lib/addrchange.c index 9a64e8d3a14..d315c775cab 100644 --- a/source3/lib/addrchange.c +++ b/source3/lib/addrchange.c @@ -101,6 +101,7 @@ struct addrchange_state { enum addrchange_type type; struct sockaddr_storage addr; + uint32_t if_index; }; static void addrchange_done(struct tevent_req *subreq); @@ -213,6 +214,7 @@ 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); @@ -272,8 +274,10 @@ retry: 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); @@ -286,6 +290,9 @@ NTSTATUS addrchange_recv(struct tevent_req *req, enum addrchange_type *type, *type = state->type; *addr = state->addr; + if (if_index != NULL) { + *if_index = state->if_index; + } tevent_req_received(req); return NT_STATUS_OK; } @@ -306,7 +313,7 @@ struct tevent_req *addrchange_send(TALLOC_CTX *mem_ctx, } 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; } diff --git a/source3/lib/addrchange.h b/source3/lib/addrchange.h index 1106380e910..05999dfefed 100644 --- a/source3/lib/addrchange.h +++ b/source3/lib/addrchange.h @@ -39,7 +39,9 @@ enum addrchange_type { 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 diff --git a/source3/smbd/server.c b/source3/smbd/server.c index 2200c9d9112..a4b0a0e31dc 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -1596,8 +1596,9 @@ static void smbd_addr_changed(struct tevent_req *req) 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", @@ -1611,8 +1612,9 @@ static void smbd_addr_changed(struct tevent_req *req) 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; } @@ -1622,8 +1624,9 @@ static void smbd_addr_changed(struct tevent_req *req) 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); diff --git a/source3/torture/test_addrchange.c b/source3/torture/test_addrchange.c index 9ccca1c6c51..bf10816250f 100644 --- a/source3/torture/test_addrchange.c +++ b/source3/torture/test_addrchange.c @@ -64,7 +64,7 @@ bool run_addrchange(int dummy) 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", diff --git a/source3/winbindd/winbindd.c b/source3/winbindd/winbindd.c index 29a24a981c3..32b85f9ea6f 100644 --- a/source3/winbindd/winbindd.c +++ b/source3/winbindd/winbindd.c @@ -1280,7 +1280,7 @@ static void winbindd_addr_changed(struct tevent_req *req) 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",