From 56957059d60d87e21d2369ffa9b017f9acc14458 Mon Sep 17 00:00:00 2001 From: Justus Winter Date: Thu, 21 Sep 2017 14:20:16 +0200 Subject: eth-multiplexer: Avoid copying data multiple times. * eth-multiplexer/vdev.c (broadcast_pack): Construct message just once. (deliver_pack): Remove function. (deliver_msg): Make function static. * eth-multiplexer/vdev.h (deliver_{msg,pack}): Remove declarations. --- eth-multiplexer/vdev.c | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) (limited to 'eth-multiplexer/vdev.c') diff --git a/eth-multiplexer/vdev.c b/eth-multiplexer/vdev.c index 7d5390b2..367623d9 100644 --- a/eth-multiplexer/vdev.c +++ b/eth-multiplexer/vdev.c @@ -193,28 +193,12 @@ destroy_vdev (void *port) destroy_filters (&vdev->port_list); } +static int deliver_msg (struct net_rcv_msg *msg, struct vether_device *vdev); + /* Broadcast the packet to all virtual interfaces * except the one the packet is from */ int broadcast_pack (char *data, int datalen, struct vether_device *from_vdev) -{ - int internal_deliver_pack (struct vether_device *vdev) - { - /* Skip current interface. */ - if (from_vdev == vdev) - return 0; - /* Skip interfaces that are down. */ - if ((vdev->if_flags & IFF_UP) == 0) - return 0; - return deliver_pack (data, datalen, vdev); - } - - return foreach_dev_do (internal_deliver_pack); -} - -/* Create a message, and deliver it. */ -int -deliver_pack (char *data, int datalen, struct vether_device *vdev) { struct net_rcv_msg msg; int pack_size; @@ -236,7 +220,18 @@ deliver_pack (char *data, int datalen, struct vether_device *vdev) packet->length = pack_size + sizeof (struct packet_header); msg.packet_type.msgt_number = packet->length; - return deliver_msg (&msg, vdev); + int internal_deliver_pack (struct vether_device *vdev) + { + /* Skip current interface. */ + if (from_vdev == vdev) + return 0; + /* Skip interfaces that are down. */ + if ((vdev->if_flags & IFF_UP) == 0) + return 0; + return deliver_msg (&msg, vdev); + } + + return foreach_dev_do (internal_deliver_pack); } /* Broadcast the message to all virtual interfaces. */ @@ -265,7 +260,7 @@ broadcast_msg (struct net_rcv_msg *msg) * Deliver the message to all right pfinet servers that * connects to the virtual network interface. */ -int +static int deliver_msg(struct net_rcv_msg *msg, struct vether_device *vdev) { mach_msg_return_t err; -- cgit v1.2.3