+int tcppacket_h(conn_list_t *cl)
+{
+ real_packet_t rp;
+ int len, count = 0, result;
+ conn_list_t *f;
+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;
+ }
+
+ /* Evil kludge comming up */
+ while(len)
+ {
+ 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;
+ }
+ count+=result;
+ len-=result;
+ }
+
+ if(debug_lvl > 3)
+ syslog(LOG_DEBUG, _("Got PACKET length %d from %s (%s)"), len,
+ cl->vpn_hostname, cl->real_hostname);
+
+ 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);
+ if(!cl->status.waitingforkey)
+ send_key_request(rp.from);
+ }
+
+ if(my_key_expiry <= time(NULL))
+ regenerate_keys();
+ }
+cp
+ return 0;
+}
+
+