0001
0002 #ifndef _NET_DN_DEV_H
0003 #define _NET_DN_DEV_H
0004
0005 #include <linux/netdevice.h>
0006
0007 struct dn_dev;
0008
0009 struct dn_ifaddr {
0010 struct dn_ifaddr __rcu *ifa_next;
0011 struct dn_dev *ifa_dev;
0012 __le16 ifa_local;
0013 __le16 ifa_address;
0014 __u32 ifa_flags;
0015 __u8 ifa_scope;
0016 char ifa_label[IFNAMSIZ];
0017 struct rcu_head rcu;
0018 };
0019
0020 #define DN_DEV_S_RU 0
0021 #define DN_DEV_S_CR 1
0022 #define DN_DEV_S_DS 2
0023 #define DN_DEV_S_RI 3
0024 #define DN_DEV_S_RV 4
0025 #define DN_DEV_S_RC 5
0026 #define DN_DEV_S_OF 6
0027 #define DN_DEV_S_HA 7
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069 struct dn_dev_parms {
0070 int type;
0071 int mode;
0072 #define DN_DEV_BCAST 1
0073 #define DN_DEV_UCAST 2
0074 #define DN_DEV_MPOINT 4
0075 int state;
0076 int forwarding;
0077 unsigned long t2;
0078 unsigned long t3;
0079 int priority;
0080 char *name;
0081 int (*up)(struct net_device *);
0082 void (*down)(struct net_device *);
0083 void (*timer3)(struct net_device *, struct dn_ifaddr *ifa);
0084 void *sysctl;
0085 };
0086
0087
0088 struct dn_dev {
0089 struct dn_ifaddr __rcu *ifa_list;
0090 struct net_device *dev;
0091 struct dn_dev_parms parms;
0092 char use_long;
0093 struct timer_list timer;
0094 unsigned long t3;
0095 struct neigh_parms *neigh_parms;
0096 __u8 addr[ETH_ALEN];
0097 struct neighbour *router;
0098 struct neighbour *peer;
0099 unsigned long uptime;
0100 };
0101
0102 struct dn_short_packet {
0103 __u8 msgflg;
0104 __le16 dstnode;
0105 __le16 srcnode;
0106 __u8 forward;
0107 } __packed;
0108
0109 struct dn_long_packet {
0110 __u8 msgflg;
0111 __u8 d_area;
0112 __u8 d_subarea;
0113 __u8 d_id[6];
0114 __u8 s_area;
0115 __u8 s_subarea;
0116 __u8 s_id[6];
0117 __u8 nl2;
0118 __u8 visit_ct;
0119 __u8 s_class;
0120 __u8 pt;
0121 } __packed;
0122
0123
0124
0125 struct endnode_hello_message {
0126 __u8 msgflg;
0127 __u8 tiver[3];
0128 __u8 id[6];
0129 __u8 iinfo;
0130 __le16 blksize;
0131 __u8 area;
0132 __u8 seed[8];
0133 __u8 neighbor[6];
0134 __le16 timer;
0135 __u8 mpd;
0136 __u8 datalen;
0137 __u8 data[2];
0138 } __packed;
0139
0140 struct rtnode_hello_message {
0141 __u8 msgflg;
0142 __u8 tiver[3];
0143 __u8 id[6];
0144 __u8 iinfo;
0145 __le16 blksize;
0146 __u8 priority;
0147 __u8 area;
0148 __le16 timer;
0149 __u8 mpd;
0150 } __packed;
0151
0152
0153 void dn_dev_init(void);
0154 void dn_dev_cleanup(void);
0155
0156 int dn_dev_ioctl(unsigned int cmd, void __user *arg);
0157
0158 void dn_dev_devices_off(void);
0159 void dn_dev_devices_on(void);
0160
0161 void dn_dev_init_pkt(struct sk_buff *skb);
0162 void dn_dev_veri_pkt(struct sk_buff *skb);
0163 void dn_dev_hello(struct sk_buff *skb);
0164
0165 void dn_dev_up(struct net_device *);
0166 void dn_dev_down(struct net_device *);
0167
0168 int dn_dev_set_default(struct net_device *dev, int force);
0169 struct net_device *dn_dev_get_default(void);
0170 int dn_dev_bind_default(__le16 *addr);
0171
0172 int register_dnaddr_notifier(struct notifier_block *nb);
0173 int unregister_dnaddr_notifier(struct notifier_block *nb);
0174
0175 static inline int dn_dev_islocal(struct net_device *dev, __le16 addr)
0176 {
0177 struct dn_dev *dn_db;
0178 struct dn_ifaddr *ifa;
0179 int res = 0;
0180
0181 rcu_read_lock();
0182 dn_db = rcu_dereference(dev->dn_ptr);
0183 if (dn_db == NULL) {
0184 printk(KERN_DEBUG "dn_dev_islocal: Called for non DECnet device\n");
0185 goto out;
0186 }
0187
0188 for (ifa = rcu_dereference(dn_db->ifa_list);
0189 ifa != NULL;
0190 ifa = rcu_dereference(ifa->ifa_next))
0191 if ((addr ^ ifa->ifa_local) == 0) {
0192 res = 1;
0193 break;
0194 }
0195 out:
0196 rcu_read_unlock();
0197 return res;
0198 }
0199
0200 #endif