More work towards handling overlay or DNA packets.

handling of sender address and sockets to use is still a big fat mess
and likely to be broken.
This commit is contained in:
gardners 2011-08-12 21:34:38 +02:00
parent 7e30d62b79
commit c8229c8517
6 changed files with 73 additions and 68 deletions

@ -51,7 +51,8 @@ int packetSendFollowup(struct in_addr destination,
}
int packetSendRequest(int method,unsigned char *packet,int packet_len,int batchP,
unsigned char *transaction_id,struct response_set *responses)
unsigned char *transaction_id,struct sockaddr *recvaddr,
struct response_set *responses)
{
int i;
int cumulative_timeout=0; /* ms */
@ -76,7 +77,7 @@ int packetSendRequest(int method,unsigned char *packet,int packet_len,int batchP
/* Deal with special case */
if (method==REQ_REPLY)
{
int r=sendto(sock,packet,packet_len,0,(struct sockaddr *)&recvaddr,sizeof(recvaddr));
int r=sendto(sock,packet,packet_len,0,recvaddr,sizeof(recvaddr));
if (r<packet_len) {
if (debug) fprintf(stderr,"Could not send to client %s\n",inet_ntoa(client_addr));
} else {
@ -128,7 +129,7 @@ int packetSendRequest(int method,unsigned char *packet,int packet_len,int batchP
while(1)
{
/* Wait for response */
int r=getReplyPackets(method,i,batchP,responses,transaction_id,timeout_remaining);
int r=getReplyPackets(method,i,batchP,responses,transaction_id,recvaddr,timeout_remaining);
if (r&&debug>1) fprintf(stderr,"getReplyPackets(): Returned on timeout\n");
switch(method)
@ -203,7 +204,7 @@ int packetSendRequest(int method,unsigned char *packet,int packet_len,int batchP
sendToPeers() does it that way. We just have to remember to
ask for serialised attempts, rather than all at once.
*/
int requestNewHLR(char *did,char *pin,char *sid)
int requestNewHLR(char *did,char *pin,char *sid,struct sockaddr *recvaddr)
{
unsigned char packet[8000];
int packet_len=0;
@ -221,7 +222,7 @@ int requestNewHLR(char *did,char *pin,char *sid)
/* Send it to peers, starting with ourselves, one at a time until one succeeds.
XXX - This could take a while if we have long timeouts for each. */
if (packetSendRequest(REQ_SERIAL,packet,packet_len,NONBATCH,transaction_id,&responses)) return -1;
if (packetSendRequest(REQ_SERIAL,packet,packet_len,NONBATCH,transaction_id,recvaddr,&responses)) return -1;
/* Extract response */
if (debug>2) dumpResponses(&responses);
@ -292,9 +293,8 @@ int fixResponses(struct response_set *responses)
return 0;
}
int getReplyPackets(int method,int peer,int batchP,
struct response_set *responses,
unsigned char *transaction_id,int timeout)
int getReplyPackets(int method,int peer,int batchP,struct response_set *responses,
unsigned char *transaction_id,struct sockaddr *recvaddr,int timeout)
{
/* set timeout alarm */
@ -307,9 +307,9 @@ int getReplyPackets(int method,int peer,int batchP,
int timeout_usecs;
int to=timeout;
int len;
if (debug>1) printf("getReplyPackets(policy=%d)\n",method);
/* Work out when the timeout will expire */
gettimeofday(&t,NULL);
timeout_secs=t.tv_sec; timeout_usecs=t.tv_usec;
@ -318,33 +318,34 @@ int getReplyPackets(int method,int peer,int batchP,
while(1) {
unsigned char buffer[16384];
socklen_t recvaddrlen=sizeof(recvaddr);
struct sockaddr sender;
socklen_t recvaddrlen=sizeof(struct sockaddr);
struct pollfd fds;
bzero((void *)&recvaddr,sizeof(recvaddr));
bzero((void *)recvaddr,sizeof(struct sockaddr));
fds.fd=sock; fds.events=POLLIN; fds.revents=0;
while (poll(&fds,1,10 /* wait for 10ms at a time */)==0)
{
gettimeofday(&t,NULL);
if (t.tv_sec>timeout_secs) return 1;
if (t.tv_sec==timeout_secs&&t.tv_usec>=timeout_usecs) return 1;
}
len=recvfrom(sock,buffer,sizeof(buffer),0,&recvaddr,&recvaddrlen);
if (len<=0) return setReason("Unable to receive packet.");
client_port=((struct sockaddr_in*)&recvaddr)->sin_port;
client_addr=((struct sockaddr_in*)&recvaddr)->sin_addr;
len=recvfrom(sock,buffer,sizeof(buffer),0,recvaddr,&recvaddrlen);
if (len<=0) return setReason("Unable to receive packet.");
client_port=((struct sockaddr_in *)recvaddr)->sin_port;
client_addr=((struct sockaddr_in *)recvaddr)->sin_addr;
if (debug) fprintf(stderr,"Received reply from %s (len=%d).\n",inet_ntoa(client_addr),len);
if (debug>1) dump("recvaddr",(unsigned char *)&recvaddr,recvaddrlen);
if (debug>1) dump("recvaddr",(unsigned char *)&sender,recvaddrlen);
if (debug>2) dump("packet",(unsigned char *)buffer,len);
if (dropPacketP(len)) {
if (debug) fprintf(stderr,"Simulation mode: Dropped packet due to simulated link parameters.\n");
continue;
}
if (!packetOk(buffer,len,transaction_id)) {
if (!packetOk(buffer,len,transaction_id,recvaddr,recvaddrlen,0)) {
/* Packet passes tests - extract responses and append them to the end of the response list */
if (extractResponses(client_addr,buffer,len,responses))
return setReason("Problem extracting response fields from reply packets");
@ -375,7 +376,7 @@ int getReplyPackets(int method,int peer,int batchP,
}
int writeItem(char *sid,int var_id,int instance,unsigned char *value,
int value_start,int value_length,int flags)
int value_start,int value_length,int flags, struct sockaddr *recvaddr)
{
unsigned char packet[8000];
int packet_len=0;
@ -405,7 +406,7 @@ int writeItem(char *sid,int var_id,int instance,unsigned char *value,
if (o+bytes>value_length) bytes=value_length-o;
if (debug>1) fprintf(stderr," writing [%d,%d)\n",o,o+bytes-1);
if (writeItem(sid,var_id,instance,&value[o-value_start],o,bytes,
flags|((o>value_start)?SET_FRAGMENT:0)))
flags|((o>value_start)?SET_FRAGMENT:0),NULL))
{
if (debug) fprintf(stderr," - writing installment failed\n");
return setReason("Failure during multi-packet write of long-value");
@ -425,7 +426,7 @@ int writeItem(char *sid,int var_id,int instance,unsigned char *value,
/* XXX should be able to target to the peer holding the SID, if we have it.
In any case, we */
if (packetSendRequest(REQ_FIRSTREPLY,packet,packet_len,NONBATCH,transaction_id,&responses)) return -1;
if (packetSendRequest(REQ_FIRSTREPLY,packet,packet_len,NONBATCH,transaction_id,recvaddr,&responses)) return -1;
r=responses.responses;
while(r)
@ -513,7 +514,7 @@ int peerAddress(char *did,char *sid,int flags)
method=REQ_PARALLEL;
if (sid) method=REQ_FIRSTREPLY;
if (packetSendRequest(method,packet,packet_len,NONBATCH,transaction_id,&responses)) {
if (packetSendRequest(method,packet,packet_len,NONBATCH,transaction_id,NULL,&responses)) {
if (debug) fprintf(stderr,"peerAddress() failed because packetSendRequest() failed.\n");
return -1;
}
@ -594,7 +595,7 @@ int requestItem(char *did,char *sid,char *item,int instance,unsigned char *buffe
method=REQ_PARALLEL;
if (sid) method=REQ_FIRSTREPLY;
if (packetSendRequest(method,packet,packet_len,(instance==-1)?BATCH:NONBATCH,transaction_id,&responses)) {
if (packetSendRequest(method,packet,packet_len,(instance==-1)?BATCH:NONBATCH,transaction_id,NULL,&responses)) {
if (debug) fprintf(stderr,"requestItem() failed because packetSendRequest() failed.\n");
return -1;
}
@ -737,7 +738,7 @@ int requestItem(char *did,char *sid,char *item,int instance,unsigned char *buffe
bzero(&responses,sizeof(responses));
/* XXX should target specific peer that sent first piece */
getReplyPackets(REQ_PARALLEL,i,0,&responses,transaction_id,250);
getReplyPackets(REQ_PARALLEL,i,0,&responses,transaction_id,(struct sockaddr *)&r->sender,250);
rr=responses.responses;
while(rr)
{

6
dna.c

@ -378,7 +378,7 @@ int main(int argc,char **argv)
int value_len=65535;
if (parseAssignment((unsigned char *)optarg,&var_id,value,&value_len)) return -1;
value[value_len]=0;
return writeItem(did?did:sid,var_id,instance,value,0,value_len,SET_NOREPLACE);
return writeItem(did?did:sid,var_id,instance,value,0,value_len,SET_NOREPLACE,NULL);
}
break;
case 'U': /* write or update a variable */
@ -388,14 +388,14 @@ int main(int argc,char **argv)
int value_len=65535;
if (parseAssignment((unsigned char *)optarg,&var_id,value,&value_len)) return -1;
value[value_len]=0;
return writeItem(did?did:sid,var_id,instance,value,0,value_len,SET_REPLACE);
return writeItem(did?did:sid,var_id,instance,value,0,value_len,SET_REPLACE,NULL);
}
break;
case 'C': /* create a new HLR entry */
{
if (optind<argc) usage("Extraneous options after HLR creation request");
if ((!did)||(sid)) usage("Specify exactly one DID and no SID to create a new HLR entry");
return requestNewHLR(did,pin,sid);
return requestNewHLR(did,pin,sid,NULL);
}
break;
case 'O': /* output to templated files */

28
mphlr.h

@ -127,7 +127,6 @@ extern int serverMode;
extern char *gatewayspec;
extern struct sockaddr recvaddr;
extern struct in_addr client_addr;
extern int client_port;
@ -288,16 +287,17 @@ int stowDid(unsigned char *packet,int *ofs,char *did);
int isFieldZeroP(unsigned char *packet,int start,int count);
void srandomdev();
int respondSimple(char *sid,int action,unsigned char *action_text,int action_len,
unsigned char *transaction_id,int cryptoFlags);
unsigned char *transaction_id,struct sockaddr *recvaddr,int cryptoFlags);
int requestItem(char *did,char *sid,char *item,int instance,unsigned char *buffer,int buffer_length,int *len,
unsigned char *transaction_id);
int requestNewHLR(char *did,char *pin,char *sid);
int requestNewHLR(char *did,char *pin,char *sid,struct sockaddr *recvaddr);
int server(char *backing_file,int size,int foregroundMode);
int setReason(char *fmt, ...);
int hexvalue(unsigned char c);
int dump(char *name,unsigned char *addr,int len);
int packetOk(unsigned char *packet,int len,unsigned char *transaction_id);
int packetOk(unsigned char *packet,int len,unsigned char *transaction_id,
struct sockaddr *recvaddr,int recvaddrlen,int parseP);
int process_packet(unsigned char *packet,int len,struct sockaddr *sender,int sender_len);
int packetMakeHeader(unsigned char *packet,int packet_maxlen,int *packet_len,unsigned char *transaction_id);
int packetSetDid(unsigned char *packet,int packet_maxlen,int *packet_len,char *did);
@ -310,9 +310,8 @@ int packetAddVariableRequest(unsigned char *packet,int packet_maxlen,int *packet
int packetGetID(unsigned char *packet,int len,char *did,char *sid);
int getPeerList();
int sendToPeers(unsigned char *packet,int packet_len,int method,int peerId,struct response_set *responses);
int getReplyPackets(int method,int peer,int batchP,
struct response_set *responses,
unsigned char *transaction_id,int timeout);
int getReplyPackets(int method,int peer,int batchP,struct response_set *responses,
unsigned char *transaction_id,struct sockaddr *recvaddr,int timeout);
int clearResponse(struct response **response);
int nextHlr(unsigned char *hlr,int *ofs);
int seedHlr();
@ -334,7 +333,8 @@ int hlrSetVariable(unsigned char *hlr,int hofs,int varid,int varinstance,
int extractDid(unsigned char *packet,int *ofs,char *did);
char *hlrSid(unsigned char *hlr,int ofs);
int parseAssignment(unsigned char *text,int *var_id,unsigned char *value,int *value_len);
int writeItem(char *id,int var_id,int instance,unsigned char *value,int value_start,int value_len,int policy);
int writeItem(char *sid,int var_id,int instance,unsigned char *value,
int value_start,int value_length,int flags, struct sockaddr *recvaddr);
int packetAddVariableWrite(unsigned char *packet,int packet_maxlen,int *packet_len,
int itemId,int instance,unsigned char *value,int start_offset,int value_len,int flags);
int processRequest(unsigned char *packet,int len,struct sockaddr *sender,int sender_len,
@ -345,8 +345,6 @@ int extractRequest(unsigned char *packet,int *packet_ofs,int packet_len,
int *start_offset,int *max_offset,int *flags);
int hlrGetVariable(unsigned char *hlr,int hofs,int varid,int varinstance,
unsigned char *value,int *len);
int packetSendRequest(int method,unsigned char *packet,int packet_len,int batchP,
unsigned char *transaction_id,struct response_set *responses);
int dumpResponses(struct response_set *responses);
int eraseLastResponse(struct response_set *responses);
int dropPacketP(int packet_len);
@ -365,9 +363,15 @@ int exportHlr(unsigned char *hlr,char *text);
int openHlrFile(char *backing_file,int size);
int runCommand(char *cmd);
int asteriskObtainGateway(char *requestor_sid,char *did,char *uri_out);
int packetOkDNA(unsigned char *packet,int len,unsigned char *transaction_id);
int packetOkOverlay(unsigned char *packet,int len,unsigned char *transaction_id);
int packetOkDNA(unsigned char *packet,int len,unsigned char *transaction_id,
struct sockaddr *recvaddr,int recvaddrlen,int parseP);
int packetOkOverlay(unsigned char *packet,int len,unsigned char *transaction_id,
struct sockaddr *recvaddr,int recvaddrlen,int parseP);
int prepareGateway(char *gatewayspec);
int packetSendRequest(int method,unsigned char *packet,int packet_len,int batchP,
unsigned char *transaction_id,struct sockaddr *recvaddr,
struct response_set *responses);
#define CRYPT_CIPHERED 1

@ -228,8 +228,7 @@ int overlay_rx_messages()
fprintf(stderr,"Received %d bytes on interface #%d\n",plen,i);
bzero(&transaction_id[0],8);
if (!packetOk(packet,plen,transaction_id)) WHY("Malformed packet");
if (!packetOk(packet,plen,transaction_id,&src_addr,addrlen,1)) WHY("Malformed packet");
}
}

@ -57,20 +57,22 @@ int process_packet(unsigned char *packet,int len,struct sockaddr *sender,int sen
return 0;
}
int packetOk(unsigned char *packet,int len,unsigned char *transaction_id)
int packetOk(unsigned char *packet,int len,unsigned char *transaction_id,
struct sockaddr *recvaddr,int recvaddrlen,int parseP)
{
if (len<HEADERFIELDS_LEN) return setReason("Packet is too short");
if (packet[0]==0x41&&packet[1]==0x10)
return packetOkDNA(packet,len,transaction_id);
return packetOkDNA(packet,len,transaction_id,recvaddr,recvaddrlen,parseP);
if (packet[0]==0x4F&&packet[1]==0x10)
return packetOkOverlay(packet,len,transaction_id);
return packetOkOverlay(packet,len,transaction_id,recvaddr,recvaddrlen,parseP);
return setReason("Packet type not recognised.");
}
int packetOkDNA(unsigned char *packet,int len,unsigned char *transaction_id)
int packetOkDNA(unsigned char *packet,int len,unsigned char *transaction_id,
struct sockaddr *recvaddr,int recvaddrlen,int parseP)
{
/* Make sure that the packet is meant for us, and is not mal-formed */
int version;
@ -111,7 +113,7 @@ int packetOkDNA(unsigned char *packet,int len,unsigned char *transaction_id)
if (debug>1) fprintf(stderr,"Packet passes sanity checks and is ready for decoding.\n");
if (debug>2) dump("unrotated packet",packet,len);
return 0;
if (parseP) return process_packet(packet,len,recvaddr,recvaddrlen); else return 0;
}
int packetMakeHeader(unsigned char *packet,int packet_maxlen,int *packet_len,

@ -24,7 +24,6 @@ int hlr_size=0;
FILE *i_f=NULL;
struct sockaddr recvaddr;
struct in_addr client_addr;
int client_port;
@ -182,17 +181,17 @@ int processRequest(unsigned char *packet,int len,
/* Creating an HLR requires an initial DID number and definately no SID -
you can't choose a SID. */
if (debug>1) fprintf(stderr,"Creating a new HLR record. did='%s', sid='%s'\n",did,sid);
if (!did[0]) return respondSimple(NULL,ACTION_DECLINED,NULL,0,transaction_id,CRYPT_CIPHERED|CRYPT_SIGNED);
if (sid[0]) return respondSimple(sid,ACTION_DECLINED,NULL,0,transaction_id,CRYPT_CIPHERED|CRYPT_SIGNED);
if (!did[0]) return respondSimple(NULL,ACTION_DECLINED,NULL,0,transaction_id,sender,CRYPT_CIPHERED|CRYPT_SIGNED);
if (sid[0]) return respondSimple(sid,ACTION_DECLINED,NULL,0,transaction_id,sender,CRYPT_CIPHERED|CRYPT_SIGNED);
if (debug>1) fprintf(stderr,"Verified that create request supplies DID but not SID\n");
{
char sid[128];
/* make HLR with new random SID and initial DID */
if (!createHlr(did,sid))
return respondSimple(sid,ACTION_OKAY,NULL,0,transaction_id,CRYPT_CIPHERED|CRYPT_SIGNED);
return respondSimple(sid,ACTION_OKAY,NULL,0,transaction_id,sender,CRYPT_CIPHERED|CRYPT_SIGNED);
else
return respondSimple(NULL,ACTION_DECLINED,NULL,0,transaction_id,CRYPT_CIPHERED|CRYPT_SIGNED);
return respondSimple(NULL,ACTION_DECLINED,NULL,0,transaction_id,sender,CRYPT_CIPHERED|CRYPT_SIGNED);
}
pofs+=1;
pofs+=1+SID_SIZE;
@ -254,7 +253,7 @@ int processRequest(unsigned char *packet,int len,
sprintf(amCommand, "am broadcast -a org.servalproject.DT -e number \"%s\" -e content \"%s\"", emitterPhoneNumber, message);
if (debug>1) fprintf(stderr,"Delivering DT message via intent: %s\n",amCommand);
int exitcode = runCommand(amCommand);
respondSimple(hlrSid(hlr, ofs),ACTION_OKAY,NULL,0,transaction_id,CRYPT_CIPHERED|CRYPT_SIGNED);
respondSimple(hlrSid(hlr, ofs),ACTION_OKAY,NULL,0,transaction_id,sender,CRYPT_CIPHERED|CRYPT_SIGNED);
}
}
break;
@ -265,7 +264,7 @@ int processRequest(unsigned char *packet,int len,
if ((!sid)||(!sid[0])) {
setReason("You can only set variables by SID");
return respondSimple(NULL,ACTION_ERROR,(unsigned char *)"SET requires authentication by SID",0,transaction_id,
CRYPT_CIPHERED|CRYPT_SIGNED);
sender,CRYPT_CIPHERED|CRYPT_SIGNED);
}
while(findHlr(hlr,&ofs,sid,did))
@ -292,7 +291,7 @@ int processRequest(unsigned char *packet,int len,
setReason("Could not extract ACTION_SET request");
return
respondSimple(NULL,ACTION_ERROR,(unsigned char *)"Mal-formed SET request",0,transaction_id,
CRYPT_CIPHERED|CRYPT_SIGNED);
sender,CRYPT_CIPHERED|CRYPT_SIGNED);
}
/* Get the stored value */
@ -306,7 +305,7 @@ int processRequest(unsigned char *packet,int len,
return
respondSimple(NULL,ACTION_ERROR,
(unsigned char *)"Cannot SET NOCREATE/REPLACE a value that does not exist",
0,transaction_id,CRYPT_CIPHERED|CRYPT_SIGNED);
0,transaction_id,sender,CRYPT_CIPHERED|CRYPT_SIGNED);
}
} else {
if (flags==SET_NOREPLACE) {
@ -315,7 +314,7 @@ int processRequest(unsigned char *packet,int len,
return
respondSimple(NULL,ACTION_ERROR,
(unsigned char *)"Cannot SET NOREPLACE; a value exists",
0,transaction_id,CRYPT_CIPHERED|CRYPT_SIGNED);
0,transaction_id,sender,CRYPT_CIPHERED|CRYPT_SIGNED);
}
}
/* Replace the changed portion of the stored value */
@ -331,13 +330,13 @@ int processRequest(unsigned char *packet,int len,
setReason("Failed to write variable");
return
respondSimple(NULL,ACTION_ERROR,(unsigned char *)"Failed to SET variable",0,transaction_id,
CRYPT_CIPHERED|CRYPT_SIGNED);
sender,CRYPT_CIPHERED|CRYPT_SIGNED);
}
if (debug>2) { fprintf(stderr,"HLR after writing:\n"); hlrDump(hlr,ofs); }
/* Reply that we wrote the fragment */
respondSimple(sid,ACTION_WROTE,&packet[rofs],6,
transaction_id,CRYPT_CIPHERED|CRYPT_SIGNED);
transaction_id,sender,CRYPT_CIPHERED|CRYPT_SIGNED);
/* Advance to next record and keep searching */
if (nextHlr(hlr,&ofs)) break;
}
@ -395,7 +394,7 @@ int processRequest(unsigned char *packet,int len,
// only send each value when the *next* record is found, that way we can easily stamp the last response with DONE
if (sendDone>0)
respondSimple(hlr_sid,ACTION_DATA,data,dlen,transaction_id,CRYPT_CIPHERED|CRYPT_SIGNED);
respondSimple(hlr_sid,ACTION_DATA,data,dlen,transaction_id,sender,CRYPT_CIPHERED|CRYPT_SIGNED);
dlen=0;
@ -422,7 +421,7 @@ int processRequest(unsigned char *packet,int len,
{
data[dlen++]=ACTION_DONE;
data[dlen++]=sendDone&0xff;
respondSimple(hlr_sid,ACTION_DATA,data,dlen,transaction_id,CRYPT_CIPHERED|CRYPT_SIGNED);
respondSimple(hlr_sid,ACTION_DATA,data,dlen,transaction_id,sender,CRYPT_CIPHERED|CRYPT_SIGNED);
}
if (gatewayspec&&(var_id==VAR_LOCATIONS)&&did&&strlen(did))
{
@ -447,7 +446,7 @@ int processRequest(unsigned char *packet,int len,
if (packageVariableSegment(data,&dlen,&fake,offset,MAX_DATA_BYTES+16))
return setReason("packageVariableSegment() of gateway URI failed.");
respondSimple(hlrSid(hlr,0),ACTION_DATA,data,dlen,transaction_id,CRYPT_CIPHERED|CRYPT_SIGNED);
respondSimple(hlrSid(hlr,0),ACTION_DATA,data,dlen,transaction_id,sender,CRYPT_CIPHERED|CRYPT_SIGNED);
}
else
{
@ -472,7 +471,7 @@ int processRequest(unsigned char *packet,int len,
}
int respondSimple(char *sid,int action,unsigned char *action_text,int action_len,
unsigned char *transaction_id,int cryptoFlags)
unsigned char *transaction_id,struct sockaddr *recvaddr,int cryptoFlags)
{
unsigned char packet[8000];
int pl=0;
@ -515,7 +514,7 @@ int respondSimple(char *sid,int action,unsigned char *action_text,int action_len
if (debug) fprintf(stderr,"Sending response of %d bytes.\n",*packet_len);
if (packetSendRequest(REQ_REPLY,packet,*packet_len,NONBATCH,transaction_id,NULL)) return -1;
if (packetSendRequest(REQ_REPLY,packet,*packet_len,NONBATCH,transaction_id,recvaddr,NULL)) return -1;
return 0;
}
@ -549,6 +548,7 @@ int simpleServerMode()
{
while(1) {
unsigned char buffer[16384];
struct sockaddr recvaddr;
socklen_t recvaddrlen=sizeof(recvaddr);
struct pollfd fds;
int len;
@ -571,8 +571,7 @@ int simpleServerMode()
if (debug) fprintf(stderr,"Simulation mode: Dropped packet due to simulated link parameters.\n");
continue;
}
if (!packetOk(buffer,len,NULL)) process_packet(buffer,len,&recvaddr,recvaddrlen);
else {
if (packetOk(buffer,len,NULL,&recvaddr,recvaddrlen,1)) {
if (debug) setReason("Ignoring invalid packet");
}
if (debug>1) fprintf(stderr,"Finished processing packet, waiting for next one.\n");