Enhance output of udp_proxy
diff --git a/programs/test/udp_proxy.c b/programs/test/udp_proxy.c
index 586a1b2..cddc142 100644
--- a/programs/test/udp_proxy.c
+++ b/programs/test/udp_proxy.c
@@ -69,17 +69,6 @@
#define DFL_LISTEN_ADDR "localhost"
#define DFL_LISTEN_PORT 5556
-/*
- * global options
- */
-struct options
-{
- const char *server_addr; /* address to forward packets to */
- int server_port; /* port to forward packets to */
- const char *listen_addr; /* address for accepting client connections */
- int listen_port; /* port for accepting client connections */
-} opt;
-
#define USAGE \
"\n usage: udp_proxy param=<>...\n" \
"\n acceptable parameters:\n" \
@@ -89,8 +78,24 @@
" listen_port=%%d default: 4433\n" \
"\n"
-static void exit_usage( void )
+/*
+ * global options
+ */
+static struct options
{
+ const char *server_addr; /* address to forward packets to */
+ int server_port; /* port to forward packets to */
+ const char *listen_addr; /* address for accepting client connections */
+ int listen_port; /* port for accepting client connections */
+} opt;
+
+static void exit_usage( const char *name, const char *value )
+{
+ if( value == NULL )
+ printf( " unknown option: %s\n", name );
+ else
+ printf( " option %s: illegal value: %s\n", name, value );
+
printf( USAGE );
exit( 1 );
}
@@ -109,7 +114,7 @@
{
p = argv[i];
if( ( q = strchr( p, '=' ) ) == NULL )
- exit_usage();
+ exit_usage( p, NULL );
*q++ = '\0';
if( strcmp( p, "server_addr" ) == 0 )
@@ -118,7 +123,7 @@
{
opt.server_port = atoi( q );
if( opt.server_port < 1 || opt.server_port > 65535 )
- exit_usage();
+ exit_usage( p, q );
}
else if( strcmp( p, "listen_addr" ) == 0 )
opt.listen_addr = q;
@@ -126,10 +131,41 @@
{
opt.listen_port = atoi( q );
if( opt.listen_port < 1 || opt.listen_port > 65535 )
- exit_usage();
+ exit_usage( p, q );
}
else
- exit_usage();
+ exit_usage( p, NULL );
+ }
+}
+
+static const char *msg_type( unsigned char *msg, size_t len )
+{
+ if( len < 1 ) return( "Invalid" );
+ switch( msg[0] )
+ {
+ case SSL_MSG_CHANGE_CIPHER_SPEC: return( "ChangeCipherSpec" );
+ case SSL_MSG_ALERT: return( "Alert" );
+ case SSL_MSG_APPLICATION_DATA: return( "ApplicationData" );
+ case SSL_MSG_HANDSHAKE: break; /* See below */
+ default: return( "Unknown" );
+ }
+
+ if( len < 13 ) return( "Invalid handshake" );
+ switch( msg[13] )
+ {
+ case SSL_HS_HELLO_REQUEST: return( "HelloRequest" );
+ case SSL_HS_CLIENT_HELLO: return( "ClientHello" );
+ case SSL_HS_SERVER_HELLO: return( "ServerHello" );
+ case SSL_HS_HELLO_VERIFY_REQUEST: return( "HelloVerifyRequest" );
+ case SSL_HS_NEW_SESSION_TICKET: return( "NewSessionTicket" );
+ case SSL_HS_CERTIFICATE: return( "Certificate" );
+ case SSL_HS_SERVER_KEY_EXCHANGE: return( "ServerKeyExchange" );
+ case SSL_HS_CERTIFICATE_REQUEST: return( "CertificateRequest" );
+ case SSL_HS_SERVER_HELLO_DONE: return( "ServerHelloDone" );
+ case SSL_HS_CERTIFICATE_VERIFY: return( "CertificateVerify" );
+ case SSL_HS_CLIENT_KEY_EXCHANGE: return( "ClientKeyExchange" );
+ case SSL_HS_FINISHED: return( "Finished" );
+ default: return( "Unkown handshake" );
}
}
@@ -145,10 +181,12 @@
return( ret );
}
- printf( " .. %s: %d bytes forwarded\n", way, ret );
+ len = ret;
+ type = msg_type( buf, len );
+ printf( " > %s: %s (%u bytes)\n", way, type, len );
- len = (size_t) ret;
+ printf( " < %s: %s (%u bytes): forwarded\n", way, type, len );
if( ( ret = net_send( &dst, buf, len ) ) <= 0 )
{
printf( " ! net_send returned %d\n", ret );
@@ -173,7 +211,7 @@
get_options( argc, argv );
/*
- * 0. Connect to the server
+ * 0. "Connect" to the server
*/
printf( " . Connect to server on UDP/%s/%d ...",
opt.server_addr, opt.server_port );