changeset 4232:8b92c1844860 draft

Log the pid of the process deleting an assigned address. This should make debugging easier with third party software.
author Roy Marples <roy@marples.name>
date Tue, 06 Mar 2018 08:55:11 +0000
parents 0dcc72ad719c
children c2a1efc6b19a
files src/dhcp.c src/dhcp.h src/dhcp6.c src/dhcp6.h src/if-bsd.c src/if-linux.c src/if-sun.c src/if.c src/ipv4.c src/ipv4.h src/ipv6.c src/ipv6.h src/ipv6nd.c src/ipv6nd.h
diffstat 14 files changed, 36 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/src/dhcp.c	Fri Mar 02 15:00:07 2018 +0000
+++ b/src/dhcp.c	Tue Mar 06 08:55:11 2018 +0000
@@ -3892,7 +3892,7 @@
 }
 
 void
-dhcp_handleifa(int cmd, struct ipv4_addr *ia)
+dhcp_handleifa(int cmd, struct ipv4_addr *ia, pid_t pid)
 {
 	struct interface *ifp;
 	struct dhcp_state *state;
@@ -3906,8 +3906,8 @@
 
 	if (cmd == RTM_DELADDR) {
 		if (state->addr == ia) {
-			loginfox("%s: deleted IP address %s",
-			    ifp->name, ia->saddr);
+			loginfox("%s: pid %d deleted IP address %s",
+			    ifp->name, pid, ia->saddr);
 			state->addr = NULL;
 			/* Don't clear the added state as we need
 			 * to drop the lease. */
--- a/src/dhcp.h	Fri Mar 02 15:00:07 2018 +0000
+++ b/src/dhcp.h	Tue Mar 06 08:55:11 2018 +0000
@@ -254,7 +254,7 @@
 ssize_t dhcp_env(char **, const char *, const struct bootp *, size_t,
     const struct interface *);
 
-void dhcp_handleifa(int, struct ipv4_addr *);
+void dhcp_handleifa(int, struct ipv4_addr *, pid_t pid);
 void dhcp_drop(struct interface *, const char *);
 void dhcp_start(struct interface *);
 void dhcp_abort(struct interface *);
--- a/src/dhcp6.c	Fri Mar 02 15:00:07 2018 +0000
+++ b/src/dhcp6.c	Tue Mar 06 08:55:11 2018 +0000
@@ -3871,7 +3871,7 @@
 }
 
 void
-dhcp6_handleifa(int cmd, struct ipv6_addr *ia)
+dhcp6_handleifa(int cmd, struct ipv6_addr *ia, pid_t pid)
 {
 	struct dhcp6_state *state;
 	struct interface *ifp = ia->iface;
@@ -3886,7 +3886,7 @@
 		dhcp6_listen(ia->iface->ctx, ia);
 
 	if ((state = D6_STATE(ifp)) != NULL)
-		ipv6_handleifa_addrs(cmd, &state->addrs, ia);
+		ipv6_handleifa_addrs(cmd, &state->addrs, ia, pid);
 }
 
 ssize_t
--- a/src/dhcp6.h	Fri Mar 02 15:00:07 2018 +0000
+++ b/src/dhcp6.h	Tue Mar 06 08:55:11 2018 +0000
@@ -229,7 +229,7 @@
 ssize_t dhcp6_env(char **, const char *, const struct interface *,
     const struct dhcp6_message *, size_t);
 void dhcp6_free(struct interface *);
-void dhcp6_handleifa(int, struct ipv6_addr *);
+void dhcp6_handleifa(int, struct ipv6_addr *, pid_t);
 int dhcp6_dadcompleted(const struct interface *);
 void dhcp6_drop(struct interface *, const char *);
 void dhcp6_dropnondelegates(struct interface *ifp);
--- a/src/if-bsd.c	Fri Mar 02 15:00:07 2018 +0000
+++ b/src/if-bsd.c	Tue Mar 06 08:55:11 2018 +0000
@@ -1040,6 +1040,7 @@
 	struct interface *ifp;
 	const struct sockaddr *rti_info[RTAX_MAX];
 	int addrflags;
+	pid_t pid;
 
 	if ((ifp = if_findindex(ctx->ifaces, ifam->ifam_index)) == NULL)
 		return;
@@ -1068,6 +1069,9 @@
 		}
 #endif
 	}
+	pid = ifam->ifam_pid;
+#else
+	pid = 0;
 #endif
 
 #ifdef HAVE_IFAM_ADDRFLAGS
@@ -1140,7 +1144,7 @@
 #endif
 
 		ipv4_handleifa(ctx, ifam->ifam_type, NULL, ifp->name,
-		    &addr, &mask, &bcast, addrflags);
+		    &addr, &mask, &bcast, addrflags, pid);
 		break;
 	}
 #endif
