0001
0002 #ifndef _NET_DN_NSP_H
0003 #define _NET_DN_NSP_H
0004
0005
0006
0007
0008
0009 #include <linux/atomic.h>
0010 #include <linux/types.h>
0011 #include <net/sock.h>
0012
0013 struct sk_buff;
0014 struct sk_buff_head;
0015
0016 void dn_nsp_send_data_ack(struct sock *sk);
0017 void dn_nsp_send_oth_ack(struct sock *sk);
0018 void dn_send_conn_ack(struct sock *sk);
0019 void dn_send_conn_conf(struct sock *sk, gfp_t gfp);
0020 void dn_nsp_send_disc(struct sock *sk, unsigned char type,
0021 unsigned short reason, gfp_t gfp);
0022 void dn_nsp_return_disc(struct sk_buff *skb, unsigned char type,
0023 unsigned short reason);
0024 void dn_nsp_send_link(struct sock *sk, unsigned char lsflags, char fcval);
0025 void dn_nsp_send_conninit(struct sock *sk, unsigned char flags);
0026
0027 void dn_nsp_output(struct sock *sk);
0028 int dn_nsp_check_xmit_queue(struct sock *sk, struct sk_buff *skb,
0029 struct sk_buff_head *q, unsigned short acknum);
0030 void dn_nsp_queue_xmit(struct sock *sk, struct sk_buff *skb, gfp_t gfp,
0031 int oob);
0032 unsigned long dn_nsp_persist(struct sock *sk);
0033 int dn_nsp_xmit_timeout(struct sock *sk);
0034
0035 int dn_nsp_rx(struct sk_buff *);
0036 int dn_nsp_backlog_rcv(struct sock *sk, struct sk_buff *skb);
0037
0038 struct sk_buff *dn_alloc_skb(struct sock *sk, int size, gfp_t pri);
0039 struct sk_buff *dn_alloc_send_skb(struct sock *sk, size_t *size, int noblock,
0040 long timeo, int *err);
0041
0042 #define NSP_REASON_OK 0
0043 #define NSP_REASON_NR 1
0044 #define NSP_REASON_UN 2
0045 #define NSP_REASON_SD 3
0046 #define NSP_REASON_ID 4
0047 #define NSP_REASON_ER 5
0048 #define NSP_REASON_OB 6
0049 #define NSP_REASON_US 7
0050 #define NSP_REASON_TP 8
0051 #define NSP_REASON_EA 9
0052 #define NSP_REASON_IF 10
0053 #define NSP_REASON_LS 11
0054 #define NSP_REASON_LL 32
0055 #define NSP_REASON_LE 33
0056 #define NSP_REASON_UR 34
0057 #define NSP_REASON_UA 36
0058 #define NSP_REASON_TM 38
0059 #define NSP_REASON_NU 39
0060 #define NSP_REASON_NL 41
0061 #define NSP_REASON_DC 42
0062 #define NSP_REASON_IO 43
0063
0064 #define NSP_DISCINIT 0x38
0065 #define NSP_DISCCONF 0x48
0066
0067
0068
0069
0070
0071
0072
0073 struct nsp_data_seg_msg {
0074 __u8 msgflg;
0075 __le16 dstaddr;
0076 __le16 srcaddr;
0077 } __packed;
0078
0079 struct nsp_data_opt_msg {
0080 __le16 acknum;
0081 __le16 segnum;
0082 __le16 lsflgs;
0083 } __packed;
0084
0085 struct nsp_data_opt_msg1 {
0086 __le16 acknum;
0087 __le16 segnum;
0088 } __packed;
0089
0090
0091
0092 struct nsp_data_ack_msg {
0093 __u8 msgflg;
0094 __le16 dstaddr;
0095 __le16 srcaddr;
0096 __le16 acknum;
0097 } __packed;
0098
0099
0100 struct nsp_conn_ack_msg {
0101 __u8 msgflg;
0102 __le16 dstaddr;
0103 } __packed;
0104
0105
0106
0107 struct nsp_conn_init_msg {
0108 __u8 msgflg;
0109 #define NSP_CI 0x18
0110 #define NSP_RCI 0x68
0111 __le16 dstaddr;
0112 __le16 srcaddr;
0113 __u8 services;
0114 #define NSP_FC_NONE 0x00
0115 #define NSP_FC_SRC 0x04
0116 #define NSP_FC_SCMC 0x08
0117 #define NSP_FC_MASK 0x0c
0118 __u8 info;
0119 __le16 segsize;
0120 } __packed;
0121
0122
0123 struct nsp_disconn_init_msg {
0124 __u8 msgflg;
0125 __le16 dstaddr;
0126 __le16 srcaddr;
0127 __le16 reason;
0128 } __packed;
0129
0130
0131
0132 struct srcobj_fmt {
0133 __u8 format;
0134 __u8 task;
0135 __le16 grpcode;
0136 __le16 usrcode;
0137 __u8 dlen;
0138 } __packed;
0139
0140
0141
0142
0143
0144
0145 static __inline__ int dn_before(__u16 seq1, __u16 seq2)
0146 {
0147 seq1 &= 0x0fff;
0148 seq2 &= 0x0fff;
0149
0150 return (int)((seq1 - seq2) & 0x0fff) > 2048;
0151 }
0152
0153
0154 static __inline__ int dn_after(__u16 seq1, __u16 seq2)
0155 {
0156 seq1 &= 0x0fff;
0157 seq2 &= 0x0fff;
0158
0159 return (int)((seq2 - seq1) & 0x0fff) > 2048;
0160 }
0161
0162 static __inline__ int dn_equal(__u16 seq1, __u16 seq2)
0163 {
0164 return ((seq1 ^ seq2) & 0x0fff) == 0;
0165 }
0166
0167 static __inline__ int dn_before_or_equal(__u16 seq1, __u16 seq2)
0168 {
0169 return (dn_before(seq1, seq2) || dn_equal(seq1, seq2));
0170 }
0171
0172 static __inline__ void seq_add(__u16 *seq, __u16 off)
0173 {
0174 (*seq) += off;
0175 (*seq) &= 0x0fff;
0176 }
0177
0178 static __inline__ int seq_next(__u16 seq1, __u16 seq2)
0179 {
0180 return dn_equal(seq1 + 1, seq2);
0181 }
0182
0183
0184
0185
0186 static __inline__ int sendack(__u16 seq)
0187 {
0188 return (int)((seq & 0x1000) ? 0 : 1);
0189 }
0190
0191
0192
0193
0194 static __inline__ int dn_congested(struct sock *sk)
0195 {
0196 return atomic_read(&sk->sk_rmem_alloc) > (sk->sk_rcvbuf >> 1);
0197 }
0198
0199 #define DN_MAX_NSP_DATA_HEADER (11)
0200
0201 #endif