X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fprotocol.c;h=a3fa5f1a402d0e2800059f202ad21193dcec58b2;hp=3c20f3b2762a8f06efedeafbee2a85cdf519eb3d;hb=fdc6a2f106315cd9ed22943d8c0bd279631e66b4;hpb=42455e97a057fb4386f9d8fb2f8963b2ec6ddf24 diff --git a/src/protocol.c b/src/protocol.c index 3c20f3b2..a3fa5f1a 100644 --- a/src/protocol.c +++ b/src/protocol.c @@ -17,7 +17,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id: protocol.c,v 1.28.4.19 2000/06/30 21:03:51 guus Exp $ + $Id: protocol.c,v 1.28.4.20 2000/08/07 14:52:15 guus Exp $ */ #include "config.h" @@ -120,6 +120,32 @@ cp return 0; } +/* Evil hack - TCP tunneling is bad */ +int send_tcppacket(conn_list_t *cl, void *data, int len) +{ +cp + if(debug_lvl > 1) + syslog(LOG_DEBUG, _("Sending PACKET to %s (%s)"), + cl->vpn_hostname, cl->real_hostname); + + buflen = snprintf(buffer, MAXBUFSIZE, "%d %d\n", PACKET, len); + + if((write(cl->meta_socket, buffer, buflen)) < 0) + { + syslog(LOG_ERR, _("Send failed: %s:%d: %m"), __FILE__, __LINE__); + return -1; + } + + if((write(cl->meta_socket, data, len)) < 0) + { + syslog(LOG_ERR, _("Send failed: %s:%d: %m"), __FILE__, __LINE__); + return -1; + } + +cp + return 0; +} + int send_ping(conn_list_t *cl) { cp @@ -638,6 +664,50 @@ cp return 0; } +int tcppacket_h(conn_list_t *cl) +{ + char packet[1600]; + int len; +cp + if(!cl->status.active) + { + syslog(LOG_ERR, _("Got unauthorized PACKET from %s (%s)"), + cl->vpn_hostname, cl->real_hostname); + return -1; + } + + if(sscanf(cl->buffer, "%*d %d", &len) != 1) + { + syslog(LOG_ERR, _("Got bad PACKET from %s (%s)"), + cl->vpn_hostname, cl->real_hostname); + return -1; + } + + if(len>1600) + { + syslog(LOG_ERR, _("Got too big PACKET from %s (%s)"), + cl->vpn_hostname, cl->real_hostname); + return -1; + } + + if(debug_lvl > 1) + syslog(LOG_DEBUG, _("Got PACKET from %s (%s)"), + cl->vpn_hostname, cl->real_hostname); + + /* Evil kludge comming up */ + if(read(cl->meta_socket,packet,len)!=len) + { + syslog(LOG_ERR, _("Error while receiving PACKET data from %s (%s)"), + cl->vpn_hostname, cl->real_hostname); + return -1; + } + + xrecv(cl,packet); +cp + return 0; +} + + int ping_h(conn_list_t *cl) { cp @@ -963,13 +1033,19 @@ int (*request_handlers[256])(conn_list_t*) = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + tcppacket_h, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, req_key_h, ans_key_h, key_changed_h, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 };