#define TIME_MICROS(TM) (((int64_t) (TM)->tv_sec * 1000000) + (TM)->tv_usec )
#define DIFF_MICROS(TM1,TM2) ( TIME_MICROS(TM1) - TIME_MICROS(TM2) )
-// RECENT(T,M) is the time logic for requiring a gap time (in
+// RECENT_MICROS(T,M) is the time logic for requiring a gap time (in
// milliseconds) before shifting a MAC to a new remote. The limit is
-// 6000 for broadcast and 20000 for unicast.
-#define RECENT(T,M) ((M) < ((T)? 6000 : 20000 ))
+// 6s for broadcast and 20s for unicast.
+#define RECENT_MICROS(T,M) ((M) < ((T)? 6000000 : 20000000 ))
// VERYOLD_MICROSS is used for discarding downlink remotes whose latest
// activity is older than this.
// Flag to signal the UDP socket as being ipv6 or not (forced ipv4)
static int udp6 = 1;
+// Flag to indicate tpg transport patch = avoid UDP payload of 1470
+// bytes by adding 2 tag-along bytes
+static int tpg_quirk = 0;
+
// Flag whether to make some stderr outputs or not.
// 1 = normal verbosity, 2 = more output, 3 = source debug level stuff
static int verbose;
// Formats: <ipv4-address>[/<bits>][:<port>][=keyfile]
// Formats: <ipv6-address>[/<bits>][=keyfile]
// Formats: \[<ipv6-address>[/<bits>]\][:<port>][=keyfile]
+// Formats: hostname:port[=keyfile]
static int parse_allowed(char *arg,struct Allowed *into) {
static char buffer[10000];
int n = strlen( arg );
if ( n < 12 ) {
VERBOSE2OUT( "SEND %d bytes to %s\n", n, inet_stoa( &r->uaddr ) );
} else {
- VERBOSE2OUT( "SEND %s -> %s to %s\n",
+ VERBOSE2OUT( "SEND %d bytes %s -> %s to %s\n", n,
inet_mtoa( buf+6 ), inet_mtoa( buf ),
inet_stoa( &r->uaddr ) );
}
memcpy( output, buf, n ); // Use the private buffer for delivery
+ // Apply the TPG quirk
+ if ( tpg_quirk && ( n > 1460 ) && ( n < 1478 ) ) {
+ VERBOSE2OUT( "tpg quirk applied\n" );
+ n = 1478; // Add some "random" tag-along bytes
+ }
if ( r->spec == 0 ) {
if ( r->uaddr.in.sa_family == 0 ) {
// Output to tap/stdio
// The packet source MAC has arrived on other than its
// previous channel. It thus gets dropped if tap/stdin is the
// primary channel, or the time since the last packet for that
- // interface is less than RECENT, with different limits for
- // broadcast and unicast.
+ // interface is less than RECENT_MICROS, with different limits
+ // for broadcast and unicast.
int64_t dmac = DIFF_MICROS( &now, &x->rec_when);
- if ( x->remote->spec == 0 || RECENT( *buf & 1, dmac ) ) {
+ if ( x->remote->spec == 0 || RECENT_MICROS( *buf & 1, dmac ) ) {
if ( verbose >= 2 ) {
fprintf(
stderr,
// Tell how to use this program and exit with failure.
static void usage(void) {
fprintf( stderr, "Packet tunneling over UDP, multiple channels, " );
- fprintf( stderr, "version 0.2.5\n" );
+ fprintf( stderr, "version 1.5.3\n" );
fprintf( stderr, "Usage: " );
fprintf( stderr,
- "%s [-v] [-4] [-B n] [-T n] [-m mcast] [-t tap] port [remote]+ \n",
+ "%s [-v] [-tpg] [-4] [-B n] [-T n] [-m mcast] [-t tap] port [remote]+ \n",
progname );
exit( 1 );
}
i++;
ENSUREARGS( 1 );
}
+ if ( strncmp( "-tpg", argv[i], 4 ) == 0 ) {
+ tpg_quirk = 1;
+ i++;
+ ENSUREARGS( 1 );
+ }
// then: optional -4
if ( strncmp( "-4", argv[i], 2 ) == 0 ) {
udp6 = 0;
}
// then: required port
if ( sscanf( argv[i++], "%d", &port ) != 1 ) {
- fprintf( stderr, "Bad local port" );
+ fprintf( stderr, "Bad local port: %s\n", argv[i-1] );
usage();
}
// then: any number of allowed remotes