dn_nsp.h 6.0 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
#ifndef _NET_DN_NSP_H
#define _NET_DN_NSP_H
/******************************************************************************
    (c) 1995-1998 E.M. Serrat		emserrat@geocities.com
    
    This program 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 of the License, or
    any later version.

    This program 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.
*******************************************************************************/
/* dn_nsp.c functions prototyping */

extern void dn_nsp_send_data_ack(struct sock *sk);
extern void dn_nsp_send_oth_ack(struct sock *sk);
extern void dn_nsp_delayed_ack(struct sock *sk);
extern void dn_send_conn_ack(struct sock *sk);
A
Al Viro 已提交
22
extern void dn_send_conn_conf(struct sock *sk, gfp_t gfp);
L
Linus Torvalds 已提交
23
extern void dn_nsp_send_disc(struct sock *sk, unsigned char type, 
A
Al Viro 已提交
24
			unsigned short reason, gfp_t gfp);
L
Linus Torvalds 已提交
25 26 27 28 29 30 31
extern void dn_nsp_return_disc(struct sk_buff *skb, unsigned char type,
				unsigned short reason);
extern void dn_nsp_send_link(struct sock *sk, unsigned char lsflags, char fcval);
extern void dn_nsp_send_conninit(struct sock *sk, unsigned char flags);

extern void dn_nsp_output(struct sock *sk);
extern int dn_nsp_check_xmit_queue(struct sock *sk, struct sk_buff *skb, struct sk_buff_head *q, unsigned short acknum);
A
Al Viro 已提交
32
extern void dn_nsp_queue_xmit(struct sock *sk, struct sk_buff *skb, gfp_t gfp, int oob);
L
Linus Torvalds 已提交
33 34 35 36 37 38
extern unsigned long dn_nsp_persist(struct sock *sk);
extern int dn_nsp_xmit_timeout(struct sock *sk);

extern int dn_nsp_rx(struct sk_buff *);
extern int dn_nsp_backlog_rcv(struct sock *sk, struct sk_buff *skb);

A
Al Viro 已提交
39
extern struct sk_buff *dn_alloc_skb(struct sock *sk, int size, gfp_t pri);
L
Linus Torvalds 已提交
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
extern struct sk_buff *dn_alloc_send_skb(struct sock *sk, size_t *size, int noblock, long timeo, int *err);

#define NSP_REASON_OK 0		/* No error */
#define NSP_REASON_NR 1		/* No resources */
#define NSP_REASON_UN 2		/* Unrecognised node name */
#define NSP_REASON_SD 3		/* Node shutting down */
#define NSP_REASON_ID 4		/* Invalid destination end user */
#define NSP_REASON_ER 5		/* End user lacks resources */
#define NSP_REASON_OB 6		/* Object too busy */
#define NSP_REASON_US 7		/* Unspecified error */
#define NSP_REASON_TP 8		/* Third-Party abort */
#define NSP_REASON_EA 9		/* End user has aborted the link */
#define NSP_REASON_IF 10	/* Invalid node name format */
#define NSP_REASON_LS 11	/* Local node shutdown */
#define NSP_REASON_LL 32	/* Node lacks logical-link resources */
#define NSP_REASON_LE 33	/* End user lacks logical-link resources */
#define NSP_REASON_UR 34	/* Unacceptable RQSTRID or PASSWORD field */
#define NSP_REASON_UA 36	/* Unacceptable ACCOUNT field */
#define NSP_REASON_TM 38	/* End user timed out logical link */
#define NSP_REASON_NU 39	/* Node unreachable */
#define NSP_REASON_NL 41	/* No-link message */
#define NSP_REASON_DC 42	/* Disconnect confirm */
#define NSP_REASON_IO 43	/* Image data field overflow */

#define NSP_DISCINIT 0x38
#define NSP_DISCCONF 0x48

/*------------------------- NSP - messages ------------------------------*/
/* Data Messages */
/*---------------*/

/* Data Messages    (data segment/interrupt/link service)               */

E
Eric Dumazet 已提交
73
struct nsp_data_seg_msg {
74 75 76
	__u8   msgflg;
	__le16 dstaddr;
	__le16 srcaddr;
E
Eric Dumazet 已提交
77
} __packed;
L
Linus Torvalds 已提交
78

E
Eric Dumazet 已提交
79
struct nsp_data_opt_msg {
80 81 82
	__le16 acknum;
	__le16 segnum;
	__le16 lsflgs;
E
Eric Dumazet 已提交
83
} __packed;
L
Linus Torvalds 已提交
84

E
Eric Dumazet 已提交
85
struct nsp_data_opt_msg1 {
86 87
	__le16 acknum;
	__le16 segnum;
E
Eric Dumazet 已提交
88
} __packed;
L
Linus Torvalds 已提交
89 90 91


