diff options
author | Zheng Da <zhengda1936@gmail.com> | 2010-05-04 16:08:14 +0200 |
---|---|---|
committer | Zheng Da <zhengda1936@gmail.com> | 2010-05-04 16:08:14 +0200 |
commit | a03e2da13bfbed30eedd589977595a5f3398a478 (patch) | |
tree | e17d290e2ded14b5abbd51cdf8ddc8430e365fd8 /pfinet.old/ethernet.c~ | |
parent | 045fb6a578e0e4d97f0e581bbf514654686a86c1 (diff) |
remove all temporary files created by vim.
Diffstat (limited to 'pfinet.old/ethernet.c~')
-rw-r--r-- | pfinet.old/ethernet.c~ | 298 |
1 files changed, 0 insertions, 298 deletions
diff --git a/pfinet.old/ethernet.c~ b/pfinet.old/ethernet.c~ deleted file mode 100644 index 24adcc87..00000000 --- a/pfinet.old/ethernet.c~ +++ /dev/null @@ -1,298 +0,0 @@ -/* - Copyright (C) 1995, 1996, 1998, 1999, 2000, 2002, 2007 - Free Software Foundation, Inc. - - Written by Michael I. Bushnell, p/BSG. - - This file is part of the GNU Hurd. - - The GNU Hurd is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2, or (at - your option) any later version. - - The GNU Hurd is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ - -#include "pfinet.h" - -#include <device/device.h> -#include <device/net_status.h> -#include <netinet/in.h> -#include <string.h> -#define _HACK_ERRNO_H -#include <errno.h> -#include <error.h> - -#include <linux/netdevice.h> -#include <linux/etherdevice.h> -#include <linux/if_arp.h> -#include <device/bpf.h> - - -struct port_class *etherreadclass; - -struct ether_device -{ - struct ether_device *next; - device_t ether_port; - struct port_info *readpt; - mach_port_t readptname; - struct device dev; -}; - -/* Linked list of all ethernet devices. */ -struct ether_device *ether_dev; - -struct enet_statistics retbuf; - - -/* Mach doesn't provide this. DAMN. */ -struct enet_statistics * -ethernet_get_stats (struct device *dev) -{ - return &retbuf; -} - -int -ethernet_stop (struct device *dev) -{ - return 0; -} - -void -ethernet_set_multi (struct device *dev) -{ -} - -/* The BPF instruction allows IP and ARP packets */ -static struct bpf_insn ether_filter[] = -{ - {NETF_IN|NETF_BPF, /* Header. */ 0, 0, 0}, - {40, 0, 0, 12}, - {21, 1, 0, 2054}, - {21, 0, 1, 2048}, - {6, 0, 0, 1500}, - {6, 0, 0, 0} -}; -static int ether_filter_len = sizeof (ether_filter) / sizeof (short); - -static struct port_bucket *etherport_bucket; - - -static any_t -ethernet_thread (any_t arg) -{ - ports_manage_port_operations_one_thread (etherport_bucket, - ethernet_demuxer, - 0); - return 0; -} - -int -ethernet_demuxer (mach_msg_header_t *inp, - mach_msg_header_t *outp) -{ - static int count = 0; - struct net_rcv_msg *msg = (struct net_rcv_msg *) inp; - struct sk_buff *skb; - int datalen; - struct ether_device *edev; - struct device *dev = 0; - - if (inp->msgh_id != NET_RCV_MSG_ID) - return 0; - - for (edev = ether_dev; edev; edev = edev->next) - if (inp->msgh_local_port == edev->readptname) - dev = &edev->dev; - - if (! dev) - { - if (inp->msgh_remote_port != MACH_PORT_NULL) - mach_port_deallocate (mach_task_self (), inp->msgh_remote_port); - return 1; - } - - fprintf (stderr, "pfinet receives the %dst packet.\n", ++count); - fflush (stderr); - - datalen = ETH_HLEN - + msg->packet_type.msgt_number - sizeof (struct packet_header); - - __mutex_lock (&net_bh_lock); - skb = alloc_skb (datalen, GFP_ATOMIC); - skb_put (skb, datalen); - skb->dev = dev; - - char *str = "pfinet enters net_bh_lock.\n"; - write (fileno (stderr), str, strlen (str) + 1); - fflush (stderr); - - /* Copy the two parts of the frame into the buffer. */ - bcopy (msg->header, skb->data, ETH_HLEN); - bcopy (msg->packet + sizeof (struct packet_header), - skb->data + ETH_HLEN, - datalen - ETH_HLEN); - - /* Drop it on the queue. */ - skb->protocol = eth_type_trans (skb, dev); - netif_rx (skb); - __mutex_unlock (&net_bh_lock); - - fprintf (stderr, "pfinet delivered the packet.\n"); - fflush (stderr); - - return 1; -} - - -void -ethernet_initialize (void) -{ - etherport_bucket = ports_create_bucket (); - etherreadclass = ports_create_class (0, 0); - - cthread_detach (cthread_fork (ethernet_thread, 0)); -} - -int -ethernet_open (struct device *dev) -{ - error_t err; - device_t master_device; - struct ether_device *edev = (struct ether_device *) dev->priv; - - assert (edev->ether_port == MACH_PORT_NULL); - - err = ports_create_port (etherreadclass, etherport_bucket, - sizeof (struct port_info), &edev->readpt); - assert_perror (err); - edev->readptname = ports_get_right (edev->readpt); - mach_port_insert_right (mach_task_self (), edev->readptname, edev->readptname, - MACH_MSG_TYPE_MAKE_SEND); - - mach_port_set_qlimit (mach_task_self (), edev->readptname, MACH_PORT_QLIMIT_MAX); - - /* The device name here is the path of a device file. */ - master_device = file_name_lookup (dev->name, 0, 0); - if (master_device == MACH_PORT_NULL) - error (2, errno, "file_name_lookup %s", dev->name); - - err = device_open (master_device, D_WRITE | D_READ, "eth", &edev->ether_port); - mach_port_deallocate (mach_task_self (), master_device); - if (err) - error (2, err, "%s", dev->name); - - err = device_set_filter (edev->ether_port, ports_get_right (edev->readpt), - MACH_MSG_TYPE_MAKE_SEND, 0, - ether_filter, ether_filter_len); - if (err) - error (2, err, "%s", dev->name); - return 0; -} - - -/* Transmit an ethernet frame */ -int -ethernet_xmit (struct sk_buff *skb, struct device *dev) -{ - error_t err; - struct ether_device *edev = (struct ether_device *) dev->priv; - u_int count; - char *str1 = "pfinet: ethernet_xmit check point 1.\n"; - char *str2 = "pfinet: ethernet_xmit check point 2.\n"; - int stderr_fd = fileno (stderr); - - write (stderr_fd, str1, strlen (str1) + 1); - fflush (stderr); - err = device_write (edev->ether_port, D_NOWAIT, 0, skb->data, skb->len, &count); - write (stderr_fd, str2, strlen (str1) + 1); - fflush (stderr); - assert_perror (err); - assert (count == skb->len); - dev_kfree_skb (skb); - return 0; -} - -void -setup_ethernet_device (char *name, struct device **device) -{ - struct net_status netstat; - size_t count; - int net_address[2]; - error_t err; - struct ether_device *edev; - struct device *dev; - - edev = calloc (1, sizeof (struct ether_device)); - if (!edev) - error (2, ENOMEM, "%s", name); - edev->next = ether_dev; - ether_dev = edev; - - *device = dev = &edev->dev; - - dev->name = strdup (name); - /* Functions. These ones are the true "hardware layer" in Linux. */ - dev->open = 0; /* We set up before calling dev_open. */ - dev->stop = ethernet_stop; - dev->hard_start_xmit = ethernet_xmit; - dev->get_stats = ethernet_get_stats; - dev->set_multicast_list = ethernet_set_multi; - - /* These are the ones set by drivers/net/net_init.c::ether_setup. */ - dev->hard_header = eth_header; - dev->rebuild_header = eth_rebuild_header; - dev->hard_header_cache = eth_header_cache; - dev->header_cache_update = eth_header_cache_update; - dev->hard_header_parse = eth_header_parse; - /* We can't do these two (and we never try anyway). */ - /* dev->change_mtu = eth_change_mtu; */ - /* dev->set_mac_address = eth_mac_addr; */ - - /* Some more fields */ - dev->priv = edev; /* For reverse lookup. */ - dev->type = ARPHRD_ETHER; - dev->hard_header_len = ETH_HLEN; - dev->addr_len = ETH_ALEN; - memset (dev->broadcast, 0xff, ETH_ALEN); - dev->flags = IFF_BROADCAST | IFF_MULTICAST; - dev_init_buffers (dev); - - ethernet_open (dev); - - /* Fetch hardware information */ - count = NET_STATUS_COUNT; - err = device_get_status (edev->ether_port, NET_STATUS, - (dev_status_t) &netstat, &count); - if (err) - error (2, err, "%s: Cannot get device status", name); - dev->mtu = netstat.max_packet_size - dev->hard_header_len; - assert (netstat.header_format == HDR_ETHERNET); - assert (netstat.header_size == ETH_HLEN); - assert (netstat.address_size == ETH_ALEN); - - count = 2; - assert (count * sizeof (int) >= ETH_ALEN); - err = device_get_status (edev->ether_port, NET_ADDRESS, net_address, &count); - if (err) - error (2, err, "%s: Cannot get hardware Ethernet address", name); - net_address[0] = ntohl (net_address[0]); - net_address[1] = ntohl (net_address[1]); - bcopy (net_address, dev->dev_addr, ETH_ALEN); - - /* That should be enough. */ - - /* This call adds the device to the `dev_base' chain, - initializes its `ifindex' member (which matters!), - and tells the protocol stacks about the device. */ - err = - register_netdevice (dev); - assert_perror (err); -} |