#undef BAD
}
+/* Deliver a packet _to_ client; used after we have decided
+ * what to do with it (and just to check that the client has
+ * actually registered a delivery function with us). */
+static void netlink_client_deliver(struct netlink *st,
+ struct netlink_client *client,
+ uint32_t source, uint32_t dest,
+ struct buffer_if *buf)
+{
+ if (!client->deliver) {
+ string_t s,d;
+ s=ipaddr_to_string(source);
+ d=ipaddr_to_string(dest);
+ Message(M_ERR,"%s: dropping %s->%s, client not registered\n",
+ st->name,s,d);
+ free(s); free(d);
+ BUF_FREE(buf);
+ return;
+ }
+ 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. */
} 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 */
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;