@@ -1171,7 +1175,7 @@
 #endif
 
 		ipv6_handleifa(ctx, ifam->ifam_type, NULL,
-		    ifp->name, &addr6, ipv6_prefixlen(&mask6), addrflags);
+		    ifp->name, &addr6, ipv6_prefixlen(&mask6), addrflags, pid);
 		break;
 	}
 #endif
--- a/src/if-linux.c	Fri Mar 02 15:00:07 2018 +0000
+++ b/src/if-linux.c	Tue Mar 06 08:55:11 2018 +0000
@@ -609,7 +609,7 @@
 			rta = RTA_NEXT(rta, len);
 		}
 		ipv4_handleifa(ctx, nlm->nlmsg_type, NULL, ifp->name,
-		    &addr, &net, &brd, ifa->ifa_flags);
+		    &addr, &net, &brd, ifa->ifa_flags, (pid_t)nlm->nlmsg_pid);
 		break;
 #endif
 #ifdef INET6
@@ -625,7 +625,8 @@
 			rta = RTA_NEXT(rta, len);
 		}
 		ipv6_handleifa(ctx, nlm->nlmsg_type, NULL, ifp->name,
-		    &addr6, ifa->ifa_prefixlen, ifa->ifa_flags);
+		    &addr6, ifa->ifa_prefixlen, ifa->ifa_flags,
+		    (pid_t)nlm->nlmsg_pid);
 		break;
 #endif
 	}
--- a/src/if-sun.c	Fri Mar 02 15:00:07 2018 +0000
+++ b/src/if-sun.c	Tue Mar 06 08:55:11 2018 +0000
@@ -684,7 +684,7 @@
 		ipv4_handleifa(ctx,
 		    ifam->ifam_type == RTM_CHGADDR ?
 		    RTM_NEWADDR : ifam->ifam_type,
-		    NULL, ifalias, &addr, &mask, &bcast, flags);
+		    NULL, ifalias, &addr, &mask, &bcast, flags, 0);
 		break;
 	}
 #endif
@@ -712,7 +712,7 @@
 		ipv6_handleifa(ctx,
 		    ifam->ifam_type == RTM_CHGADDR ?
 		    RTM_NEWADDR : ifam->ifam_type,
-		    NULL, ifalias, &addr6, ipv6_prefixlen(&mask6), flags);
+		    NULL, ifalias, &addr6, ipv6_prefixlen(&mask6), flags, 0);
 		break;
 	}
 #endif
--- a/src/if.c	Fri Mar 02 15:00:07 2018 +0000
+++ b/src/if.c	Tue Mar 06 08:55:11 2018 +0000
@@ -234,7 +234,7 @@
 #endif
 			ipv4_handleifa(ctx, RTM_NEWADDR, ifs, ifa->ifa_name,
 				&addr->sin_addr, &net->sin_addr,
-				brd ? &brd->sin_addr : NULL, addrflags);
+				brd ? &brd->sin_addr : NULL, addrflags, 0);
 			break;
 #endif
 #ifdef INET6
@@ -258,7 +258,7 @@
 #endif
 			ipv6_handleifa(ctx, RTM_NEWADDR, ifs,
 			    ifa->ifa_name, &sin6->sin6_addr,
-			    ipv6_prefixlen(&net6->sin6_addr), addrflags);
+			    ipv6_prefixlen(&net6->sin6_addr), addrflags, 0);
 			break;
 #endif
 		}
--- a/src/ipv4.c	Fri Mar 02 15:00:07 2018 +0000
+++ b/src/ipv4.c	Tue Mar 06 08:55:11 2018 +0000
@@ -765,7 +765,7 @@
 ipv4_handleifa(struct dhcpcd_ctx *ctx,
     int cmd, struct if_head *ifs, const char *ifname,
     const struct in_addr *addr, const struct in_addr *mask,
-    const struct in_addr *brd, const int addrflags)
+    const struct in_addr *brd, int addrflags, pid_t pid)
 {
 	struct interface *ifp;
 	struct ipv4_state *state;
@@ -831,7 +831,7 @@
 #ifdef ARP
 		arp_handleifa(cmd, ia);
 #endif
-		dhcp_handleifa(cmd, ia);
+		dhcp_handleifa(cmd, ia, pid);
 	}
 
 	if (cmd == RTM_DELADDR)
--- a/src/ipv4.h	Fri Mar 02 15:00:07 2018 +0000
+++ b/src/ipv4.h	Tue Mar 06 08:55:11 2018 +0000
@@ -131,7 +131,7 @@
     const struct in_addr *);
 void ipv4_handleifa(struct dhcpcd_ctx *, int, struct if_head *, const char *,
     const struct in_addr *, const struct in_addr *, const struct in_addr *,
-    int);
+    int, pid_t);
 
 void ipv4_free(struct interface *);
 #else
