00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef NS_LINUX_UTIL_H
00019 #define NS_LINUX_UTIL_H
00020 #include <stdlib.h>
00021 #include "ns-linux-param.h"
00022
00023 extern struct tcp_congestion_ops tcp_reno;
00024
00025 extern unsigned long tcp_time_stamp;
00026 extern long long ktime_get_real;
00027
00028 #define JIFFY_RATIO 1000
00029 #define US_RATIO 1000000
00030 #define MS_RATIO 1000
00031
00032 #define jiffies_to_usecs(x) ((US_RATIO/JIFFY_RATIO)*(x))
00033 #define msecs_to_jiffies(x) ((JIFFY_RATIO/MS_RATIO)*(x))
00034
00035 extern void tcp_cong_avoid_register(void);
00036
00037 #define __u64 unsigned long long
00038 #define __u32 unsigned long
00039 #define __u16 unsigned int
00040 #define __u8 unsigned char
00041
00042 #define u64 __u64
00043 #define u32 __u32
00044 #define u16 __u16
00045 #define u8 __u8
00046
00047 #define s32 long
00048 #define s64 long long
00049
00050 #define uint64_t u64
00051 #define uint32_t u32
00052
00053 #define ktime_t s64
00054 extern ktime_t net_invalid_timestamp();
00055 extern int ktime_equal(const ktime_t cmp1, const ktime_t cmp2);
00056 extern s64 ktime_to_us(const ktime_t kt);
00057 extern ktime_t net_timedelta(ktime_t t);
00058
00059 #define inet_csk(sk) (sk)
00060 #define tcp_sk(sk) (sk)
00061 #define inet_csk_ca(sk) (void*)((sk)->icsk_ca_priv)
00062
00063
00064
00065 #define min_t(type,x,y) \
00066 (((type)(x)) < ((type)(y)) ? ((type)(x)): ((type)(y)))
00067
00068 #define max_t(type,x,y) \
00069 (((type)(x)) > ((type)(y)) ? ((type)(x)): ((type)(y)))
00070
00071
00072
00073
00074
00075 enum tcp_ca_event {
00076 CA_EVENT_TX_START,
00077 CA_EVENT_CWND_RESTART,
00078 CA_EVENT_COMPLETE_CWR,
00079 CA_EVENT_FRTO,
00080 CA_EVENT_LOSS,
00081 CA_EVENT_FAST_ACK,
00082 CA_EVENT_SLOW_ACK,
00083 };
00084
00085 #define sock tcp_sock
00086 #define inet_sock tcp_sock
00087 #define inet_connection_sock tcp_sock
00088 struct sk_buff;
00089 struct sock;
00090
00091
00092
00093 struct cc_param_list {
00094 const char* name;
00095 const char* type;
00096 const char* description;
00097 const void* ptr;
00098 struct cc_param_list* next;
00099 };
00100
00101 struct cc_list {
00102 const char* proto;
00103 struct cc_param_list* param_head;
00104 struct cc_list* next;
00105 };
00106 extern struct cc_list* cc_list_head;
00107
00108
00109 struct list_head {
00110 struct list_head *prev;
00111 struct list_head *next;
00112 const char* file_name;
00113 };
00114
00115 extern unsigned char cc_list_changed;
00116 extern struct list_head ns_tcp_cong_list;
00117 extern struct list_head *last_added;
00118 #define list_for_each_entry_rcu(pos, head, member) \
00119 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)
00120
00121 #define list_add_rcu(a,b) {\
00122 (a)->next=ns_tcp_cong_list.next;\
00123 (a)->prev=(&ns_tcp_cong_list);\
00124 ns_tcp_cong_list.next->prev=(a);\
00125 ns_tcp_cong_list.next=(a);\
00126 last_added = (a);\
00127 cc_list_changed = 1;\
00128 }
00129
00130 #define list_del_rcu(a) {(a)->prev->next=(a)->next; (a)->next->prev=(a)->prev; cc_list_changed = 1; }
00131 #define list_move(a,b) {list_del_rcu(a); list_add_rcu(a,b);}
00132 #define list_entry(a,b,c) ((b*)ns_tcp_cong_list.next)
00133 #define list_add_tail_rcu(a,b) {\
00134 (a)->prev=ns_tcp_cong_list.prev;\
00135 (a)->next=(&ns_tcp_cong_list);\
00136 ns_tcp_cong_list.prev->next=(a);\
00137 ns_tcp_cong_list.prev=(a);\
00138 last_added = (a);\
00139 cc_list_changed = 1;\
00140 }
00141
00142
00143
00144
00145 #define TCP_CA_NAME_MAX 16
00146 #define TCP_CONG_NON_RESTRICTED 0x1
00147 #define TCP_CONG_RTT_STAMP 0x2
00148 struct tcp_congestion_ops {
00149 struct list_head list;
00150
00151 unsigned long flags;
00152 int non_restricted;
00153
00154
00155 void (*init)(struct sock *sk);
00156
00157 void (*release)(struct sock *sk);
00158
00159
00160 u32 (*ssthresh)(struct sock *sk);
00161
00162 u32 (*min_cwnd)(const struct sock *sk);
00163
00164 void (*cong_avoid)(struct sock *sk, u32 ack,
00165 u32 rtt, u32 in_flight, int good_ack);
00166
00167 void (*rtt_sample)(struct sock *sk, u32 usrtt);
00168
00169 void (*set_state)(struct sock *sk, u8 new_state);
00170
00171 void (*cwnd_event)(struct sock *sk, enum tcp_ca_event ev);
00172
00173 u32 (*undo_cwnd)(struct sock *sk);
00174
00175 void (*pkts_acked)(struct sock *sk, u32 num_acked, ktime_t last);
00176
00177 void (*get_info)(struct sock *sk, u32 ext, struct sk_buff *skb);
00178
00179 char name[TCP_CA_NAME_MAX];
00180 struct module *owner;
00181 };
00182
00183 struct tcp_options_received {
00184
00185
00186
00187 __u32 rcv_tsval;
00188 __u32 rcv_tsecr;
00189 __u16 saw_tstamp : 1,
00190 dump_xxx: 15;
00191
00192
00193
00194
00195
00196
00197
00198
00199
00201
00202 };
00203
00204 struct tcp_sock {
00205
00206
00207 int sk_state;
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222 __u32 snd_nxt;
00223
00224 __u32 snd_una;
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242 __u32 mss_cache;
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256 __u32 srtt;
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268 struct tcp_options_received rx_opt;
00269
00270
00271
00272
00273 __u32 snd_ssthresh;
00274 __u32 snd_cwnd;
00275 __u16 snd_cwnd_cnt;
00276 __u16 snd_cwnd_clamp;
00277
00278 __u32 snd_cwnd_stamp;
00279 __u32 bytes_acked;
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334 struct tcp_congestion_ops *icsk_ca_ops;
00335 __u8 icsk_ca_state;
00336 u32 icsk_ca_priv[16];
00337 #define ICSK_CA_PRIV_SIZE (16 * sizeof(u32))
00338 };
00339
00340 struct sk_buff {
00341
00342 };
00343
00344 extern struct tcp_congestion_ops tcp_init_congestion_ops;
00345
00346
00347 enum tcp_ca_state
00348 {
00349 TCP_CA_Open = 0,
00350 #define TCPF_CA_Open (1<<TCP_CA_Open)
00351 TCP_CA_Disorder = 1,
00352 #define TCPF_CA_Disorder (1<<TCP_CA_Disorder)
00353 TCP_CA_CWR = 2,
00354 #define TCPF_CA_CWR (1<<TCP_CA_CWR)
00355 TCP_CA_Recovery = 3,
00356 #define TCPF_CA_Recovery (1<<TCP_CA_Recovery)
00357 TCP_CA_Loss = 4
00358 #define TCPF_CA_Loss (1<<TCP_CA_Loss)
00359 };
00360
00361 #define FLAG_ECE 1
00362 #define FLAG_DATA_SACKED 2
00363 #define FLAG_DATA_ACKED 4
00364 #define FLAG_DATA_LOST 8
00365 #define FLAG_CA_ALERT (FLAG_DATA_SACKED|FLAG_ECE)
00366 #define FLAG_NOT_DUP (FLAG_DATA_ACKED)
00367
00368 #define FLAG_UNSURE_TSTAMP 16
00369
00370 #define CONFIG_DEFAULT_TCP_CONG "reno"
00371 #define TCP_CLOSE 0
00372
00373 #endif