ns-linux-util.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:11k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * TCP-Linux module for NS2 
  3.  *
  4.  * May 2006
  5.  *
  6.  * Author: Xiaoliang (David) Wei  (DavidWei@acm.org)
  7.  *
  8.  * NetLab, the California Institute of Technology 
  9.  * http://netlab.caltech.edu
  10.  *
  11.  * Module: linux/ns-linux-util.h
  12.  *      This is the header file for linkages between NS-2 source codes (in C++) and Linux source codes (in C)
  13.  *
  14.  * See a mini-tutorial about TCP-Linux at: http://netlab.caltech.edu/projects/ns2tcplinux/
  15.  *
  16.  */
  17. #ifndef NS_LINUX_UTIL_H
  18. #define NS_LINUX_UTIL_H
  19. #include <stdlib.h>
  20. #include "ns-linux-param.h"
  21. extern struct tcp_congestion_ops tcp_reno;
  22. extern unsigned long tcp_time_stamp;
  23. extern long long ktime_get_real;
  24. #define JIFFY_RATIO 1000
  25. #define US_RATIO 1000000
  26. #define MS_RATIO 1000
  27. #define jiffies_to_usecs(x) ((US_RATIO/JIFFY_RATIO)*(x))
  28. #define msecs_to_jiffies(x) ((JIFFY_RATIO/MS_RATIO)*(x))
  29. extern void tcp_cong_avoid_register(void);
  30. #define __u64 unsigned long long
  31. #define __u32 unsigned long
  32. #define __u16 unsigned int
  33. #define __u8 unsigned char
  34. #define u64 __u64
  35. #define u32 __u32
  36. #define u16 __u16
  37. #define u8 __u8
  38. #define s32 long
  39. #define s64 long long
  40. #define uint64_t u64
  41. #define uint32_t u32
  42. #define ktime_t s64
  43. extern ktime_t net_invalid_timestamp();
  44. extern int ktime_equal(const ktime_t cmp1, const ktime_t cmp2);
  45. extern s64 ktime_to_us(const ktime_t kt);
  46. extern ktime_t net_timedelta(ktime_t t);
  47. #define inet_csk(sk) (sk)
  48. #define tcp_sk(sk) (sk)
  49. #define inet_csk_ca(sk) (void*)((sk)->icsk_ca_priv)
  50. //from kernel.h
  51. #define min_t(type,x,y) 
  52. (((type)(x)) < ((type)(y)) ? ((type)(x)): ((type)(y)))
  53. #define max_t(type,x,y) 
  54. (((type)(x)) > ((type)(y)) ? ((type)(x)): ((type)(y)))
  55. //#define max(x,y) ((x>y)? x:y)
  56. /* Events passed to congestion control interface */
  57. enum tcp_ca_event {
  58. CA_EVENT_TX_START, /* first transmit when no packets in flight */
  59. CA_EVENT_CWND_RESTART, /* congestion window restart */
  60. CA_EVENT_COMPLETE_CWR, /* end of congestion recovery */
  61. CA_EVENT_FRTO, /* fast recovery timeout */
  62. CA_EVENT_LOSS, /* loss timeout */
  63. CA_EVENT_FAST_ACK, /* in sequence ack */
  64. CA_EVENT_SLOW_ACK, /* other ack */
  65. };
  66. #define sock tcp_sock
  67. #define inet_sock tcp_sock
  68. #define inet_connection_sock tcp_sock
  69. struct sk_buff;
  70. struct sock;
  71. /* A list of parameters for different cc */
  72. struct cc_param_list {
  73. const char* name;
  74. const char* type;
  75. const char* description;
  76. const void* ptr;
  77. struct cc_param_list* next;
  78. };
  79. struct cc_list {
  80. const char* proto;
  81. struct cc_param_list* param_head;
  82. struct cc_list* next;
  83. };
  84. extern struct cc_list* cc_list_head;
  85. /* List Type purely for tcp_cong_list*/
  86. struct list_head {
  87. struct list_head *prev;
  88. struct list_head *next;
  89. const char* file_name;
  90. };
  91. extern unsigned char cc_list_changed;
  92. extern struct list_head ns_tcp_cong_list;
  93. extern struct list_head *last_added;
  94. #define list_for_each_entry_rcu(pos, head, member) 
  95. for (pos=(struct tcp_congestion_ops*)ns_tcp_cong_list.next; pos!=(struct tcp_congestion_ops*)(&ns_tcp_cong_list); pos=(struct tcp_congestion_ops*)pos->member.next) 
  96. #define list_add_rcu(a,b) {
  97. (a)->next=ns_tcp_cong_list.next;
  98. (a)->prev=(&ns_tcp_cong_list);
  99. ns_tcp_cong_list.next->prev=(a);
  100. ns_tcp_cong_list.next=(a);
  101. last_added = (a);
  102. cc_list_changed = 1;
  103. }
  104. #define list_del_rcu(a) {(a)->prev->next=(a)->next; (a)->next->prev=(a)->prev; cc_list_changed = 1; }
  105. #define list_move(a,b) {list_del_rcu(a); list_add_rcu(a,b);}
  106. #define list_entry(a,b,c) ((b*)ns_tcp_cong_list.next)
  107. #define list_add_tail_rcu(a,b) {
  108. (a)->prev=ns_tcp_cong_list.prev;
  109. (a)->next=(&ns_tcp_cong_list);
  110. ns_tcp_cong_list.prev->next=(a);
  111. ns_tcp_cong_list.prev=(a);
  112. last_added = (a);
  113. cc_list_changed = 1;
  114. }
  115. /*
  116.  * Interface for adding new TCP congestion control handlers
  117.  */
  118. #define TCP_CA_NAME_MAX 16
  119. #define TCP_CONG_NON_RESTRICTED 0x1
  120. #define TCP_CONG_RTT_STAMP      0x2
  121. struct tcp_congestion_ops {
  122. struct list_head list;
  123. unsigned long flags;
  124. int non_restricted;
  125. /* initialize private data (optional) */
  126. void (*init)(struct sock *sk);
  127. /* cleanup private data  (optional) */
  128. void (*release)(struct sock *sk);
  129. /* return slow start threshold (required) */
  130. u32 (*ssthresh)(struct sock *sk);
  131. /* lower bound for congestion window (optional) */
  132. u32 (*min_cwnd)(const struct sock *sk);
  133. /* do new cwnd calculation (required) */
  134. void (*cong_avoid)(struct sock *sk, u32 ack,
  135.    u32 rtt, u32 in_flight, int good_ack);
  136. /* round trip time sample per acked packet (optional) */
  137. void (*rtt_sample)(struct sock *sk, u32 usrtt);
  138. /* call before changing ca_state (optional) */
  139. void (*set_state)(struct sock *sk, u8 new_state);
  140. /* call when cwnd event occurs (optional) */
  141. void (*cwnd_event)(struct sock *sk, enum tcp_ca_event ev);
  142. /* new value of cwnd after loss (optional) */
  143. u32  (*undo_cwnd)(struct sock *sk);
  144. /* hook for packet ack accounting (optional) */
  145. void (*pkts_acked)(struct sock *sk, u32 num_acked, ktime_t last);
  146. /* get info for inet_diag (optional) */
  147. void (*get_info)(struct sock *sk, u32 ext, struct sk_buff *skb);
  148. char  name[TCP_CA_NAME_MAX];
  149. struct module  *owner;
  150. };
  151. struct tcp_options_received {
  152. /* PAWS/RTTM data */
  153. // long ts_recent_stamp;/* Time we stored ts_recent (for aging) */
  154. // __u32 ts_recent; /* Time stamp to echo next */
  155. __u32 rcv_tsval; /* Time stamp value              */
  156. __u32 rcv_tsecr; /* Time stamp echo reply         */
  157. __u16  saw_tstamp : 1, /* Saw TIMESTAMP on last packet */
  158. dump_xxx: 15;
  159. // tstamp_ok : 1, /* TIMESTAMP seen on SYN packet */
  160. // dsack : 1, /* D-SACK is scheduled */
  161. // wscale_ok : 1, /* Wscale seen on SYN packet */
  162. // sack_ok : 4, /* SACK seen on SYN packet */
  163. // snd_wscale : 4, /* Window scaling received from sender */
  164. // rcv_wscale : 4; /* Window scaling to send to receiver */
  165. /* SACKs data */
  166. // __u8 eff_sacks; /* Size of SACK array to send with next packet */
  167. // __u8 num_sacks; /* Number of SACK blocks */
  168. /// __u16 user_mss;   /* mss requested by user in ioctl */
  169. // __u16 mss_clamp; /* Maximal mss, negotiated at connection setup */
  170. };
  171. struct tcp_sock {
  172. /* inet_connection_sock has to be the first member of tcp_sock */
  173. // struct inet_connection_sock inet_conn;
  174. int sk_state;
  175. //  int tcp_header_len; /* Bytes of tcp header to send */
  176. /*
  177.  * Header prediction flags
  178.  * 0x5?10 << 16 + snd_wnd in net byte order
  179.  */
  180. // __u32 pred_flags;
  181. /*
  182.  * RFC793 variables by their proper names. This means you can
  183.  * read the code and the spec side by side (and laugh ...)
  184.  * See RFC793 and RFC1122. The RFC writes these in capitals.
  185.  */
  186. //  __u32 rcv_nxt; /* What we want to receive next  */
  187.   __u32 snd_nxt; /* Next sequence we send */
  188.   __u32 snd_una; /* First byte we want an ack for */
  189. //  __u32 snd_sml; /* Last byte of the most recently transmitted small packet */
  190. // __u32 rcv_tstamp; /* timestamp of last received ACK (for keepalives) */
  191. // __u32 lsndtime; /* timestamp of last sent data packet (for restart window) */
  192. /* Data for direct copy to user */
  193. // struct {
  194. // struct sk_buff_head prequeue;
  195. // struct task_struct *task;
  196. // struct iovec *iov;
  197. // int memory;
  198. // int len;
  199. // } ucopy;
  200. // __u32 snd_wl1; /* Sequence for window update */
  201. // __u32 snd_wnd; /* The window we expect to receive */
  202. // __u32 max_window; /* Maximal window ever seen from peer */
  203. // __u32 pmtu_cookie; /* Last pmtu seen by socket */
  204. __u32 mss_cache; /* Cached effective mss, not including SACKS */
  205. // __u16 xmit_size_goal; /* Goal for segmenting output packets */
  206. // __u16 ext_header_len; /* Network protocol overhead (IP/IPv6 options) */
  207. //
  208. // __u32 window_clamp; /* Maximal window to advertise */
  209. // __u32 rcv_ssthresh; /* Current window clamp */
  210. //
  211. // __u32 frto_highmark; /* snd_nxt when RTO occurred */
  212. // __u8 reordering; /* Packet reordering metric. */
  213. // __u8 frto_counter; /* Number of new acks after RTO */
  214. // __u8 nonagle; /* Disable Nagle algorithm?             */
  215. // __u8 keepalive_probes; /* num of allowed keep alive probes */
  216. /* RTT measurement */
  217. __u32 srtt; /* smoothed round trip time << 3 */
  218. // __u32 mdev; /* medium deviation */
  219. // __u32 mdev_max; /* maximal mdev for the last rtt period */
  220. // __u32 rttvar; /* smoothed mdev_max */
  221. // __u32 rtt_seq; /* sequence number to update rttvar */
  222. //
  223. // __u32 packets_out; /* Packets which are "in flight" */
  224. // __u32 left_out; /* Packets which leaved network */
  225. // __u32 retrans_out; /* Retransmitted packets out */
  226. /*
  227.  *      Options received (usually on last packet, some only on SYN packets).
  228.  */
  229. struct tcp_options_received rx_opt;
  230. /*
  231.  * Slow start and congestion control (see also Nagle, and Karn & Partridge)
  232.  */
  233.   __u32 snd_ssthresh; /* Slow start size threshold */
  234. __u32 snd_cwnd; /* Sending congestion window */
  235.   __u16 snd_cwnd_cnt; /* Linear increase counter */
  236. __u16 snd_cwnd_clamp; /* Do not allow snd_cwnd to grow above this */
  237. // __u32 snd_cwnd_used;
  238. __u32 snd_cwnd_stamp;
  239. __u32 bytes_acked;
  240. //
  241. // struct sk_buff_head out_of_order_queue; /* Out of order segments go here */
  242. //
  243. // struct tcp_func *af_specific; /* Operations which are AF_INET{4,6} specific */
  244. //
  245.  // __u32 rcv_wnd; /* Current receiver window */
  246. // __u32 rcv_wup; /* rcv_nxt on last window update sent */
  247. // __u32 write_seq; /* Tail(+1) of data held in tcp send buffer */
  248. // __u32 pushed_seq; /* Last pushed seq, required to talk to windows */
  249. // __u32 copied_seq; /* Head of yet unread data */
  250. //
  251. /* SACKs data */
  252. // struct tcp_sack_block duplicate_sack[1]; /* D-SACK block */
  253. // struct tcp_sack_block selective_acks[4]; /* The SACKS themselves*/
  254. // __u16 advmss; /* Advertised MSS */
  255. // __u16 prior_ssthresh; /* ssthresh saved at recovery start */
  256. // __u32 lost_out; /* Lost packets */
  257. // __u32 sacked_out; /* SACK'd packets */
  258. // __u32 fackets_out; /* FACK'd packets */
  259. // __u32 high_seq; /* snd_nxt at onset of congestion */
  260. //
  261. // __u32 retrans_stamp; /* Timestamp of the last retransmit,
  262. //  * also used in SYN-SENT to remember stamp of
  263. //  * the first SYN. */
  264. // __u32 undo_marker; /* tracking retrans started here. */
  265. // int undo_retrans; /* number of undoable retransmissions. */
  266. // __u32 urg_seq; /* Seq of received urgent pointer */
  267. // __u16 urg_data; /* Saved octet of OOB data and control flags */
  268. // __u8 urg_mode; /* In urgent mode */
  269. // __u8 ecn_flags; /* ECN status bits. */
  270. // __u32 snd_up; /* Urgent pointer */
  271. //
  272. // __u32 total_retrans; /* Total retransmits for entire connection */
  273. //
  274. // unsigned int keepalive_time;   /* time before keep alive takes place */
  275. // unsigned int keepalive_intvl;  /* time interval between keep alive probes */
  276. // int linger2;
  277. //
  278. // unsigned long last_synq_overflow; 
  279. //
  280. /* Receiver side RTT estimation */
  281. // struct {
  282. // __u32 rtt;
  283. // __u32 seq;
  284. // __u32 time;
  285. // } rcv_rtt_est;
  286. /* Receiver queue space */
  287. // struct {
  288. // int space;
  289. // __u32 seq;
  290. // __u32 time;
  291. // } rcvq_space;
  292. struct tcp_congestion_ops *icsk_ca_ops;
  293. __u8   icsk_ca_state;
  294. u32   icsk_ca_priv[16];
  295. #define ICSK_CA_PRIV_SIZE (16 * sizeof(u32))
  296. };
  297. struct sk_buff {
  298. };
  299. extern struct tcp_congestion_ops tcp_init_congestion_ops;
  300. enum tcp_ca_state
  301. {
  302. TCP_CA_Open = 0,
  303. #define TCPF_CA_Open (1<<TCP_CA_Open)
  304. TCP_CA_Disorder = 1,
  305. #define TCPF_CA_Disorder (1<<TCP_CA_Disorder)
  306. TCP_CA_CWR = 2,
  307. #define TCPF_CA_CWR (1<<TCP_CA_CWR)
  308. TCP_CA_Recovery = 3,
  309. #define TCPF_CA_Recovery (1<<TCP_CA_Recovery)
  310. TCP_CA_Loss = 4
  311. #define TCPF_CA_Loss (1<<TCP_CA_Loss)
  312. };
  313. #define FLAG_ECE 1
  314. #define FLAG_DATA_SACKED 2
  315. #define FLAG_DATA_ACKED 4
  316. #define FLAG_DATA_LOST 8
  317. #define FLAG_CA_ALERT           (FLAG_DATA_SACKED|FLAG_ECE)
  318. #define FLAG_NOT_DUP (FLAG_DATA_ACKED)
  319. #define FLAG_UNSURE_TSTAMP 16
  320. #define CONFIG_DEFAULT_TCP_CONG "reno"
  321. #define TCP_CLOSE 0
  322. #endif