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

dn_dev.h (5488B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef _NET_DN_DEV_H
      3#define _NET_DN_DEV_H
      4
      5
      6struct dn_dev;
      7
      8struct dn_ifaddr {
      9	struct dn_ifaddr __rcu *ifa_next;
     10	struct dn_dev    *ifa_dev;
     11	__le16            ifa_local;
     12	__le16            ifa_address;
     13	__u32             ifa_flags;
     14	__u8              ifa_scope;
     15	char              ifa_label[IFNAMSIZ];
     16	struct rcu_head   rcu;
     17};
     18
     19#define DN_DEV_S_RU  0 /* Run - working normally   */
     20#define DN_DEV_S_CR  1 /* Circuit Rejected         */
     21#define DN_DEV_S_DS  2 /* Data Link Start          */
     22#define DN_DEV_S_RI  3 /* Routing Layer Initialize */
     23#define DN_DEV_S_RV  4 /* Routing Layer Verify     */
     24#define DN_DEV_S_RC  5 /* Routing Layer Complete   */
     25#define DN_DEV_S_OF  6 /* Off                      */
     26#define DN_DEV_S_HA  7 /* Halt                     */
     27
     28
     29/*
     30 * The dn_dev_parms structure contains the set of parameters
     31 * for each device (hence inclusion in the dn_dev structure)
     32 * and an array is used to store the default types of supported
     33 * device (in dn_dev.c).
     34 *
     35 * The type field matches the ARPHRD_ constants and is used in
     36 * searching the list for supported devices when new devices
     37 * come up.
     38 *
     39 * The mode field is used to find out if a device is broadcast,
     40 * multipoint, or pointopoint. Please note that DECnet thinks
     41 * different ways about devices to the rest of the kernel
     42 * so the normal IFF_xxx flags are invalid here. For devices
     43 * which can be any combination of the previously mentioned
     44 * attributes, you can set this on a per device basis by
     45 * installing an up() routine.
     46 *
     47 * The device state field, defines the initial state in which the
     48 * device will come up. In the dn_dev structure, it is the actual
     49 * state.
     50 *
     51 * Things have changed here. I've killed timer1 since it's a user space
     52 * issue for a user space routing deamon to sort out. The kernel does
     53 * not need to be bothered with it.
     54 *
     55 * Timers:
     56 * t2 - Rate limit timer, min time between routing and hello messages
     57 * t3 - Hello timer, send hello messages when it expires
     58 *
     59 * Callbacks:
     60 * up() - Called to initialize device, return value can veto use of
     61 *        device with DECnet.
     62 * down() - Called to turn device off when it goes down
     63 * timer3() - Called once for each ifaddr when timer 3 goes off
     64 * 
     65 * sysctl - Hook for sysctl things
     66 *
     67 */
     68struct dn_dev_parms {
     69	int type;	          /* ARPHRD_xxx                         */
     70	int mode;	          /* Broadcast, Unicast, Mulitpoint     */
     71#define DN_DEV_BCAST  1
     72#define DN_DEV_UCAST  2
     73#define DN_DEV_MPOINT 4
     74	int state;                /* Initial state                      */
     75	int forwarding;	          /* 0=EndNode, 1=L1Router, 2=L2Router  */
     76	unsigned long t2;         /* Default value of t2                */
     77	unsigned long t3;         /* Default value of t3                */
     78	int priority;             /* Priority to be a router            */
     79	char *name;               /* Name for sysctl                    */
     80	int  (*up)(struct net_device *);
     81	void (*down)(struct net_device *);
     82	void (*timer3)(struct net_device *, struct dn_ifaddr *ifa);
     83	void *sysctl;
     84};
     85
     86
     87struct dn_dev {
     88	struct dn_ifaddr __rcu *ifa_list;
     89	struct net_device *dev;
     90	struct dn_dev_parms parms;
     91	char use_long;
     92	struct timer_list timer;
     93	unsigned long t3;
     94	struct neigh_parms *neigh_parms;
     95	__u8 addr[ETH_ALEN];
     96	struct neighbour *router; /* Default router on circuit */
     97	struct neighbour *peer;   /* Peer on pointopoint links */
     98	unsigned long uptime;     /* Time device went up in jiffies */
     99};
    100
    101struct dn_short_packet {
    102	__u8    msgflg;
    103	__le16 dstnode;
    104	__le16 srcnode;
    105	__u8   forward;
    106} __packed;
    107
    108struct dn_long_packet {
    109	__u8   msgflg;
    110	__u8   d_area;
    111	__u8   d_subarea;
    112	__u8   d_id[6];
    113	__u8   s_area;
    114	__u8   s_subarea;
    115	__u8   s_id[6];
    116	__u8   nl2;
    117	__u8   visit_ct;
    118	__u8   s_class;
    119	__u8   pt;
    120} __packed;
    121
    122/*------------------------- DRP - Routing messages ---------------------*/
    123
    124struct endnode_hello_message {
    125	__u8   msgflg;
    126	__u8   tiver[3];
    127	__u8   id[6];
    128	__u8   iinfo;
    129	__le16 blksize;
    130	__u8   area;
    131	__u8   seed[8];
    132	__u8   neighbor[6];
    133	__le16 timer;
    134	__u8   mpd;
    135	__u8   datalen;
    136	__u8   data[2];
    137} __packed;
    138
    139struct rtnode_hello_message {
    140	__u8   msgflg;
    141	__u8   tiver[3];
    142	__u8   id[6];
    143	__u8   iinfo;
    144	__le16  blksize;
    145	__u8   priority;
    146	__u8   area;
    147	__le16  timer;
    148	__u8   mpd;
    149} __packed;
    150
    151
    152void dn_dev_init(void);
    153void dn_dev_cleanup(void);
    154
    155int dn_dev_ioctl(unsigned int cmd, void __user *arg);
    156
    157void dn_dev_devices_off(void);
    158void dn_dev_devices_on(void);
    159
    160void dn_dev_init_pkt(struct sk_buff *skb);
    161void dn_dev_veri_pkt(struct sk_buff *skb);
    162void dn_dev_hello(struct sk_buff *skb);
    163
    164void dn_dev_up(struct net_device *);
    165void dn_dev_down(struct net_device *);
    166
    167int dn_dev_set_default(struct net_device *dev, int force);
    168struct net_device *dn_dev_get_default(void);
    169int dn_dev_bind_default(__le16 *addr);
    170
    171int register_dnaddr_notifier(struct notifier_block *nb);
    172int unregister_dnaddr_notifier(struct notifier_block *nb);
    173
    174static inline int dn_dev_islocal(struct net_device *dev, __le16 addr)
    175{
    176	struct dn_dev *dn_db;
    177	struct dn_ifaddr *ifa;
    178	int res = 0;
    179
    180	rcu_read_lock();
    181	dn_db = rcu_dereference(dev->dn_ptr);
    182	if (dn_db == NULL) {
    183		printk(KERN_DEBUG "dn_dev_islocal: Called for non DECnet device\n");
    184		goto out;
    185	}
    186
    187	for (ifa = rcu_dereference(dn_db->ifa_list);
    188	     ifa != NULL;
    189	     ifa = rcu_dereference(ifa->ifa_next))
    190		if ((addr ^ ifa->ifa_local) == 0) {
    191			res = 1;
    192			break;
    193		}
    194out:
    195	rcu_read_unlock();
    196	return res;
    197}
    198
    199#endif /* _NET_DN_DEV_H */