dn.h 7 KB
Newer Older
Linus Torvalds's avatar
Linus Torvalds committed
1 2 3 4 5
#ifndef _NET_DN_H
#define _NET_DN_H

#include <linux/dn.h>
#include <net/sock.h>
6
#include <net/flow.h>
Linus Torvalds's avatar
Linus Torvalds committed
7
#include <asm/byteorder.h>
8
#include <asm/unaligned.h>
Linus Torvalds's avatar
Linus Torvalds committed
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

struct dn_scp                                   /* Session Control Port */
{
        unsigned char           state;
#define DN_O     1                      /* Open                 */
#define DN_CR    2                      /* Connect Receive      */
#define DN_DR    3                      /* Disconnect Reject    */
#define DN_DRC   4                      /* Discon. Rej. Complete*/
#define DN_CC    5                      /* Connect Confirm      */
#define DN_CI    6                      /* Connect Initiate     */
#define DN_NR    7                      /* No resources         */
#define DN_NC    8                      /* No communication     */
#define DN_CD    9                      /* Connect Delivery     */
#define DN_RJ    10                     /* Rejected             */
#define DN_RUN   11                     /* Running              */
#define DN_DI    12                     /* Disconnect Initiate  */
#define DN_DIC   13                     /* Disconnect Complete  */
#define DN_DN    14                     /* Disconnect Notificat */
#define DN_CL    15                     /* Closed               */
#define DN_CN    16                     /* Closed Notification  */

30 31 32 33 34 35 36 37 38 39 40 41
        __le16          addrloc;
        __le16          addrrem;
        __u16          numdat;
        __u16          numoth;
        __u16          numoth_rcv;
        __u16          numdat_rcv;
        __u16          ackxmt_dat;
        __u16          ackxmt_oth;
        __u16          ackrcv_dat;
        __u16          ackrcv_oth;
        __u8           flowrem_sw;
	__u8           flowloc_sw;
Linus Torvalds's avatar
Linus Torvalds committed
42 43 44
#define DN_SEND         2
#define DN_DONTSEND     1
#define DN_NOCHANGE     0
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
	__u16		flowrem_dat;
	__u16		flowrem_oth;
	__u16		flowloc_dat;
	__u16		flowloc_oth;
	__u8		services_rem;
	__u8		services_loc;
	__u8		info_rem;
	__u8		info_loc;

	__u16		segsize_rem;
	__u16		segsize_loc;

	__u8		nonagle;
	__u8		multi_ireq;
	__u8		accept_mode;
Linus Torvalds's avatar
Linus Torvalds committed
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
	unsigned long		seg_total; /* Running total of current segment */

	struct optdata_dn     conndata_in;
	struct optdata_dn     conndata_out;
	struct optdata_dn     discdata_in;
	struct optdata_dn     discdata_out;
        struct accessdata_dn  accessdata;

        struct sockaddr_dn addr; /* Local address  */
	struct sockaddr_dn peer; /* Remote address */

	/*
	 * In this case the RTT estimation is not specified in the
	 * docs, nor is any back off algorithm. Here we follow well
	 * known tcp algorithms with a few small variations.
	 *
	 * snd_window: Max number of packets we send before we wait for
	 *             an ack to come back. This will become part of a
	 *             more complicated scheme when we support flow
	 *             control.
	 *
	 * nsp_srtt:   Round-Trip-Time (x8) in jiffies. This is a rolling
	 *             average.
	 * nsp_rttvar: Round-Trip-Time-Varience (x4) in jiffies. This is the
	 *             varience of the smoothed average (but calculated in
	 *             a simpler way than for normal statistical varience
	 *             calculations).
	 *
	 * nsp_rxtshift: Backoff counter. Value is zero normally, each time
	 *               a packet is lost is increases by one until an ack
	 *               is received. Its used to index an array of backoff
	 *               multipliers.
	 */
#define NSP_MIN_WINDOW 1
#define NSP_MAX_WINDOW (0x07fe)
	unsigned long max_window;
	unsigned long snd_window;
#define NSP_INITIAL_SRTT (HZ)
	unsigned long nsp_srtt;
#define NSP_INITIAL_RTTVAR (HZ*3)
	unsigned long nsp_rttvar;
#define NSP_MAXRXTSHIFT 12
	unsigned long nsp_rxtshift;

	/*
	 * Output queues, one for data, one for otherdata/linkservice
	 */
	struct sk_buff_head data_xmit_queue;
	struct sk_buff_head other_xmit_queue;

	/*
	 * Input queue for other data
	 */
	struct sk_buff_head other_receive_queue;
	int other_report;

	/*
	 * Stuff to do with the slow timer
	 */
	unsigned long stamp;          /* time of last transmit */
	unsigned long persist;
	int (*persist_fxn)(struct sock *sk);
	unsigned long keepalive;
	void (*keepalive_fxn)(struct sock *sk);

	/*
	 * This stuff is for the fast timer for delayed acks
	 */
	struct timer_list delack_timer;
	int delack_pending;
	void (*delack_fxn)(struct sock *sk);

};

