[PATCH 1/3] netlink: Break out netlink_client_deliver

Ian Jackson ijackson at chiark.greenend.org.uk
Sun Jan 5 15:44:51 GMT 2014


Provide a helper function for calling client->deliver, and use it at
the two call sites.  We are going to fix a bug in this area and want
to bring the implementations together so we have only one place to
fix.

A side effect is that packets via point-to-point links are properly
counted.

I have verified that I caught all of the call sites by experimentally
changing the field name from "deliver" to "deliverx" in netlink.h, and
inspecting the locations of the resulting compiler errors.

Signed-off-by: Ian Jackson <ijackson at chiark.greenend.org.uk>
---
 netlink.c |   18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/netlink.c b/netlink.c
index af6434f..54ad76f 100644
--- a/netlink.c
+++ b/netlink.c
@@ -409,6 +409,17 @@ static bool_t netlink_check(struct netlink *st, struct buffer_if *buf,
 #undef BAD
 }
 
+/* Deliver a packet _to_ client; used after we have decided
+ * what to do with it. */
+static void netlink_client_deliver(struct netlink *st,
+				   struct netlink_client *client,
+				   uint32_t source, uint32_t dest,
+				   struct buffer_if *buf)
+{
+    client->deliver(client->dst, buf);
+    client->outcount++;
+}
+
 /* Deliver a packet. "client" is the _origin_ of the packet, not its
    destination, and is NULL for packets from the host and packets
    generated internally in secnet.  */
@@ -521,9 +532,8 @@ static void netlink_packet_deliver(struct netlink *st,
 	} else {
 	    if (best_quality>0) {
 		/* XXX Fragment if required */
-		st->routes[best_match]->deliver(
-		    st->routes[best_match]->dst, buf);
-		st->routes[best_match]->outcount++;
+		netlink_client_deliver(st,st->routes[best_match],
+				       source,dest,buf);
 		BUF_ASSERT_FREE(buf);
 	    } else {
 		/* Generate ICMP destination unreachable */
@@ -678,7 +688,7 @@ static void netlink_incoming(struct netlink *st, struct netlink_client *client,
 	if (client) {
 	    st->deliver_to_host(st->dst,buf);
 	} else {
-	    st->clients->deliver(st->clients->dst,buf);
+	    netlink_client_deliver(st,st->clients,source,dest,buf);
 	}
 	BUF_ASSERT_FREE(buf);
 	return;
-- 
1.7.10.4




More information about the sgo-software-discuss mailing list