FS2_Open
Open source remastering of the Freespace 2 engine
multilag.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) Volition, Inc. 1999. All rights reserved.
3  *
4  * All source code herein is the property of Volition, Inc. You may not sell
5  * or otherwise commercially exploit the source or things you created based on the
6  * source.
7  *
8 */
9 
10 
11 
12 #ifndef SCP_UNIX
13 
14 #include <winsock.h>
15 
16 #include "network/multilag.h"
17 #include "io/timer.h"
18 #include "globalincs/linklist.h"
19 #include "network/psnet2.h"
20 #include "debugconsole/console.h"
21 
22 
23 
24 // ----------------------------------------------------------------------------------------------------
25 // LAGLOSS DEFINES/VARS
26 //
27 
28 // default LAGLOSS values
29 #define MULTI_LAGLOSS_DEF_LAG (-1)
30 #define MULTI_LAGLOSS_DEF_LAGMIN (-1)
31 #define MULTI_LAGLOSS_DEF_LAGMAX (-1)
32 #define MULTI_LAGLOSS_DEF_LOSS (-1.0f)
33 #define MULTI_LAGLOSS_DEF_LOSSMIN (-1.0f)
34 #define MULTI_LAGLOSS_DEF_LOSSMAX (-1.0f)
35 #define MULTI_LAGLOSS_DEF_STREAK (2500)
36 
37 // if we're running
39 
40 // lag values (base - max and min)
41 int Multi_lag_base = -1;
42 int Multi_lag_min = -1;
43 int Multi_lag_max = -1;
44 
45 // packet loss values (base - max and min)
46 float Multi_loss_base = -1.0f;
47 float Multi_loss_min = -1.0f;
48 float Multi_loss_max = -1.0f;
49 
50 // streaks for lagging
51 int Multi_streak_stamp = -1; // timestamp telling when the streak of a certain lag is done
52 int Multi_streak_time = 0; // how long each streak will last
53 int Multi_current_streak = -1; // what lag the current streak has
54 
55 // struct for buffering stuff on receives
56 typedef struct lag_buf {
57  ubyte data[700]; // the data from the packet
58  int data_len; // length of the data
59  uint socket; // this can be either a PSNET_SOCKET or a PSNET_SOCKET_RELIABLE
60  int stamp; // when this expires, make this packet available
61  SOCKADDR_IN ip_addr; // ip address
62 
63  struct lag_buf * prev; // prev in the list
64  struct lag_buf * next; // next in the list
65 } lag_buf;
66 
67 // lag buffers - malloced
68 #ifdef NDEBUG
69  #define MAX_LAG_BUFFERS 1 // only 1 buffer in non-debug builds
70 #else
71  #define MAX_LAG_BUFFERS 1000
72 #endif
74 int Lag_buf_count = 0; // how many lag_buf's are currently in use
75 
78 
79 
80 // ----------------------------------------------------------------------------------------------------
81 // LAGLOSS FORWARD DECLARATIONS
82 //
83 
84 // get a value to lag a packet with (in ms)
86 
87 // boolean yes or no - should this packet be lost?
89 
90 // get a free packet buffer, return NULL on fail
92 
93 // put a lag buffer back
95 
96 // ----------------------------------------------------------------------------------------------------
97 // LAGLOSS FUNCTIONS
98 //
99 
101 {
102  // never do lag in a non-debug build
103 #if defined(NDEBUG) || !defined(MULTI_USE_LAG)
104  Multi_lag_inited = 0;
105 #else
106  int idx;
107 
108  // if we're already inited, don't do anything
109  if(Multi_lag_inited){
110  return;
111  }
112 
113  // try and allocate lag bufs
114  for(idx=0; idx<MAX_LAG_BUFFERS; idx++){
115  Lag_buffers[idx] = (lag_buf*)vm_malloc(sizeof(lag_buf));
116  if(Lag_buffers[idx] == NULL){
117  return;
118  }
119  }
120 
121  // initialize lag buffer lists
122  list_init( &Lag_free_list );
123  list_init( &Lag_used_list );
124 
125  // Link all object slots into the free list
126  for (idx=0; idx<MAX_LAG_BUFFERS; idx++) {
127  list_append(&Lag_free_list, Lag_buffers[idx]);
128  }
129 
130  // set the default lag values
134 
135  // set the default loss values
139 
140  // set the default lag streak time
142 
143  Multi_lag_inited = 1;
144 #endif
145 }
146 
148 {
149  int idx;
150 
151  // if we're not inited already, don't do anything
152  if(!Multi_lag_inited){
153  return;
154  }
155 
156  // free up lag buffers
157  for(idx=0; idx<MAX_LAG_BUFFERS; idx++){
158  if(Lag_buffers[idx] != NULL){
159  vm_free(Lag_buffers[idx]);
160  Lag_buffers[idx] = NULL;
161  }
162  }
163 
164  Multi_lag_inited = 0;
165 }
166 
167 // select for multi_lag
168 int multi_lag_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *except_fds, const timeval *timeout)
169 {
170  char t_buf[1024];
171  int t_from_len;
173  int ret_val;
174  lag_buf *moveup, *item;
175 
176  Assert(readfds != NULL);
177  Assert(writefds == NULL);
178  Assert(except_fds == NULL);
179 
180  // clear out addresses
181  memset(&ip_addr, 0, sizeof(SOCKADDR_IN));
182 
183  // if there's data on the socket, read it
184  if(select(nfds, readfds, writefds, except_fds, timeout)){
185  // read the data and stuff it
186  Assertion(Tcp_active, "multi_lag_select(): TCP/IP is not active!");
187  t_from_len = sizeof(SOCKADDR_IN);
188  ret_val = recvfrom(readfds->fd_array[0], t_buf, 1024, 0, (SOCKADDR*)&ip_addr, &t_from_len);
189 
190  // wacky socket error
191  if(ret_val == SOCKET_ERROR){
192  return SOCKET_ERROR;
193  }
194 
195  // if we should be dropping this packet
197  // get a free packet buf and stuff the data
198  item = multi_lag_get_free();
199  if(item){
200  Assert(ret_val < 700);
201  memcpy(item->data, t_buf, ret_val);
202  item->data_len = ret_val;
203  item->ip_addr = ip_addr;
204  item->socket = readfds->fd_array[0];
206  }
207  }
208  }
209 
210  // always unset the readfds
211  readfds->fd_count = 0;
212 
213  // now determine if we have any pending packets - find the first one
214  // NOTE : this _could_ be the packet we just read. In fact, with a 0 lag, this will always be the case
215  moveup=GET_FIRST(&Lag_used_list);
216  while ( moveup!=END_OF_LIST(&Lag_used_list) ) {
217  // if the timestamp has elapsed and we have a matching socket
218  if((readfds->fd_array[0] == (SOCKET)moveup->socket) && ((moveup->stamp <= 0) || timestamp_elapsed(moveup->stamp))){
219  // set this so we think select returned yes
220  readfds->fd_count = 1;
221  return 1;
222  }
223 
224  moveup = GET_NEXT(moveup);
225  }
226 
227  // no data
228  return 0;
229 }
230 
231 // recvfrom for multilag
232 int multi_lag_recvfrom(uint s, char *buf, int len, int flags, struct sockaddr *from, int *fromlen)
233 {
234  lag_buf *moveup = NULL;
235  lag_buf *item = NULL;
236 
237  // now determine if we have any pending packets - find the first one
238  moveup=GET_FIRST(&Lag_used_list);
239  while ( moveup!=END_OF_LIST(&Lag_used_list) ) {
240  // if the timestamp has elapsed
241  if((s == (SOCKET)moveup->socket) && ((moveup->stamp <= 0) || timestamp_elapsed(moveup->stamp))){
242  item = moveup;
243  break;
244  }
245 
246  moveup = GET_NEXT(moveup);
247  }
248 
249  // if this happens, it means that the multi_lag_select() returned an improper value
250  Assert(item);
251  // stuff the data
252  Assert(item->data_len <= len);
253  memcpy(buf, item->data, item->data_len);
254  Assertion(Tcp_active, "multi_lag_recvfrom(): TCP/IP is not active!");
255  memcpy(from, &item->ip_addr, sizeof(SOCKADDR_IN));
256 
257  // stick the item back on the free list
258  multi_lag_put_free(item);
259 
260  // return the size in bytes
261  return item->data_len;
262 }
263 
264 // ----------------------------------------------------------------------------------------------------
265 // LAGLOSS FORWARD DEFINITIONS
266 //
267 
269 {
270  // first determine the percentage we'll be checking against
271  int ret;
272  int mod;
273 
274  // if the lag system isn't inited, don't do anything (no lag)
275  if(!Multi_lag_inited){
276  return 0;
277  }
278 
279  // pick a value
280  // see if we should be going up or down (loss max/loss min)
281  float rand_val = rand() * RAND_MAX_1f;
282  mod = 0;
283  if (rand_val < 0.5f) {
284  // down
285  if (Multi_lag_min >= 0) {
286  mod = -fl2i((Multi_lag_base - Multi_lag_min) * rand_val);
287  }
288  } else {
289  // up
290  if (Multi_lag_max >= 0) {
291  mod = fl2i((Multi_lag_max - Multi_lag_base) * rand_val);
292  }
293  }
294 
295  // if the current streak has elapsed, calculate a new one
297  // timestamp the new streak
299 
300  // set the return value
301  ret = Multi_lag_base + mod;
302 
303  // set the lag value of this current streak
304  Multi_current_streak = ret;
305  }
306  // otherwise use the lag for the current streak
307  else {
308  ret = Multi_current_streak;
309  }
310 
311  return ret;
312 }
313 
314 // this _may_ be a bit heavyweight, but it _is_ debug code
316 {
317  // first determine the percentage we'll be checking against
318  float mod;
319 
320  // if the lag system isn't inited, don't do anything
321  if(!Multi_lag_inited){
322  return 0;
323  }
324 
325  // see if we should be going up or down (loss max/loss min)
326  float rand_val = rand() * RAND_MAX_1f;
327  mod = 0.0f;
328  if (rand_val < 0.5) {
329  // down
330  if (Multi_loss_min >= 0.0f) {
331  mod = -((Multi_loss_base - Multi_loss_min) * rand_val);
332  }
333  } else {
334  // up
335  if (Multi_loss_max >= 0.0f) {
336  mod = ((Multi_loss_max - Multi_loss_base) * rand_val);
337  }
338  }
339 
340  if ( rand_val <= (Multi_loss_base + mod) ) {
341  return 1;
342  }
343 
344  return 0;
345 }
346 
347 // get a free packet buffer, return NULL on fail
349 {
350  lag_buf *lagp;
351 
352  // if we're out of buffers
354  nprintf(("Network", "Out of lag buffers!\n"));
355  return NULL;
356  }
357 
358  // get a free item
359  lagp = GET_FIRST(&Lag_free_list);
360  Assert( lagp != &Lag_free_list ); // shouldn't have the dummy element
361 
362  // remove trailp from the free list
363  list_remove( &Lag_free_list, lagp );
364 
365  // insert trailp onto the end of used list
366  list_append( &Lag_used_list, lagp );
367 
368  // increase the count
369  Lag_buf_count++;
370  return lagp;
371 }
372 
373 // put a lag buffer back
375 {
376  // remove objp from the used list
377  list_remove( &Lag_used_list, buf);
378 
379  // add objp to the end of the free
380  list_append( &Lag_free_list, buf );
381 
382  // decrement counter
383  Lag_buf_count--;
384 }
385 
386 // Help and status provider for the lag-loss system
388 {
389  // if the lag system isn't inited, don't do anything
390  if(!Multi_lag_inited){
391  dc_printf("Lag System Not Initialized!\n");
392  return;
393  }
394 
395  // display status of lag system
396  if (dc_optional_string_either("status", "--status") || dc_optional_string_either("?", "--?")) {
397  dc_printf("Lag system status:\n");
398  // display lag settings
399  dc_printf("Lag : \n");
400  dc_printf("Base \t\tMin \t\tMax \t\tStreak\n");
401  dc_printf("%f\t\t%f\t\t%f\t\t%f\n\n", Multi_lag_base, Multi_lag_min, Multi_lag_max, Multi_streak_time);
402 
403  // display loss settings
404  dc_printf("Loss : \n");
405  dc_printf("Base \t\tMin \t\tMax\n");
407  return;
408  }
409 
410  // display all available commands
411  dc_printf("Lag system commands\n\n");
412 
413  dc_printf("Usage :\n");
414  dc_printf("lag <ms>\n");
415  dc_printf("\tSets the lag base value if <ms> is within the max and min limits (see lag_min and lag_max)\n");
416  dc_printf("\tIf <ms> is outside of the max and min limits, then nothing is done\n");
417  dc_printf("\tIf <ms> is negative, then lag simulation is turned off\n\n");
418 
419  dc_printf("lag_min <ms>\n");
420  dc_printf("\tSets the lag min value if <ms> is less than the base value\n");
421  dc_printf("\tIf <ms> is outside the base or max values, then nothing is done\n");
422  dc_printf("\tIf <ms> is negative, then the min limit is removed\n\n");
423 
424  dc_printf("lag_max <ms>\n");
425  dc_printf("\tSets the lag max value if <ms> is greater than the base value\n");
426  dc_printf("\tIf <ms> is outside the base or min values, then nothing is done\n");
427  dc_printf("\tIf <ms> is negative, then the max limit is removed\n\n");
428 
429  dc_printf("loss <0-100> (-1 to disable)\n");
430  dc_printf("\tSimilar to lag, but applies value to loss base value\n\n");
431 
432  dc_printf("loss_min <0-100>\n");
433  dc_printf("\tSimilar to lag_min, but applies value to loss min value\n\n");
434 
435  dc_printf("loss_max <0-100>\n");
436  dc_printf("\tSimilar to lag_max, but applies value to loss max value\n\n");
437 
438 
439  dc_printf("lag_streak <ms>\n");
440  dc_printf("\tSets the duration of lag streaks where the lag is consistant for <ms>\n");
441  dc_printf("\tEx: A value of 2000 would result in lag streaks that last 2 seconds each\n\n");
442 
443  dc_printf("lagloss\n");
444  dc_printf("\tDisplays this text. Passing --status will display the status of the entire lag system");
445 }
446 
447 DCF(lag, "Sets the lag base value (Muliplayer)")
448 {
449  int value;
450 
451  // if the lag system isn't inited, don't do anything
453  dc_printf("Lag System Not Initialized!\n");
454  return;
455  }
456 
457  if (dc_optional_string_either("help", "--help")) {
459  return;
460  }
461 
462  if (dc_optional_string_either("status", "--status") || dc_optional_string_either("?", "--?")) {
463  dc_printf("Lag base value is currently %i\n", Multi_lag_base);
464  return;
465  }
466 
467  dc_stuff_int(&value);
468  // parse the argument and change things around accordingly
469  if (value < 0) {
470  // switch the lag sim off
471  Multi_lag_base = -1;
472  Multi_lag_min = -1;
473  Multi_lag_max = -1;
474  dc_printf("Turning simulated lag off\n");
476 
477  } else if ((Multi_lag_max >= 0) && (value > Multi_lag_max)) {
478  dc_printf("Base value greater than max value, ignoring...");
479 
480  } else if ((Multi_lag_min >= 0) && (value < Multi_lag_min)) {
481  dc_printf("Base value smaller than min value, ignoring...");
482 
483  } else {
484 
487  dc_printf("Base value set to %i", value);
488  }
489 }
490 
491 DCF(lag_min, "Sets the lag min value (Multiplayer)")
492 {
493  int value;
494 
495  // if the lag system isn't inited, don't do anything
496  if(!Multi_lag_inited){
497  dc_printf("Lag System Not Initialized!\n");
498  return;
499  }
500 
501  if (dc_optional_string_either("help", "--help")) {
503  }
504 
505  if (dc_optional_string_either("status", "--status") || dc_optional_string_either("?", "--?")) {
506  dc_printf("Lag min value is currently %i\n", Multi_lag_min);
507  }
508 
509  dc_stuff_int(&value);
510  // parse the argument and change things around accordingly
511 
512  if (value > Multi_lag_base) {
513  dc_printf("Min value greater than base value, ignoring...");
514  return;
515 
516  } else if (value < 0) {
517  Multi_lag_min = -1;
518 
519  } else {
521  }
522  dc_printf("Lag min value set to %i\n", Multi_lag_min);
523 }
524 
525 DCF(lag_max, "Sets the lag max value (Multiplayer)")
526 {
527  int value;
528 
529  // if the lag system isn't inited, don't do anything
530  if (!Multi_lag_inited) {
531  dc_printf("Lag System Not Initialized!\n");
532  return;
533  }
534 
535  if (dc_optional_string_either("help", "--help")) {
537  return;
538  }
539 
540  if (dc_optional_string_either("status", "--status") || dc_optional_string_either("?", "--?")) {
541  dc_printf("Lag max value is currently %i\n", Multi_lag_max);
542  return;
543  }
544 
545  // parse the argument and change things around accordingly
546  dc_stuff_int(&value);
547 
548  if ((value >= 0) && (value < Multi_lag_base)) {
549  dc_printf("Max value smaller than base value, ignoring...");
550 
551  } else if (value < 0) {
552  Multi_lag_max = -1;
553 
554  } else {
556  }
557  dc_printf("Lag max value set to %i\n", Multi_lag_max);
558 }
559 
560 DCF(loss, "Sets the loss base value (Multiplayer)")
561 {
562  int val_i;
563  float val_f;
564 
565  // if the lag system isn't inited, don't do anything
566  if(!Multi_lag_inited){
567  dc_printf("Lag System Not Initialized!\n");
568  return;
569  }
570 
571  if (dc_optional_string_either("help", "--help")) {
573  return;
574  }
575 
576  if (dc_optional_string_either("status", "--status") || dc_optional_string_either("?", "--?")) {
577  dc_printf("Loss value is currently %i percent", Multi_loss_base);
578  return;
579  }
580 
581  // parse the argument and change things around accordingly
582  dc_stuff_int(&val_i);
583 
584  val_f = (float)val_i / 100.0f;
585 
586  if(val_i > 100){
587  dc_printf("Illegal loss base value, ignoring...");
588  } else if (val_i < 0){
589  // switch the loss sim off
590  dc_printf("Turning simulated loss off\n");
591  Multi_loss_base = -1.0f;
592  Multi_loss_min = -1.0f;
593  Multi_loss_max = -1.0f;
594 
595  } else if((Multi_loss_max >= 0.0f) && (val_f > Multi_loss_max)){
596  dc_printf("Base value greater than max value, ignoring...");
597 
598  } else if((Multi_loss_min >= 0.0f) && (val_f < Multi_loss_min)){
599  dc_printf("Base value smaller than min value, ignoring...");
600 
601  } else {
603  }
604 }
605 
606 DCF(loss_min, "Sets the loss min value (Multiplayer)")
607 {
608  int val_i;
609  float val_f;
610 
611  // if the lag system isn't inited, don't do anything
612  if(!Multi_lag_inited){
613  dc_printf("Lag System Not Initialized!\n");
614  return;
615  }
616 
617  if (dc_optional_string_either("help", "--help")) {
619  return;
620  }
621 
622  if (dc_optional_string_either("status", "--status") || dc_optional_string_either("?", "--?")) {
623  dc_printf("loss_min value is currently %f percent", Multi_loss_min);
624  }
625 
626  // parse the argument and change things around accordingly
627  dc_stuff_int(&val_i);
628 
629  val_f = (float)val_i / 100.0f;
630 
631  if(val_f > Multi_loss_base){
632  dc_printf("Min value greater than base value, ignoring...");
633  } else {
634  // otherwise set the value
635  if (val_f < 0) {
636  Multi_loss_min = -1.0f;
637  } else {
639  }
640  }
641 }
642 
643 DCF(loss_max, "Sets the loss max value (Multiplayer)")
644 {
645  int val_i;
646  float val_f;
647  // if the lag system isn't inited, don't do anything
648  if(!Multi_lag_inited){
649  dc_printf("Lag System Not Initialized!\n");
650  return;
651  }
652 
653  if (dc_optional_string_either("help", "--help")) {
655  return;
656  }
657 
658  if (dc_optional_string_either("status", "--status") || dc_optional_string_either("?", "--?")) {
659  dc_printf("loss_max value is currently %f percent", Multi_loss_max);
660  }
661 
662  // parse the argument and change things around accordingly
663  dc_stuff_int(&val_i);
664  val_f = (float)val_i / 100.0f;
665 
666  if (val_f < Multi_loss_base) {
667  dc_printf("Max value smaller than base value, ignoring...");
668  } else {
669  // otherwise set the value
670  if (val_f < 0) {
671  Multi_loss_max = -1.0f;
672  } else {
674  }
675  }
676 }
677 
678 DCF(lagloss, "Help provider for the lag system (Multiplayer)")
679 {
680  // if the lag system isn't inited, don't do anything
681  if(!Multi_lag_inited){
682  dc_printf("Lag System Not Initialized!\n");
683  return;
684  }
685 
687 }
688 
689 DCF(lag_streak, "Sets the duration of lag streaks (Multiplayer)")
690 {
691  int val;
692 
693  // if the lag system isn't inited, don't do anything
694  if (!Multi_lag_inited) {
695  dc_printf("Lag System Not Initialized!\n");
696  return;
697  }
698 
699  if (dc_optional_string_either("help", "--help")) {
701  return;
702  }
703 
704  if (dc_optional_string_either("status", "--status") || dc_optional_string_either("?", "--?")) {
705  dc_printf("lag_streak value is currently %i", Multi_streak_time);
706  return;
707  }
708 
709  dc_stuff_int(&val);
710  if(val >= 0){
712  } else {
713  dc_printf("Ignoring invalid value (must be non-negative)\n");
714  }
715 }
716 
717 DCF(lag_bad, "Lag system shortcut - Sets for 'bad' lag simulation (Multiplayer)")
718 {
719  // if the lag system isn't inited, don't do anything
720  if(!Multi_lag_inited){
721  dc_printf("Lag System Not Initialized!\n");
722  return;
723  }
724 
725  if (dc_optional_string_either("help", "--help")) {
727  return;
728  }
729 
730  dc_printf("Setting bad lag/loss parameters\n");
731 
732  // set good lagloss parameters
733  Multi_lag_base = 500;
734  Multi_lag_min = 400;
735  Multi_lag_max = 600;
736 
737  Multi_loss_base = 0.2f;
738  Multi_loss_min = 0.15f;
739  Multi_loss_max = 0.23f;
740 
741  Multi_streak_time = 800;
742  Multi_streak_stamp = -1;
744 }
745 
746 DCF(lag_avg, "Lag system shortcut - Sets for 'average' lag simulation (Multiplayer)")
747 {
748  // if the lag system isn't inited, don't do anything
749  if(!Multi_lag_inited){
750  dc_printf("Lag System Not Initialized!\n");
751  return;
752  }
753 
754  if (dc_optional_string_either("help", "--help")) {
756  return;
757  }
758 
759  dc_printf("Setting avg lag/loss parameters\n");
760 
761  // set good lagloss parameters
762  Multi_lag_base = 275;
763  Multi_lag_min = 200;
764  Multi_lag_max = 400;
765 
766  Multi_loss_base = 0.15f;
767  Multi_loss_min = 0.1f;
768  Multi_loss_max = 0.20f;
769 
770  Multi_streak_time = 900;
771  Multi_streak_stamp = -1;
773 }
774 
775 DCF(lag_good, "Lag system shortcut - Sets for 'good' lag simulation (Multiplayer)")
776 {
777  // if the lag system isn't inited, don't do anything
778  if(!Multi_lag_inited){
779  dc_printf("Lag System Not Initialized!\n");
780  return;
781  }
782 
783  if (dc_optional_string_either("help", "--help")) {
785  return;
786  }
787 
788  dc_printf("Setting good lag/loss parameters\n");
789 
790  // set good lagloss parameters
791  Multi_lag_base = 100;
792  Multi_lag_min = 35;
793  Multi_lag_max = 200;
794 
795  Multi_loss_base = 0.08f;
796  Multi_loss_min = 0.0f;
797  Multi_loss_max = 0.1f;
798 
799  Multi_streak_time = 1000;
800  Multi_streak_stamp = -1;
802 }
803 
804 #endif // !SCP_UNIX
int timestamp(int delta_ms)
Definition: timer.cpp:226
#define vm_free(ptr)
Definition: pstypes.h:548
int multi_lag_should_be_lost()
Definition: multilag.cpp:315
int multi_lag_recvfrom(uint s, char *buf, int len, int flags, struct sockaddr *from, int *fromlen)
Definition: multilag.cpp:232
lag_buf * multi_lag_get_free()
Definition: multilag.cpp:348
int Multi_streak_stamp
Definition: multilag.cpp:51
lag_buf Lag_used_list
Definition: multilag.cpp:77
SOCKADDR_IN ip_addr
Definition: multilag.cpp:61
Assert(pm!=NULL)
#define SOCKADDR_IN
Definition: config.h:124
dc_stuff_int & value
Definition: multilag.cpp:467
#define SOCKADDR
Definition: config.h:123
GLclampf f
Definition: Glext.h:7097
#define SOCKET_ERROR
Definition: config.h:138
int Tcp_active
Definition: psnet2.cpp:60
int Multi_lag_base
Definition: multilag.cpp:41
#define Assertion(expr, msg,...)
Definition: clang.h:41
#define MULTI_LAGLOSS_DEF_LOSSMAX
Definition: multilag.cpp:34
dc_stuff_int & val_i
Definition: multilag.cpp:582
int Lag_buf_count
Definition: multilag.cpp:74
ubyte data[700]
Definition: multilag.cpp:57
int Multi_lag_max
Definition: multilag.cpp:43
lag_buf Lag_free_list
Definition: multilag.cpp:76
void multi_lag_close()
Definition: multilag.cpp:147
uint socket
Definition: multilag.cpp:59
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: Glext.h:7308
#define DCF(function_name, help_text)
The potent DCF macro, used to define new debug commands for the console.
Definition: console.h:60
lag_buf * Lag_buffers[MAX_LAG_BUFFERS]
Definition: multilag.cpp:73
#define MULTI_LAGLOSS_DEF_LAGMAX
Definition: multilag.cpp:31
int stamp
Definition: multilag.cpp:60
unsigned int uint
Definition: pstypes.h:64
int Multi_current_streak
Definition: multilag.cpp:53
#define nprintf(args)
Definition: pstypes.h:239
struct lag_buf * next
Definition: multilag.cpp:64
#define MULTI_LAGLOSS_DEF_LAG
Definition: multilag.cpp:29
dc_printf("Base value set to %i", value)
int Multi_lag_min
Definition: multilag.cpp:42
void multi_lagloss_dcf()
Definition: multilag.cpp:387
int Multi_lag_inited
Definition: multilag.cpp:38
int multi_lag_get_random_lag()
Definition: multilag.cpp:268
const float RAND_MAX_1f
Definition: pstypes.h:309
float Multi_loss_base
Definition: multilag.cpp:46
GLdouble s
Definition: Glext.h:5321
struct lag_buf * prev
Definition: multilag.cpp:63
bool dc_optional_string_either(const char *str1, const char *str2)
Searches for an optional string and it's alias.
#define SOCKET
Definition: config.h:122
int idx
Definition: multiui.cpp:761
#define MULTI_LAGLOSS_DEF_STREAK
Definition: multilag.cpp:35
#define MAX_LAG_BUFFERS
Definition: multilag.cpp:71
unsigned char ubyte
Definition: pstypes.h:62
float Multi_loss_max
Definition: multilag.cpp:48
void multi_lag_init()
Definition: multilag.cpp:100
GLbitfield GLuint64 timeout
Definition: Glext.h:6725
GLbitfield flags
Definition: Glext.h:6722
#define vm_malloc(size)
Definition: pstypes.h:547
void dc_stuff_int(int *i)
Stuffs an int to the given variable. Supports binary (0b), hexadecimal (0x), and octal (0o) formats...
GLuint GLfloat * val
Definition: Glext.h:6741
typedef float(SCP_EXT_CALLCONV *SCPTRACKIR_PFFLOATVOID)()
#define fl2i(fl)
Definition: floating.h:33
void multi_lag_put_free(lag_buf *buf)
Definition: multilag.cpp:374
An overhauled/updated debug console to allow monitoring, testing, and general debugging of new featur...
GLenum GLsizei GLenum GLenum const GLvoid * data
Definition: Gl.h:1509
#define timestamp_elapsed(stamp)
Definition: timer.h:102
int multi_lag_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *except_fds, const timeval *timeout)
Definition: multilag.cpp:168
int Multi_streak_time
Definition: multilag.cpp:52
float Multi_loss_min
Definition: multilag.cpp:47
GLenum GLsizei len
Definition: Glext.h:6283
#define MULTI_LAGLOSS_DEF_LAGMIN
Definition: multilag.cpp:30
float val_f
Definition: multilag.cpp:561
int data_len
Definition: multilag.cpp:58
struct lag_buf lag_buf
#define MULTI_LAGLOSS_DEF_LOSSMIN
Definition: multilag.cpp:33
#define MULTI_LAGLOSS_DEF_LOSS
Definition: multilag.cpp:32