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

通讯编程

开发平台:

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-c.c
  12.  *      This is the utilities of shortcuts for Linux source codes (in C) 
  13.  *      We shortcut most of the Linux system calls which are not related to congestion control.
  14.  *
  15.  * See a mini-tutorial about TCP-Linux at: http://netlab.caltech.edu/projects/ns2tcplinux/
  16.  *
  17.  */
  18. #ifndef NS_LINUX_C_C
  19. #define NS_LINUX_C_C
  20. #include "ns-linux-util.h"
  21. #include "ns-linux-c.h"
  22. int fls(int x)
  23. {
  24.         int r = 32;
  25.         if (!x)
  26.                 return 0;
  27.         if (!(x & 0xffff0000u)) {
  28.                 x <<= 16;
  29.                 r -= 16;
  30.         }
  31.         if (!(x & 0xff000000u)) {
  32.                 x <<= 8;
  33.                 r -= 8;
  34.         }
  35.         if (!(x & 0xf0000000u)) {
  36.                 x <<= 4;
  37.                 r -= 4;
  38.         }
  39.         if (!(x & 0xc0000000u)) {
  40.                 x <<= 2;
  41.                 r -= 2;
  42.         }
  43.         if (!(x & 0x80000000u)) {
  44.                 x <<= 1;
  45.                 r -= 1;
  46.         }
  47.         return r;
  48. }
  49. int fls64(__u64 x)
  50. {
  51.         __u32 h = x >> 32;
  52.         if (h)
  53.                 return fls(h) + 32;
  54.         return fls(x);
  55. }
  56. // set the file name of last_added file
  57. void set_linux_file_name(const char* name) {
  58. if (last_added != &ns_tcp_cong_list) {
  59. last_added->file_name = name;
  60. };
  61. };
  62. #include <stdio.h>
  63. /* A list of parameters for different cc 
  64. struct cc_param_list {
  65. const char* name;
  66. const char* type;
  67. const char* description;
  68. struct cc_param_list* next;
  69. };
  70. struct cc_list {
  71. const char* proto;
  72. struct cc_param_list* head;
  73. struct cc_list* next;
  74. }
  75. */
  76. struct cc_list* find_cc_by_proto(const char* proto) {
  77. struct cc_list* p = cc_list_head;
  78. while (p!=NULL && (strcmp(p->proto, proto)!=0)) p=p->next;
  79. if (p==NULL) {
  80. p = (struct cc_list*) malloc(sizeof (struct cc_list));
  81. p->proto = proto;
  82. p->param_head = NULL;
  83. p->next = cc_list_head;
  84. cc_list_head = p;
  85. };
  86. return p;
  87. };
  88. struct cc_param_list* find_param_by_proto_name(const char* proto, const char* name) {
  89. struct cc_list* p = find_cc_by_proto(proto);
  90. if (!p) return NULL;
  91. struct cc_param_list* q = p->param_head;
  92. while (q!=NULL && (strcmp(q->name, name)!=0)) q=q->next;
  93. if (q==NULL) {
  94. q = (struct cc_param_list*) malloc(sizeof (struct cc_param_list));
  95. q->name = name;
  96. q->type = NULL;
  97. q->description = NULL;
  98. q->ptr = NULL;
  99. q->next = p->param_head;
  100. p->param_head = q;
  101. };
  102. return q;
  103. };
  104. void record_linux_param(const char* proto, const char* name, const char* type, void* ptr) {
  105. struct cc_param_list* p = find_param_by_proto_name(proto, name);
  106. if (p) {
  107. p->type = type;
  108. p->ptr = ptr;
  109. //printf("%s %s %s %pn", proto, name, type, ptr);
  110. } else {
  111. printf("failed to register a parameter: %s %s %s %pn", proto, name, type, ptr);
  112. };
  113. };
  114. void record_linux_param_description(const char* proto, const char* name, const char* exp) {
  115. struct cc_param_list* p = find_param_by_proto_name(proto, name);
  116. if (p) {
  117. p->description = exp;
  118. } else {
  119. printf("failed to register a description for a parameter: %s %s %sn", proto, name, exp);
  120. };
  121. };
  122. /* 64bit divisor, dividend and result. dynamic precision */
  123. uint64_t div64_64(uint64_t dividend, uint64_t divisor)
  124. {
  125. uint32_t high, d;
  126. high = divisor >> 32;
  127. if (high) {
  128. unsigned int shift = fls(high);
  129. d = divisor >> shift;
  130. dividend >>= shift;
  131. } else
  132. d = divisor;
  133. do_div(dividend, d);
  134. return dividend;
  135. }
  136. /* About ktime_t */
  137. ktime_t net_invalid_timestamp() {
  138. return 0;
  139. };
  140. int ktime_equal(const ktime_t cmp1, const ktime_t cmp2)
  141. {
  142. return cmp1 == cmp2;
  143. }
  144. s64 ktime_to_us(const ktime_t kt)
  145. {
  146. return kt/1000;
  147. }
  148. ktime_t net_timedelta(ktime_t t)
  149. {
  150. return ktime_get_real - t;
  151. }
  152. #endif