lib-addrchange: Change API to fill up if_index value from netlink msg
authorVinit Agnihotri <vagnihotri@ddn.com>
Thu, 15 Feb 2024 13:23:37 +0000 (05:23 -0800)
committerMartin Schwenke <martins@samba.org>
Tue, 16 Apr 2024 23:51:45 +0000 (23:51 +0000)
Signed-off-by: Vinit Agnihotri <vagnihotri@ddn.com>
Reviewed-by: Martin Schwenke <mschwenke@ddn.com>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
source3/lib/addrchange.c
source3/lib/addrchange.h
source3/smbd/server.c
source3/torture/test_addrchange.c
source3/winbindd/winbindd.c

index 9a64e8d3a149bc60571d4a9dc89a89d73a8003a1..d315c775cab3e9b6d615a2f02af4db1e051d4b0f 100644 (file)
@@ -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;
 }
index 1106380e910e7e3f542aa0f9209071482cbaaf22..05999dfefedadaeb8b31e544877015ec9b35d1dc 100644 (file)
@@ -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
index 2200c9d91125e2c7beb40ef1ad6414e07e6a37b5..a4b0a0e31dc235aa8b6783a8168f8e6d009e426c 100644 (file)
@@ -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);
index 9ccca1c6c5194ca04ec1d78e85b49954e22c318f..bf10816250f42d9b0d54ca9595b703ed742efbe5 100644 (file)
@@ -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",
index 29a24a981c37b6146c3de3861cf2272f54cadd09..32b85f9ea6fffc0e31346cc8f378066370a06551 100644 (file)
@@ -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",