Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 #ifndef _NET_DN_NSP_H
0003 #define _NET_DN_NSP_H
0004 /******************************************************************************
0005     (c) 1995-1998 E.M. Serrat       emserrat@geocities.com
0006     
0007 *******************************************************************************/
0008 /* dn_nsp.c functions prototyping */
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     /* No error */
0043 #define NSP_REASON_NR 1     /* No resources */
0044 #define NSP_REASON_UN 2     /* Unrecognised node name */
0045 #define NSP_REASON_SD 3     /* Node shutting down */
0046 #define NSP_REASON_ID 4     /* Invalid destination end user */
0047 #define NSP_REASON_ER 5     /* End user lacks resources */
0048 #define NSP_REASON_OB 6     /* Object too busy */
0049 #define NSP_REASON_US 7     /* Unspecified error */
0050 #define NSP_REASON_TP 8     /* Third-Party abort */
0051 #define NSP_REASON_EA 9     /* End user has aborted the link */
0052 #define NSP_REASON_IF 10    /* Invalid node name format */
0053 #define NSP_REASON_LS 11    /* Local node shutdown */
0054 #define NSP_REASON_LL 32    /* Node lacks logical-link resources */
0055 #define NSP_REASON_LE 33    /* End user lacks logical-link resources */
0056 #define NSP_REASON_UR 34    /* Unacceptable RQSTRID or PASSWORD field */
0057 #define NSP_REASON_UA 36    /* Unacceptable ACCOUNT field */
0058 #define NSP_REASON_TM 38    /* End user timed out logical link */
0059 #define NSP_REASON_NU 39    /* Node unreachable */
0060 #define NSP_REASON_NL 41    /* No-link message */
0061 #define NSP_REASON_DC 42    /* Disconnect confirm */
0062 #define NSP_REASON_IO 43    /* Image data field overflow */
0063 
0064 #define NSP_DISCINIT 0x38
0065 #define NSP_DISCCONF 0x48
0066 
0067 /*------------------------- NSP - messages ------------------------------*/
0068 /* Data Messages */
0069 /*---------------*/
0070 
0071 /* Data Messages    (data segment/interrupt/link service)               */
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 /* Acknowledgment Message (data/other data)                             */
0092 struct nsp_data_ack_msg {
0093     __u8   msgflg;
0094     __le16 dstaddr;
0095     __le16 srcaddr;
0096     __le16 acknum;
0097 } __packed;
0098 
0099 /* Connect Acknowledgment Message */
0100 struct  nsp_conn_ack_msg {
0101     __u8 msgflg;
0102     __le16 dstaddr;
0103 } __packed;
0104 
0105 
0106 /* Connect Initiate/Retransmit Initiate/Connect Confirm */
0107 struct  nsp_conn_init_msg {
0108     __u8   msgflg;
0109 #define NSP_CI      0x18            /* Connect Initiate     */
0110 #define NSP_RCI     0x68            /* Retrans. Conn Init   */
0111     __le16 dstaddr;
0112     __le16 srcaddr;
0113     __u8   services;
0114 #define NSP_FC_NONE   0x00            /* Flow Control None    */
0115 #define NSP_FC_SRC    0x04            /* Seg Req. Count       */
0116 #define NSP_FC_SCMC   0x08            /* Sess. Control Mess   */
0117 #define NSP_FC_MASK   0x0c            /* FC type mask         */
0118     __u8   info;
0119     __le16 segsize;
0120 } __packed;
0121 
0122 /* Disconnect Initiate/Disconnect Confirm */
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  * A collection of functions for manipulating the sequence
0142  * numbers used in NSP. Similar in operation to the functions
0143  * of the same name in TCP.
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  * Can we delay the ack ?
0185  */
0186 static __inline__ int sendack(__u16 seq)
0187 {
0188         return (int)((seq & 0x1000) ? 0 : 1);
0189 }
0190 
0191 /*
0192  * Is socket congested ?
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 /* _NET_DN_NSP_H */