[PATCH 4/5] netlink: Move local_address into struct netlink

Ian Jackson ijackson at chiark.greenend.org.uk
Sat May 3 16:50:45 BST 2014


All the actual netlinks have this, and proper ICMP generation on
point-to-point links is going to need it.

The dummy "null" netlink previously didn't have this parameter; now,
it is mandatory.  This is an incompatible configuration change, but
only for configurations which contain a null netlink - which we think
is only done for testing or debugging.

No other functional change.

Signed-off-by: Ian Jackson <ijackson at chiark.greenend.org.uk>
---
 netlink.c |    2 ++
 netlink.h |    1 +
 slip.c    |    5 +----
 tun.c     |    7 ++-----
 4 files changed, 6 insertions(+), 9 deletions(-)

diff --git a/netlink.c b/netlink.c
index b14d2eb..954dbb6 100644
--- a/netlink.c
+++ b/netlink.c
@@ -1198,6 +1198,8 @@ netlink_deliver_fn *netlink_init(struct netlink *st,
 	st->remote_networks=ipset_complement(empty);
 	ipset_free(empty);
     }
+    st->local_address=string_item_to_ipaddr(
+	dict_find_item(dict,"local-address", True, "netlink", loc),"netlink");
 
     sa=dict_find_item(dict,"secnet-address",False,"netlink",loc);
     ptpa=dict_find_item(dict,"ptp-address",False,"netlink",loc);
diff --git a/netlink.h b/netlink.h
index 7c42716..b24c6ef 100644
--- a/netlink.h
+++ b/netlink.h
@@ -48,6 +48,7 @@ struct netlink {
     struct ipset *networks; /* Local networks */
     struct subnet_list *subnets; /* Same as networks, for display */
     struct ipset *remote_networks; /* Allowable remote networks */
+    uint32_t local_address; /* host interface address */
     uint32_t secnet_address; /* our own address, or the address of the
 				other end of a point-to-point link */
     bool_t ptp;
diff --git a/slip.c b/slip.c
index aed2551..17b3c18 100644
--- a/slip.c
+++ b/slip.c
@@ -27,7 +27,6 @@ struct slip {
     bool_t ignoring_packet; /* If this packet was corrupt or overlong,
 			       we ignore everything up to the next END */
     netlink_deliver_fn *netlink_to_tunnel;
-    uint32_t local_address;
 };
 
 /* Generic SLIP mangling code */
@@ -147,8 +146,6 @@ static void slip_init(struct slip *st, struct cloc loc, dict_t *dict,
 	netlink_init(&st->nl,st,loc,dict,
 		     "netlink-userv-ipif",NULL,to_host);
     st->buff=find_cl_if(dict,"buffer",CL_BUFFER,True,"name",loc);
-    st->local_address=string_item_to_ipaddr(
-	dict_find_item(dict,"local-address", True, name, loc),"netlink");
     BUF_ALLOC(st->buff,"slip_init");
     st->pending_esc=False;
     st->ignoring_packet=False;
@@ -297,7 +294,7 @@ static void userv_invoke_userv(struct userv *st)
 
     addrs=safe_malloc(512,"userv_invoke_userv:addrs");
     snprintf(addrs,512,"%s,%s,%d,slip",
-	     ipaddr_to_string(st->slip.local_address),
+	     ipaddr_to_string(st->slip.nl.local_address),
 	     ipaddr_to_string(st->slip.nl.secnet_address),st->slip.nl.mtu);
 
     allnets=ipset_new();
diff --git a/tun.c b/tun.c
index 40bf6dd..dcfd623 100644
--- a/tun.c
+++ b/tun.c
@@ -81,7 +81,6 @@ struct tun {
     struct buffer_if *buff; /* We receive packets into here
 			       and send them to the netlink code. */
     netlink_deliver_fn *netlink_to_tunnel;
-    uint32_t local_address; /* host interface address */
 };
 
 static cstring_t tun_flavour_str(uint32_t flavour)
@@ -353,7 +352,7 @@ static void tun_phase_hook(void *sst, uint32_t newphase)
        to set the TUN device's address, and route to add routes to all
        our networks. */
 
-    hostaddr=ipaddr_to_string(st->local_address);
+    hostaddr=ipaddr_to_string(st->nl.local_address);
     secnetaddr=ipaddr_to_string(st->nl.secnet_address);
     snprintf(mtu,sizeof(mtu),"%d",st->nl.mtu);
     mtu[5]=0;
@@ -387,7 +386,7 @@ static void tun_phase_hook(void *sst, uint32_t newphase)
 	sa=(struct sockaddr_in *)&ifr.ifr_addr;
 	FILLZERO(*sa);
 	sa->sin_family=AF_INET;
-	sa->sin_addr.s_addr=htonl(st->local_address);
+	sa->sin_addr.s_addr=htonl(st->nl.local_address);
 	if (ioctl(fd,SIOCSIFADDR, &ifr)!=0) {
 	    fatal_perror("tun_apply: SIOCSIFADDR");
 	}
@@ -491,8 +490,6 @@ static list_t *tun_create(closure_t *self, struct cloc loc, dict_t *context,
     st->route_path=dict_read_string(dict,"route-path",False,"tun-netlink",loc);
 
     st->buff=find_cl_if(dict,"buffer",CL_BUFFER,True,"tun-netlink",loc);
-    st->local_address=string_item_to_ipaddr(
-	dict_find_item(dict,"local-address", True, "netlink", loc),"netlink");
 
     if (st->tun_flavour==TUN_FLAVOUR_GUESS) {
 	/* If we haven't been told what type of TUN we're using, take
-- 
1.7.10.4




More information about the sgo-software-discuss mailing list