diff options
author | Thomas Schwinge <tschwinge@gnu.org> | 2006-04-27 00:56:34 +0000 |
---|---|---|
committer | Thomas Schwinge <tschwinge@gnu.org> | 2009-06-18 00:26:37 +0200 |
commit | 1ca2a1632d7325ee26b2c701b38c1d2e2fcb6f80 (patch) | |
tree | 630990386066401f4ce5b9fc530078c8a128a822 /linux/dev/glue | |
parent | a9192e8b618990551fcb230941e87728d86864eb (diff) |
2006-04-27 Richard Braun <syn@hurdfr.org>
Manuel Menal <mmenal@hurdfr.org>
* device/if_hdr.h (struct ifnet): Added new members `if_snd_port_list'
and `if_snd_port_list_lock'.
* device/net_io.c: Reworked to improve BPF support. Filters can be
applied to ingress packets, egress packets, or both.
* device/subrs.c: Initialize the `if_snd_port_list' and
`if_snd_port_list_lock'.
* include/device/bpf.h [0]: Enable unconditionally.
Include <sys/types.h>.
(BPF_IN, BPF_OUT): New macros.
* include/device/net_status.h (NETF_TYPE_MASK, NETF_IN, NETF_OUT): New
macros.
(struct net_rcv_msg): New member `sent'.
* linux/dev/glue/net.c: Mark ingress packets as received and inject
egress packets into the packet filters.
Diffstat (limited to 'linux/dev/glue')
-rw-r--r-- | linux/dev/glue/net.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/linux/dev/glue/net.c b/linux/dev/glue/net.c index 93556db..4a989d3 100644 --- a/linux/dev/glue/net.c +++ b/linux/dev/glue/net.c @@ -290,6 +290,9 @@ netif_rx (struct sk_buff *skb) eh = (struct ether_header *) (net_kmsg (kmsg)->header); ph = (struct packet_header *) (net_kmsg (kmsg)->packet); memcpy (eh, skb->data, sizeof (struct ether_header)); + + /* packet is prefixed with a struct packet_header, + see include/device/net_status.h. */ memcpy (ph + 1, skb->data + sizeof (struct ether_header), skb->len - sizeof (struct ether_header)); ph->type = eh->ether_type; @@ -298,6 +301,8 @@ netif_rx (struct sk_buff *skb) dev_kfree_skb (skb, FREE_READ); + net_kmsg(kmsg)->sent = FALSE; /* Mark packet as received. */ + /* Pass packet up to the microkernel. */ net_packet (&dev->net_data->ifnet, kmsg, ph->length, ethernet_priority (kmsg)); @@ -484,6 +489,34 @@ device_write (void *d, ipc_port_t reply_port, } splx (s); + /* Send packet to filters. */ + { + struct packet_header *packet; + struct ether_header *header; + ipc_kmsg_t kmsg; + + kmsg = net_kmsg_get (); + + if (kmsg != IKM_NULL) + { + /* Suitable for Ethernet only. */ + header = (struct ether_header *) (net_kmsg (kmsg)->header); + packet = (struct packet_header *) (net_kmsg (kmsg)->packet); + memcpy (header, skb->data, sizeof (struct ether_header)); + + /* packet is prefixed with a struct packet_header, + see include/device/net_status.h. */ + memcpy (packet + 1, skb->data + sizeof (struct ether_header), + skb->len - sizeof (struct ether_header)); + packet->length = skb->len - sizeof (struct ether_header) + + sizeof (struct packet_header); + packet->type = header->ether_type; + net_kmsg (kmsg)->sent = TRUE; /* Mark packet as sent. */ + net_packet (&dev->net_data->ifnet, kmsg, packet->length, + ethernet_priority (kmsg)); + } + } + return MIG_NO_REPLY; } |