static inline struct dn_scp *DN_SK(struct sock *sk)
{
	return (struct dn_scp *)(sk + 1);
}

/*
 * src,dst : Source and Destination DECnet addresses
 * hops : Number of hops through the network
 * dst_port, src_port : NSP port numbers
 * services, info : Useful data extracted from conninit messages
 * rt_flags : Routing flags byte
 * nsp_flags : NSP layer flags byte
 * segsize : Size of segment
 * segnum : Number, for data, otherdata and linkservice
 * xmit_count : Number of times we've transmitted this skb
 * stamp : Time stamp of most recent transmission, used in RTT calculations
 * iif: Input interface number
 *
 * As a general policy, this structure keeps all addresses in network
 * byte order, and all else in host byte order. Thus dst, src, dst_port
 * and src_port are in network order. All else is in host order.
 * 
 */
#define DN_SKB_CB(skb) ((struct dn_skb_cb *)(skb)->cb)
struct dn_skb_cb {
159 160 161 162 163 164 165 166 167 168 169 170
	__le16 dst;
	__le16 src;
	__u16 hops;
	__le16 dst_port;
	__le16 src_port;
	__u8 services;
	__u8 info;
	__u8 rt_flags;
	__u8 nsp_flags;
	__u16 segsize;
	__u16 segnum;
	__u16 xmit_count;
Linus Torvalds's avatar
Linus Torvalds committed
171 172 173 174
	unsigned long stamp;
	int iif;
};

175
static inline __le16 dn_eth2dn(unsigned char *ethaddr)
Linus Torvalds's avatar
Linus Torvalds committed
176
{
177
	return get_unaligned((__le16 *)(ethaddr + 4));
Linus Torvalds's avatar
Linus Torvalds committed
178 179
}

180
static inline __le16 dn_saddr2dn(struct sockaddr_dn *saddr)
Linus Torvalds's avatar
Linus Torvalds committed
181
{
182
	return *(__le16 *)saddr->sdn_nodeaddr;
Linus Torvalds's avatar
Linus Torvalds committed
183 184
}

185
static inline void dn_dn2eth(unsigned char *ethaddr, __le16 addr)
Linus Torvalds's avatar
Linus Torvalds committed
186
{
187
	__u16 a = le16_to_cpu(addr);
Linus Torvalds's avatar
Linus Torvalds committed
188 189 190 191
	ethaddr[0] = 0xAA;
	ethaddr[1] = 0x00;
	ethaddr[2] = 0x04;
	ethaddr[3] = 0x00;
192 193
	ethaddr[4] = (__u8)(a & 0xff);
	ethaddr[5] = (__u8)(a >> 8);
Linus Torvalds's avatar
Linus Torvalds committed
194 195
}

196
static inline void dn_sk_ports_copy(struct flowidn *fld, struct dn_scp *scp)
Linus Torvalds's avatar
Linus Torvalds committed
197
{
198 199
	fld->fld_sport = scp->addrloc;
	fld->fld_dport = scp->addrrem;
Linus Torvalds's avatar
Linus Torvalds committed
200 201
}

202
unsigned int dn_mss_from_pmtu(struct net_device *dev, int mtu);
203 204
void dn_register_sysctl(void);
void dn_unregister_sysctl(void);
Linus Torvalds's avatar
Linus Torvalds committed
205 206 207 208 209 210

#define DN_MENUVER_ACC 0x01
#define DN_MENUVER_USR 0x02
#define DN_MENUVER_PRX 0x04
#define DN_MENUVER_UIC 0x08

211 212
struct sock *dn_sklist_find_listener(struct sockaddr_dn *addr);
struct sock *dn_find_by_skb(struct sk_buff *skb);
Linus Torvalds's avatar
Linus Torvalds committed
213
#define DN_ASCBUF_LEN 9
214 215
char *dn_addr2asc(__u16, char *);
int dn_destroy_timer(struct sock *sk);
Linus Torvalds's avatar
Linus Torvalds committed
216

217 218 219 220
int dn_sockaddr2username(struct sockaddr_dn *addr, unsigned char *buf,
			 unsigned char type);
int dn_username2sockaddr(unsigned char *data, int len, struct sockaddr_dn *addr,
			 unsigned char *type);
Linus Torvalds's avatar
Linus Torvalds committed
221

222 223
void dn_start_slow_timer(struct sock *sk);
void dn_stop_slow_timer(struct sock *sk);
Linus Torvalds's avatar
Linus Torvalds committed
224

225
extern __le16 decnet_address;
Linus Torvalds's avatar
Linus Torvalds committed
226 227 228 229 230 231 232
extern int decnet_debug_level;
extern int decnet_time_wait;
extern int decnet_dn_count;
extern int decnet_di_count;
extern int decnet_dr_count;
extern int decnet_no_fc_max_cwnd;

233
extern long sysctl_decnet_mem[3];
234 235 236
extern int sysctl_decnet_wmem[3];
extern int sysctl_decnet_rmem[3];

Linus Torvalds's avatar
Linus Torvalds committed
237
#endif /* _NET_DN_H */