cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

hippi.c (5010B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * INET		An implementation of the TCP/IP protocol suite for the LINUX
      4 *		operating system.  INET is implemented using the  BSD Socket
      5 *		interface as the means of communication with the user level.
      6 *
      7 *		HIPPI-type device handling.
      8 *
      9 * Version:	@(#)hippi.c	1.0.0	05/29/97
     10 *
     11 * Authors:	Ross Biro
     12 *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
     13 *		Mark Evans, <evansmp@uhura.aston.ac.uk>
     14 *		Florian  La Roche, <rzsfl@rz.uni-sb.de>
     15 *		Alan Cox, <gw4pts@gw4pts.ampr.org>
     16 *		Jes Sorensen, <Jes.Sorensen@cern.ch>
     17 */
     18
     19#include <linux/module.h>
     20#include <linux/types.h>
     21#include <linux/kernel.h>
     22#include <linux/string.h>
     23#include <linux/mm.h>
     24#include <linux/socket.h>
     25#include <linux/in.h>
     26#include <linux/inet.h>
     27#include <linux/netdevice.h>
     28#include <linux/hippidevice.h>
     29#include <linux/skbuff.h>
     30#include <linux/errno.h>
     31#include <net/arp.h>
     32#include <net/sock.h>
     33#include <linux/uaccess.h>
     34
     35/*
     36 * Create the HIPPI MAC header for an arbitrary protocol layer
     37 *
     38 * saddr=NULL	means use device source address
     39 * daddr=NULL	means leave destination address (eg unresolved arp)
     40 */
     41
     42static int hippi_header(struct sk_buff *skb, struct net_device *dev,
     43			unsigned short type,
     44			const void *daddr, const void *saddr, unsigned int len)
     45{
     46	struct hippi_hdr *hip = skb_push(skb, HIPPI_HLEN);
     47	struct hippi_cb *hcb = (struct hippi_cb *) skb->cb;
     48
     49	if (!len){
     50		len = skb->len - HIPPI_HLEN;
     51		printk("hippi_header(): length not supplied\n");
     52	}
     53
     54	/*
     55	 * Due to the stupidity of the little endian byte-order we
     56	 * have to set the fp field this way.
     57	 */
     58	hip->fp.fixed		= htonl(0x04800018);
     59	hip->fp.d2_size		= htonl(len + 8);
     60	hip->le.fc		= 0;
     61	hip->le.double_wide	= 0;	/* only HIPPI 800 for the time being */
     62	hip->le.message_type	= 0;	/* Data PDU */
     63
     64	hip->le.dest_addr_type	= 2;	/* 12 bit SC address */
     65	hip->le.src_addr_type	= 2;	/* 12 bit SC address */
     66
     67	memcpy(hip->le.src_switch_addr, dev->dev_addr + 3, 3);
     68	memset_startat(&hip->le, 0, reserved);
     69
     70	hip->snap.dsap		= HIPPI_EXTENDED_SAP;
     71	hip->snap.ssap		= HIPPI_EXTENDED_SAP;
     72	hip->snap.ctrl		= HIPPI_UI_CMD;
     73	hip->snap.oui[0]	= 0x00;
     74	hip->snap.oui[1]	= 0x00;
     75	hip->snap.oui[2]	= 0x00;
     76	hip->snap.ethertype	= htons(type);
     77
     78	if (daddr)
     79	{
     80		memcpy(hip->le.dest_switch_addr, daddr + 3, 3);
     81		memcpy(&hcb->ifield, daddr + 2, 4);
     82		return HIPPI_HLEN;
     83	}
     84	hcb->ifield = 0;
     85	return -((int)HIPPI_HLEN);
     86}
     87
     88
     89/*
     90 *	Determine the packet's protocol ID.
     91 */
     92
     93__be16 hippi_type_trans(struct sk_buff *skb, struct net_device *dev)
     94{
     95	struct hippi_hdr *hip;
     96
     97	/*
     98	 * This is actually wrong ... question is if we really should
     99	 * set the raw address here.
    100	 */
    101	skb->dev = dev;
    102	skb_reset_mac_header(skb);
    103	hip = (struct hippi_hdr *)skb_mac_header(skb);
    104	skb_pull(skb, HIPPI_HLEN);
    105
    106	/*
    107	 * No fancy promisc stuff here now.
    108	 */
    109
    110	return hip->snap.ethertype;
    111}
    112
    113EXPORT_SYMBOL(hippi_type_trans);
    114
    115/*
    116 * For HIPPI we will actually use the lower 4 bytes of the hardware
    117 * address as the I-FIELD rather than the actual hardware address.
    118 */
    119int hippi_mac_addr(struct net_device *dev, void *p)
    120{
    121	struct sockaddr *addr = p;
    122	if (netif_running(dev))
    123		return -EBUSY;
    124	dev_addr_set(dev, addr->sa_data);
    125	return 0;
    126}
    127EXPORT_SYMBOL(hippi_mac_addr);
    128
    129int hippi_neigh_setup_dev(struct net_device *dev, struct neigh_parms *p)
    130{
    131	/* Never send broadcast/multicast ARP messages */
    132	NEIGH_VAR_INIT(p, MCAST_PROBES, 0);
    133
    134	/* In IPv6 unicast probes are valid even on NBMA,
    135	* because they are encapsulated in normal IPv6 protocol.
    136	* Should be a generic flag.
    137	*/
    138	if (p->tbl->family != AF_INET6)
    139		NEIGH_VAR_INIT(p, UCAST_PROBES, 0);
    140	return 0;
    141}
    142EXPORT_SYMBOL(hippi_neigh_setup_dev);
    143
    144static const struct header_ops hippi_header_ops = {
    145	.create		= hippi_header,
    146};
    147
    148
    149static void hippi_setup(struct net_device *dev)
    150{
    151	dev->header_ops			= &hippi_header_ops;
    152
    153	/*
    154	 * We don't support HIPPI `ARP' for the time being, and probably
    155	 * never will unless someone else implements it. However we
    156	 * still need a fake ARPHRD to make ifconfig and friends play ball.
    157	 */
    158	dev->type		= ARPHRD_HIPPI;
    159	dev->hard_header_len 	= HIPPI_HLEN;
    160	dev->mtu		= 65280;
    161	dev->min_mtu		= 68;
    162	dev->max_mtu		= 65280;
    163	dev->addr_len		= HIPPI_ALEN;
    164	dev->tx_queue_len	= 25 /* 5 */;
    165	memset(dev->broadcast, 0xFF, HIPPI_ALEN);
    166
    167
    168	/*
    169	 * HIPPI doesn't support broadcast+multicast and we only use
    170	 * static ARP tables. ARP is disabled by hippi_neigh_setup_dev.
    171	 */
    172	dev->flags = 0;
    173}
    174
    175/**
    176 * alloc_hippi_dev - Register HIPPI device
    177 * @sizeof_priv: Size of additional driver-private structure to be allocated
    178 *	for this HIPPI device
    179 *
    180 * Fill in the fields of the device structure with HIPPI-generic values.
    181 *
    182 * Constructs a new net device, complete with a private data area of
    183 * size @sizeof_priv.  A 32-byte (not bit) alignment is enforced for
    184 * this private data area.
    185 */
    186
    187struct net_device *alloc_hippi_dev(int sizeof_priv)
    188{
    189	return alloc_netdev(sizeof_priv, "hip%d", NET_NAME_UNKNOWN,
    190			    hippi_setup);
    191}
    192
    193EXPORT_SYMBOL(alloc_hippi_dev);