chiark / gitweb /
netlink: Break out netlink_client_deliver
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 5 Jan 2014 15:30:09 +0000 (15:30 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 24 Apr 2014 00:30:48 +0000 (01:30 +0100)
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@chiark.greenend.org.uk>
debian/changelog
netlink.c

index 8f9c30c0861f895d05a2f0acd8cb4ce557f0f459..5de35429538c90e7ed9d436e6acdd49a975b9159 100644 (file)
@@ -2,6 +2,7 @@ secnet (0.3.1~~unstable) unstable; urgency=low
 
   * Updates to release checklist in Makefile.in.
   * Fix formatting error in secnet.8 manpage.
 
   * Updates to release checklist in Makefile.in.
   * Fix formatting error in secnet.8 manpage.
+  * Internal code rearrangements and improvements.
 
  --
 
 
  --
 
index af6434feb9002c12a938a2d2923d2f92ea8b9c53..54ad76fb908fa6d7383bb96422cb2fcf84d797a2 100644 (file)
--- a/netlink.c
+++ b/netlink.c
@@ -409,6 +409,17 @@ static bool_t netlink_check(struct netlink *st, struct buffer_if *buf,
 #undef BAD
 }
 
 #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.  */
 /* 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 */
        } 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 */
                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 {
        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;
        }
        BUF_ASSERT_FREE(buf);
        return;