1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
|
/*
* TCP-Linux module for NS2
*
* May 2006
*
* Author: Xiaoliang (David) Wei (DavidWei@acm.org)
*
* NetLab, the California Institute of Technology
* http://netlab.caltech.edu
*
* Module: linux/ns-linux-c.h
* This is the header file of shortcuts for Linux source codes (in C)
* We shortcut most of the Linux system calls which are not related to congestion control.
*
* See a mini-tutorial about TCP-Linux at: http://netlab.caltech.edu/projects/ns2tcplinux/
*
*/
#ifndef NS_LINUX_C_H
#define NS_LINUX_C_H
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "ns-linux-util.h"
//For sharing Reno
extern u32 tcp_reno_ssthresh(struct sock *sk);
extern void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 rtt, u32 in_flight, int flag);
extern u32 tcp_reno_min_cwnd(const struct sock *sk);
#define tcp_is_cwnd_limited(sk, in_flight) ((in_flight) >= (sk)->snd_cwnd)
//from kernel.h
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
#define min(x,y) (((x)<(y))?(x):(y))
#define max(x,y) (((x)>(y))?(x):(y))
#define after(seq1,seq2) ((seq2)<(seq1))
#define HZ 1000
// Shortcuts
#define THIS_MODULE 0
#define EXPORT_SYMBOL_GPL(symbol)
#define __init
#define __exit
typedef int (*registerFunctionPointer)(void);
#ifdef NS_PROTOCOL
// for new source codes that defines NS_PROTOCOL, we support module parameters
// set the file name of last_added file
extern void set_linux_file_name(const char*);
extern void record_linux_param(const char*, const char*, const char*, void*);
extern void record_linux_param_description(const char*, const char*, const char*);
#define module_init(x) \
static void module_register(void) __attribute__((constructor));\
static void module_register(void) { \
x(); \
set_linux_file_name(NS_PROTOCOL);\
};
#define module_exit(x) \
static void module_unregister_fake(void) __attribute__((constructor));\
static void module_unregister_fake(void) {\
if (0) x();\
};
#define module_param(name, type, mode) \
static void module_param_##name(void) __attribute__((constructor));\
static void module_param_##name(void) { record_linux_param(NS_PROTOCOL, #name, #type, &name); };
#define MODULE_PARM_DESC(name, exp) \
static void module_param_desc_##name(void) __attribute__((constructor));\
static void module_param_desc_##name(void) { record_linux_param_description(NS_PROTOCOL, #name, exp); };
#else
// for old source codes that do not define NS_PROTOCOL, we do not support module parameters
#define module_init(x) \
static void module_register(void) __attribute__((constructor));\
static void module_register(void) { \
x(); \
};
#define module_param(a,b,c)
#define MODULE_PARM_DESC(a,b)
#endif
#define module_put(x)
#define try_module_get(x) 0
#define MODULE_AUTHOR(x)
#define MODULE_LICENSE(x)
#define MODULE_DESCRIPTION(x)
#define MODULE_VERSION(a)
#define KERN_ERR "<2> "
#define KERN_NOTICE "<1> "
#define KERN_INFO "<0> "
#define printk(fmt, args...) { \
if (strlen(fmt)<4 || fmt[0]!='<' || fmt[2]!='>' || fmt[3]!=' ') \
fprintf(stderr, "<Unspecified>" fmt, args);\
else if (fmt[1]>=debug_level+'0')\
printf(fmt, args);\
}
#define EINVAL 1
#define EEXIST 2
#define ENOENT 3
#define EBUSY 4
#define ENOMEM 5
#define EPERM 6
#define BUG_ON(x)
#define BUILD_BUG_ON(x)
#define WARN_ON(x)
//please make sure the system can run
#define spin_lock(x)
#define spin_unlock(x)
#define rcu_read_lock()
#define rcu_read_unlock()
#define late_initcall(x)
#define capable(x) 1
#define between(seq1, seq2, seq3) ((seq3) - (seq2) >= (seq1) - (seq2))
#define kstrdup(str, mode) strdup(str)
////////////For delay based protocols:
struct tcpvegas_info {
__u32 tcpv_enabled;
__u32 tcpv_rttcnt;
__u32 tcpv_rtt;
__u32 tcpv_minrtt;
};
#define INET_DIAG_VEGASINFO 1
struct rtattr {};
#define __RTA_PUT(skb, INFO_FLAG, size) NULL
#define RTA_DATA(rta) NULL
//#define DEFINE_SPINLOCK(x)
//#define LIST_HEAD(name)
#define DEFINE_SPINLOCK(x) int FAKED_LOCK_X
#define LIST_HEAD(name) int FAKED_LIST_HEAD
//The true list head is declared in ns-linux-util.h since it has to be accessible by TCP-Linux's cpp codes.
////////////For bit operations From include/linux/bitops.h /////////
/*
* fls: find last bit set.
*/
extern int fls(int x);
extern int fls64(__u64 x);
///// For 64 bit division from include/asm-generic/div64.h ////
#define do_div(n,base) ({ \
uint32_t __base = (base); \
uint32_t __rem; \
__rem = ((uint64_t)(n)) % __base; \
(n) = ((uint64_t)(n)) / __base; \
__rem; \
})
#define CONG_NUM 0
#define jiffies tcp_time_stamp
#define pr_debug(args...) {if ((debug_level+'0') <= KERN_NOTICE[1]) printf(args);}
#define __read_mostly
/* 64bit divisor, dividend and result. dynamic precision */
extern uint64_t div64_64(uint64_t dividend, uint64_t divisor);
#define nla_put(skb, type, len, data)
extern int tcp_register_congestion_control(struct tcp_congestion_ops *ca);
extern void tcp_slow_start(struct tcp_sock *tp);
extern void tcp_unregister_congestion_control(struct tcp_congestion_ops *ca);
#endif
|