/* Acknowledgment Message (data/other data)                             */
E
Eric Dumazet 已提交
92
struct nsp_data_ack_msg {
93 94 95 96
	__u8   msgflg;
	__le16 dstaddr;
	__le16 srcaddr;
	__le16 acknum;
E
Eric Dumazet 已提交
97
} __packed;
L
Linus Torvalds 已提交
98 99

/* Connect Acknowledgment Message */
E
Eric Dumazet 已提交
100
struct  nsp_conn_ack_msg {
101 102
	__u8 msgflg;
	__le16 dstaddr;
E
Eric Dumazet 已提交
103
} __packed;
L
Linus Torvalds 已提交
104 105 106


/* Connect Initiate/Retransmit Initiate/Connect Confirm */
E
Eric Dumazet 已提交
107
struct  nsp_conn_init_msg {
108
	__u8   msgflg;
L
Linus Torvalds 已提交
109 110
#define NSP_CI      0x18            /* Connect Initiate     */
#define NSP_RCI     0x68            /* Retrans. Conn Init   */
111 112 113
	__le16 dstaddr;
	__le16 srcaddr;
	__u8   services;
L
Linus Torvalds 已提交
114 115 116 117
#define NSP_FC_NONE   0x00            /* Flow Control None    */
#define NSP_FC_SRC    0x04            /* Seg Req. Count       */
#define NSP_FC_SCMC   0x08            /* Sess. Control Mess   */
#define NSP_FC_MASK   0x0c            /* FC type mask         */
118 119
	__u8   info;
	__le16 segsize;
E
Eric Dumazet 已提交
120
} __packed;
L
Linus Torvalds 已提交
121 122

/* Disconnect Initiate/Disconnect Confirm */
E
Eric Dumazet 已提交
123
struct  nsp_disconn_init_msg {
124 125 126 127
	__u8   msgflg;
	__le16 dstaddr;
	__le16 srcaddr;
	__le16 reason;
E
Eric Dumazet 已提交
128
} __packed;
L
Linus Torvalds 已提交
129 130 131



E
Eric Dumazet 已提交
132
struct  srcobj_fmt {
133 134 135 136 137
	__u8   format;
	__u8   task;
	__le16 grpcode;
	__le16 usrcode;
	__u8   dlen;
E
Eric Dumazet 已提交
138
} __packed;
L
Linus Torvalds 已提交
139 140 141 142 143 144

/*
 * A collection of functions for manipulating the sequence
 * numbers used in NSP. Similar in operation to the functions
 * of the same name in TCP.
 */
145
static __inline__ int dn_before(__u16 seq1, __u16 seq2)
L
Linus Torvalds 已提交
146 147 148 149 150 151 152 153
{
        seq1 &= 0x0fff;
        seq2 &= 0x0fff;

        return (int)((seq1 - seq2) & 0x0fff) > 2048;
}


154
static __inline__ int dn_after(__u16 seq1, __u16 seq2)
L
Linus Torvalds 已提交
155 156 157 158 159 160 161
{
        seq1 &= 0x0fff;
        seq2 &= 0x0fff;

        return (int)((seq2 - seq1) & 0x0fff) > 2048;
}

162
static __inline__ int dn_equal(__u16 seq1, __u16 seq2)
L
Linus Torvalds 已提交
163 164 165 166
{
        return ((seq1 ^ seq2) & 0x0fff) == 0;
}

167
static __inline__ int dn_before_or_equal(__u16 seq1, __u16 seq2)
L
Linus Torvalds 已提交
168 169 170 171
{
	return (dn_before(seq1, seq2) || dn_equal(seq1, seq2));
}

172
static __inline__ void seq_add(__u16 *seq, __u16 off)
L
Linus Torvalds 已提交
173 174 175 176 177
{
        (*seq) += off;
        (*seq) &= 0x0fff;
}

178
static __inline__ int seq_next(__u16 seq1, __u16 seq2)
L
Linus Torvalds 已提交
179 180 181 182 183 184 185
{
	return dn_equal(seq1 + 1, seq2);
}

/*
 * Can we delay the ack ?
 */
186
static __inline__ int sendack(__u16 seq)
L
Linus Torvalds 已提交
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
{
        return (int)((seq & 0x1000) ? 0 : 1);
}

/*
 * Is socket congested ?
 */
static __inline__ int dn_congested(struct sock *sk)
{
        return atomic_read(&sk->sk_rmem_alloc) > (sk->sk_rcvbuf >> 1);
}

#define DN_MAX_NSP_DATA_HEADER (11)

#endif /* _NET_DN_NSP_H */