dn_nsp.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:7k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef _NET_DN_NSP_H
  2. #define _NET_DN_NSP_H
  3. /******************************************************************************
  4.     (c) 1995-1998 E.M. Serrat emserrat@geocities.com
  5.     
  6.     This program is free software; you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation; either version 2 of the License, or
  9.     any later version.
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14. *******************************************************************************/
  15. /* dn_nsp.c functions prototyping */
  16. extern void dn_nsp_send_data_ack(struct sock *sk);
  17. extern void dn_nsp_send_oth_ack(struct sock *sk);
  18. extern void dn_nsp_delayed_ack(struct sock *sk);
  19. extern void dn_send_conn_ack(struct sock *sk);
  20. extern void dn_send_conn_conf(struct sock *sk, int gfp);
  21. extern void dn_nsp_send_disc(struct sock *sk, unsigned char type, 
  22. unsigned short reason, int gfp);
  23. extern void dn_nsp_return_disc(struct sk_buff *skb, unsigned char type,
  24. unsigned short reason);
  25. extern void dn_nsp_send_link(struct sock *sk, unsigned char lsflags, char fcval);
  26. extern void dn_nsp_send_conninit(struct sock *sk, unsigned char flags);
  27. extern void dn_nsp_output(struct sock *sk);
  28. extern int dn_nsp_check_xmit_queue(struct sock *sk, struct sk_buff *skb, struct sk_buff_head *q, unsigned short acknum);
  29. extern void dn_nsp_queue_xmit(struct sock *sk, struct sk_buff *skb, int gfp, int oob);
  30. extern unsigned long dn_nsp_persist(struct sock *sk);
  31. extern int dn_nsp_xmit_timeout(struct sock *sk);
  32. extern int dn_nsp_rx(struct sk_buff *);
  33. extern int dn_nsp_backlog_rcv(struct sock *sk, struct sk_buff *skb);
  34. extern struct sk_buff *dn_alloc_skb(struct sock *sk, int size, int pri);
  35. extern struct sk_buff *dn_alloc_send_skb(struct sock *sk, int *size, int noblock, int *err);
  36. #define NSP_REASON_OK 0 /* No error */
  37. #define NSP_REASON_NR 1 /* No resources */
  38. #define NSP_REASON_UN 2 /* Unrecognised node name */
  39. #define NSP_REASON_SD 3 /* Node shutting down */
  40. #define NSP_REASON_ID 4 /* Invalid destination end user */
  41. #define NSP_REASON_ER 5 /* End user lacks resources */
  42. #define NSP_REASON_OB 6 /* Object too busy */
  43. #define NSP_REASON_US 7 /* Unspecified error */
  44. #define NSP_REASON_TP 8 /* Third-Party abort */
  45. #define NSP_REASON_EA 9 /* End user has aborted the link */
  46. #define NSP_REASON_IF 10 /* Invalid node name format */
  47. #define NSP_REASON_LS 11 /* Local node shutdown */
  48. #define NSP_REASON_LL 32 /* Node lacks logical-link resources */
  49. #define NSP_REASON_LE 33 /* End user lacks logical-link resources */
  50. #define NSP_REASON_UR 34 /* Unacceptable RQSTRID or PASSWORD field */
  51. #define NSP_REASON_UA 36 /* Unacceptable ACCOUNT field */
  52. #define NSP_REASON_TM 38 /* End user timed out logical link */
  53. #define NSP_REASON_NU 39 /* Node unreachable */
  54. #define NSP_REASON_NL 41 /* No-link message */
  55. #define NSP_REASON_DC 42 /* Disconnect confirm */
  56. #define NSP_REASON_IO 43 /* Image data field overflow */
  57. #define NSP_DISCINIT 0x38
  58. #define NSP_DISCCONF 0x48
  59. /*------------------------- NSP - messages ------------------------------*/
  60. /* Data Messages */
  61. /*---------------*/
  62. /* Data Messages    (data segment/interrupt/link service)               */
  63. struct nsp_data_seg_msg
  64. {
  65. unsigned char   msgflg          __attribute__((packed));
  66. unsigned short  dstaddr         __attribute__((packed));
  67. unsigned short  srcaddr         __attribute__((packed));
  68. };
  69. struct nsp_data_opt_msg
  70. {
  71. unsigned short  acknum          __attribute__((packed));
  72. unsigned short  segnum          __attribute__((packed));
  73. unsigned short  lsflgs          __attribute__((packed));
  74. };
  75. struct nsp_data_opt_msg1
  76. {
  77. unsigned short  acknum          __attribute__((packed));
  78. unsigned short  segnum          __attribute__((packed));
  79. };
  80. /* Acknowledgment Message (data/other data)                             */
  81. struct nsp_data_ack_msg
  82. {
  83. unsigned char   msgflg          __attribute__((packed));
  84. unsigned short  dstaddr         __attribute__((packed));
  85. unsigned short  srcaddr         __attribute__((packed));
  86. unsigned short  acknum          __attribute__((packed));
  87. };
  88. /* Connect Acknowledgment Message */
  89. struct  nsp_conn_ack_msg
  90. {
  91. unsigned char   msgflg          __attribute__((packed));
  92. unsigned short  dstaddr         __attribute__((packed));
  93. };
  94. /* Connect Initiate/Retransmit Initiate/Connect Confirm */
  95. struct  nsp_conn_init_msg
  96. {
  97. unsigned char   msgflg          __attribute__((packed));
  98. #define NSP_CI      0x18            /* Connect Initiate     */
  99. #define NSP_RCI     0x68            /* Retrans. Conn Init   */
  100. unsigned short  dstaddr         __attribute__((packed));
  101.         unsigned short  srcaddr         __attribute__((packed));
  102.         unsigned char   services        __attribute__((packed));
  103. #define NSP_FC_NONE   0x00            /* Flow Control None    */
  104. #define NSP_FC_SRC    0x04            /* Seg Req. Count       */
  105. #define NSP_FC_SCMC   0x08            /* Sess. Control Mess   */
  106. #define NSP_FC_MASK   0x0c            /* FC type mask         */
  107. unsigned char   info            __attribute__((packed));
  108.         unsigned short  segsize         __attribute__((packed));
  109. };
  110. /* Disconnect Initiate/Disconnect Confirm */
  111. struct  nsp_disconn_init_msg
  112. {
  113. unsigned char   msgflg          __attribute__((packed));
  114.         unsigned short  dstaddr         __attribute__((packed));
  115.         unsigned short  srcaddr         __attribute__((packed));
  116.         unsigned short  reason          __attribute__((packed));
  117. };
  118. struct  srcobj_fmt
  119. {
  120. char            format          __attribute__((packed));
  121.         unsigned char   task            __attribute__((packed));
  122.         unsigned short  grpcode         __attribute__((packed));
  123.         unsigned short  usrcode         __attribute__((packed));
  124.         char            dlen            __attribute__((packed));
  125. };
  126. /*
  127.  * A collection of functions for manipulating the sequence
  128.  * numbers used in NSP. Similar in operation to the functions
  129.  * of the same name in TCP.
  130.  */
  131. static __inline__ int before(unsigned short seq1, unsigned short seq2)
  132. {
  133.         seq1 &= 0x0fff;
  134.         seq2 &= 0x0fff;
  135.         return (int)((seq1 - seq2) & 0x0fff) > 2048;
  136. }
  137. static __inline__ int after(unsigned short seq1, unsigned short seq2)
  138. {
  139.         seq1 &= 0x0fff;
  140.         seq2 &= 0x0fff;
  141.         return (int)((seq2 - seq1) & 0x0fff) > 2048;
  142. }
  143. static __inline__ int equal(unsigned short seq1, unsigned short seq2)
  144. {
  145.         return ((seq1 ^ seq2) & 0x0fff) == 0;
  146. }
  147. static __inline__ int before_or_equal(unsigned short seq1, unsigned short seq2)
  148. {
  149. return (before(seq1, seq2) || equal(seq1, seq2));
  150. }
  151. static __inline__ void seq_add(unsigned short *seq, unsigned short off)
  152. {
  153.         (*seq) += off;
  154.         (*seq) &= 0x0fff;
  155. }
  156. static __inline__ int seq_next(unsigned short seq1, unsigned short seq2)
  157. {
  158. return equal(seq1 + 1, seq2);
  159. }
  160. /*
  161.  * Can we delay the ack ?
  162.  */
  163. static __inline__ int sendack(unsigned short seq)
  164. {
  165.         return (int)((seq & 0x1000) ? 0 : 1);
  166. }
  167. /*
  168.  * Is socket congested ?
  169.  */
  170. static __inline__ int dn_congested(struct sock *sk)
  171. {
  172.         return atomic_read(&sk->rmem_alloc) > (sk->rcvbuf >> 1);
  173. }
  174. #endif /* _NET_DN_NSP_H */