X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fprotocol.c;h=2416599d4a0efe09cfbbae7fa761df67f77dd300;hb=ff87f385c3a81499eff6b848aed8548cf6e5132e;hp=a3fa5f1a402d0e2800059f202ad21193dcec58b2;hpb=fdc6a2f106315cd9ed22943d8c0bd279631e66b4;p=meshlink diff --git a/src/protocol.c b/src/protocol.c index a3fa5f1a..2416599d 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.20 2000/08/07 14:52:15 guus Exp $ + $Id: protocol.c,v 1.28.4.23 2000/08/08 13:47:57 guus Exp $ */ #include "config.h" @@ -34,6 +34,8 @@ #include #include +#include + #include "conf.h" #include "encr.h" #include "net.h" @@ -124,21 +126,21 @@ cp int send_tcppacket(conn_list_t *cl, void *data, int len) { cp - if(debug_lvl > 1) + if(debug_lvl > 3) 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) + if((write(cl->meta_socket, buffer, buflen)) != buflen) { syslog(LOG_ERR, _("Send failed: %s:%d: %m"), __FILE__, __LINE__); return -1; } - if((write(cl->meta_socket, data, len)) < 0) + if((write(cl->meta_socket, data, len)) != len) { - syslog(LOG_ERR, _("Send failed: %s:%d: %m"), __FILE__, __LINE__); + syslog(LOG_ERR, _("Sending PACKET data failed: %s:%d: %m"), __FILE__, __LINE__); return -1; } @@ -445,7 +447,7 @@ cp is not desirable. */ - if(old=lookup_conn(cl->vpn_ip)) + if((old=lookup_conn(cl->vpn_ip))) { if(debug_lvl>0) syslog(LOG_NOTICE, _("Uplink %s (%s) is already in our connection list"), @@ -531,7 +533,7 @@ cp old connection that has timed out but we don't know it yet. */ - while(old = lookup_conn(cl->vpn_ip)) + while((old = lookup_conn(cl->vpn_ip))) { if(debug_lvl > 1) syslog(LOG_NOTICE, _("Removing old entry for %s at %s in favour of new connection from %s"), @@ -666,8 +668,9 @@ cp int tcppacket_h(conn_list_t *cl) { - char packet[1600]; - int len; + real_packet_t rp; + int len, count = 0, result; + conn_list_t *f; cp if(!cl->status.active) { @@ -683,26 +686,62 @@ cp return -1; } - if(len>1600) + if(len > MTU) { 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)"), + if(debug_lvl > 3) + syslog(LOG_DEBUG, _("Got PACKET length %d from %s (%s)"), len, cl->vpn_hostname, cl->real_hostname); /* Evil kludge comming up */ - if(read(cl->meta_socket,packet,len)!=len) + while(len) { - syslog(LOG_ERR, _("Error while receiving PACKET data from %s (%s)"), + if(debug_lvl > 3) + syslog(LOG_DEBUG, _("Direct read count=%d len=%d rp=%p socket=%d"), count, len, ((char *)&rp)+count, cl->meta_socket); + + result=read(cl->meta_socket,((char *)&rp)+count,len); + if(result<0) + { + syslog(LOG_ERR, _("Error while receiving PACKET data from %s (%s): %m"), cl->vpn_hostname, cl->real_hostname); - return -1; - } + return -1; + } + count+=result; + len-=result; + } - xrecv(cl,packet); + total_socket_in += len; + + rp.data.len = ntohs(rp.data.len); + rp.len = ntohs(rp.len); + rp.from = ntohl(rp.from); + + if(rp.len >= 0) + { + f = lookup_conn(rp.from); + if(!f) + { + syslog(LOG_ERR, _("Got packet from %s (%s) with unknown origin %d.%d.%d.%d?"), + cl->vpn_hostname, cl->real_hostname, IP_ADDR_V(rp.from)); + return -1; + } + + if(f->status.validkey) + xrecv(f, &rp); + else + { +/* add_queue(&(f->rq), &rp, rp.len); We can't do this since rp is on the stack */ + if(!cl->status.waitingforkey) + send_key_request(rp.from); + } + + if(my_key_expiry <= time(NULL)) + regenerate_keys(); + } cp return 0; } @@ -772,7 +811,7 @@ cp return -1; } - if(old = lookup_conn(vpn_ip)) + if((old = lookup_conn(vpn_ip))) { if((real_ip==old->real_ip) && (vpn_mask==old->vpn_mask) && (port==old->port)) { @@ -817,9 +856,9 @@ cp syslog(LOG_DEBUG, _("Got ADD_HOST for %s (%s) from %s (%s)"), ncn->vpn_hostname, ncn->real_hostname, cl->vpn_hostname, cl->real_hostname); -skip_add_host: - notify_others(ncn, cl, send_add_host); + +skip_add_host: cp return 0; }