--- a/src/ipv6.c	Fri Mar 02 15:00:07 2018 +0000
+++ b/src/ipv6.c	Tue Mar 06 08:55:11 2018 +0000
@@ -566,7 +566,7 @@
 		/* Simulate the kernel announcing the new address. */
 		ipv6_handleifa(ia->iface->ctx, RTM_NEWADDR,
 		    ia->iface->ctx->ifaces, ia->iface->name,
-		    &ia->addr, ia->prefix_len, flags);
+		    &ia->addr, ia->prefix_len, flags, 0);
 	} else {
 		/* Still tentative? Check again in a bit. */
 		struct timespec tv;
@@ -1063,7 +1063,7 @@
 void
 ipv6_handleifa(struct dhcpcd_ctx *ctx,
     int cmd, struct if_head *ifs, const char *ifname,
-    const struct in6_addr *addr, uint8_t prefix_len, int addrflags)
+    const struct in6_addr *addr, uint8_t prefix_len, int addrflags, pid_t pid)
 {
 	struct interface *ifp;
 	struct ipv6_state *state;
@@ -1174,8 +1174,8 @@
 	}
 
 	if (ia != NULL) {
-		ipv6nd_handleifa(cmd, ia);
-		dhcp6_handleifa(cmd, ia);
+		ipv6nd_handleifa(cmd, ia, pid);
+		dhcp6_handleifa(cmd, ia, pid);
 
 		/* Done with the ia now, so free it. */
 		if (cmd == RTM_DELADDR)
@@ -1705,7 +1705,7 @@
 
 int
 ipv6_handleifa_addrs(int cmd,
-    struct ipv6_addrhead *addrs, const struct ipv6_addr *addr)
+    struct ipv6_addrhead *addrs, const struct ipv6_addr *addr, pid_t pid)
 {
 	struct ipv6_addr *ia, *ian;
 	uint8_t found, alldadcompleted;
@@ -1722,8 +1722,8 @@
 		switch (cmd) {
 		case RTM_DELADDR:
 			if (ia->flags & IPV6_AF_ADDED) {
-				logwarnx("%s: deleted address %s",
-				    ia->iface->name, ia->saddr);
+				logwarnx("%s: pid %d deleted address %s",
+				    ia->iface->name, pid, ia->saddr);
 				ia->flags &= ~IPV6_AF_ADDED;
 			}
 			if (ia->flags & IPV6_AF_DELEGATED) {
--- a/src/ipv6.h	Fri Mar 02 15:00:07 2018 +0000
+++ b/src/ipv6.h	Tue Mar 06 08:55:11 2018 +0000
@@ -237,8 +237,9 @@
 void ipv6_freedrop_addrs(struct ipv6_addrhead *, int,
     const struct interface *);
 void ipv6_handleifa(struct dhcpcd_ctx *ctx, int, struct if_head *,
-    const char *, const struct in6_addr *, uint8_t, int);
-int ipv6_handleifa_addrs(int, struct ipv6_addrhead *, const struct ipv6_addr *);
+    const char *, const struct in6_addr *, uint8_t, int, pid_t);
+int ipv6_handleifa_addrs(int, struct ipv6_addrhead *, const struct ipv6_addr *,
+    pid_t);
 struct ipv6_addr *ipv6_iffindaddr(struct interface *,
     const struct in6_addr *, int);
 int ipv6_hasaddr(const struct interface *);
--- a/src/ipv6nd.c	Fri Mar 02 15:00:07 2018 +0000
+++ b/src/ipv6nd.c	Tue Mar 06 08:55:11 2018 +0000
@@ -1291,7 +1291,7 @@
 }
 
 void
-ipv6nd_handleifa(int cmd, struct ipv6_addr *addr)
+ipv6nd_handleifa(int cmd, struct ipv6_addr *addr, pid_t pid)
 {
 	struct ra *rap;
 
@@ -1303,7 +1303,7 @@
 	TAILQ_FOREACH(rap, addr->iface->ctx->ra_routers, next) {
 		if (rap->iface != addr->iface)
 			continue;
-		ipv6_handleifa_addrs(cmd, &rap->addrs, addr);
+		ipv6_handleifa_addrs(cmd, &rap->addrs, addr, pid);
 	}
 }
 
--- a/src/ipv6nd.h	Fri Mar 02 15:00:07 2018 +0000
+++ b/src/ipv6nd.h	Tue Mar 06 08:55:11 2018 +0000
@@ -97,7 +97,7 @@
 void ipv6nd_expirera(void *arg);
 int ipv6nd_hasra(const struct interface *);
 int ipv6nd_hasradhcp(const struct interface *);
-void ipv6nd_handleifa(int, struct ipv6_addr *);
+void ipv6nd_handleifa(int, struct ipv6_addr *, pid_t);
 int ipv6nd_dadcompleted(const struct interface *);
 void ipv6nd_expire(struct interface *, uint32_t);
 void ipv6nd_drop(struct interface *);