00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include "config/compiler.h"
00038 #include "include/wmp_utils.h"
00039 #include "include/wmp_misc.h"
00040 #include "include/lqm.h"
00041 #include "interface/wmp_interface.h"
00042
00043
00044 #define NET_DEBUG
00045
00046 long long wmp_timespec_to_ns(struct timespec *ts){
00047 long long val = (long long) ts->tv_sec * 1000000000 + (long long) ts->tv_nsec;
00048 return val;
00049 }
00050
00051 long long wmp_elapsed_ms (struct timespec *begin, struct timespec *end){
00052 long long diff = DO_DIV64(wmp_timespec_to_ns(end), 1000000LL) - DO_DIV64(wmp_timespec_to_ns(begin), 1000000LL);
00053 return diff;
00054 }
00055
00056 void wmp_add_ms(struct timespec *ts, int ms){
00057 long long long_ms, sec, nsec;
00058 long_ms = ((long long)ms * 1000 * 1000) + ts->tv_nsec;
00059 sec = DO_DIV64(long_ms , (1000 * 1000 * 1000));
00060 nsec = long_ms - ((long long)sec*(1000 * 1000 * 1000));
00061 ts->tv_sec += sec;
00062 ts->tv_nsec = nsec;
00063 }
00064
00065
00066 unsigned int wmp_calculate_frame_duration_ms(int rate, int size) {
00067 int res = (242 + (10 * (28 + size * 8) / rate));
00068 res=res/1000;
00069 if (res == 0){
00070 res++;
00071 }
00072 return res;
00073 }
00074
00075 unsigned int wmp_calculate_frame_duration_us(int rate, int size) {
00076 int res = (242 + (10 * (28 + size * 8) / rate));
00077 return res;
00078 }
00079
00080 int wmpGetFrameHash(wmpFrame * p){
00081 return (p->hdr.serial * 10000 + p->hdr.from * 1000 + p->hdr.to
00082 * 100 + p->hdr.retries * 10 + p->hdr.type);
00083 }
00084
00085 int wmpGetFrameHashNoRetry(wmpFrame * p){
00086 return (p->hdr.serial * 10000 + p->hdr.from * 1000 + p->hdr.to * 10 + p->hdr.type);
00087 }
00088
00089 void lqmToString(char **lqm, char * s, int nnodes){
00090 int i,j;
00091 char txt[10], s1[10];
00092 int v=0;
00093
00094 sprintf(s,"%s"," ");
00095 for (i=0;i<nnodes;i++){
00096 sprintf(txt,"%d ",i);
00097 strcat(s,txt);
00098 }
00099
00100 strcat(s,"\n");
00101 for (i=0;i<nnodes;i++){
00102 sprintf(txt,"%d ",i);
00103 strcat(s,txt);
00104 for (j=0;j<nnodes;j++){
00105 v=lqm[i][j];
00106 if(i!=j) {
00107 if (v<10) sprintf(s1," %d",v);
00108 else if (v<100) sprintf(s1," %d",v);
00109 else sprintf(s1,"%d",v);
00110 } else{
00111 sprintf(s1," -");
00112 }
00113 strcat(s,s1);
00114 strcat(s," ");
00115 }
00116 strcat(s,"\n");
00117 }
00118 }
00119
00120 void wmp_print_lqm(char ** lqm, char * s, int nnodes){
00121 char txt[1000];
00122 lqmToString(lqm,txt, nnodes);
00123 WMP_MSG(stderr,"%s\n%s\n",s,txt);
00124 }
00125
00126 void wmp_print_lqmn(char * s, int d){
00127 char txt[1000];
00128 lqmToString(lqm_get_ptr(),txt,wmpGetNumOfNodes());
00129 WMP_MSG(stderr,"I'm Node %d, Node: %d: %s\n%s\n",wmpGetNodeId(),d ,s,txt);
00130 }
00131
00132
00133 unsigned long long s_time[10];
00134
00135 void wmp_time_store(int i){
00136 s_time[i] = getRawActualTimeus();
00137 }
00138
00139 long long wmp_time_diff_us(int i, int j){
00140 long long diff = (s_time[i] - s_time[j]);
00141 return diff;
00142 }
00143
00144 int wmp_time_diff_ms(int i, int j){
00145 long long diff = (s_time[i] - s_time[j]);
00146 return (int) diff;
00147 }
00148
00149 void wmp_time_print_diff_ms(int i, int j, char * txt){
00150 WMP_MSG(stderr,"%s: %d ms\n",txt,wmp_time_diff_ms(i,j));
00151 }
00152 void wmp_time_print_diff_us(int i, int j, char * txt){
00153 WMP_MSG(stderr,"%s: %lld us\n",txt,wmp_time_diff_us(i,j));
00154 }
00155
00156 void wmp_time_subtract(int i){
00157 long long ts = (getRawActualTimeus() - s_time[i]);
00158 s_time[i] = ts;
00159 }
00160
00161 void wmp_time_print_us(int i, char * txt){
00162 WMP_MSG(stderr,"%s: %llu us\n",txt,s_time[i]);
00163 }
00164
00165 void wmp_time_print_ms(int i, char * txt){
00166 unsigned long long ms = DO_DIV64(s_time[i] , 1000);
00167 WMP_MSG(stderr,"%s: %llu ms\n",txt,ms);
00168 }
00169
00170 void wmp_time_subtract_and_print_us(int i, char * txt){
00171 wmp_time_subtract(i);
00172 wmp_time_print_us(i,txt);
00173 }
00174
00175 void wmp_time_subtract_and_print_ms(int i, char * txt){
00176 wmp_time_subtract(i);
00177 wmp_time_print_ms(i,txt);
00178 }
00179
00180 int inline ms_to_us(int n){
00181 return n*1000;
00182 }
00183 int inline us_to_ms(int n){
00184 return n/1000;
00185 }
00186
00187
00188 #ifdef NET_DEBUG
00189
00190 static char buffer[1000];
00191 static int buffer_idx = 0;
00192 void wmp_print(const char *format, ...) {
00193 va_list args;
00194 va_start (args, format);
00195 vsprintf (buffer+buffer_idx,format, args);
00196 va_end (args);
00197 buffer_idx=strlen(buffer);
00198 }
00199
00200 void wmp_print_append(wmpFrame * p) {
00201 int len;
00202 char * net_data;
00203 len = wmp_get_frame_total_lenght(p);
00204 net_data = ((char*) p) + len;
00205 strcpy(buffer, net_data);
00206 buffer_idx = strlen(buffer);
00207 }
00208
00209 int wmp_print_get_size(void) {
00210 return strlen(buffer);
00211 }
00212 void wmp_print_reset(void) {
00213 buffer[0] = 0;
00214 buffer_idx = 0;
00215 }
00216
00217 void wmp_print_clean(wmpFrame * p) {
00218 int i, len = wmp_get_frame_total_lenght(p);
00219 char * net_data = ((char*) p) + len;
00220 for (i=0;i<50;i++){
00221 net_data[i] = 0;
00222 }
00223 }
00224
00225 int wmp_print_put(wmpFrame * p) {
00226 int len, tail;
00227 len = tail = wmp_get_frame_total_lenght(p);
00228 len = 1500 - len;
00229 len = strlen(buffer) > len ? len : strlen(buffer);
00230 len +=2;
00231 memcpy((((char *) p) + tail), buffer, len);
00232 wmp_print_reset();
00233 return len;
00234 }
00235
00236
00237 #else
00238 void wmp_print(const char *format, ...) {
00239 }
00240
00241 int wmp_print_get_size(void) {
00242 return 0;
00243 }
00244 void wmp_print_reset(void) {
00245 }
00246
00247 int wmp_print_put(wmpFrame * p) {
00248 return 0;
00249 }
00250 void wmp_print_clean(wmpFrame * p) {}
00251
00252 void wmp_print_append(wmpFrame * p) {}
00253
00254 #endif