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

View File

@ -51,7 +51,8 @@ int packetSendFollowup(struct in_addr destination,
} }
int packetSendRequest(int method,unsigned char *packet,int packet_len,int batchP, 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 i;
int cumulative_timeout=0; /* ms */ 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 */ /* Deal with special case */
if (method==REQ_REPLY) 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 (r<packet_len) {
if (debug) fprintf(stderr,"Could not send to client %s\n",inet_ntoa(client_addr)); if (debug) fprintf(stderr,"Could not send to client %s\n",inet_ntoa(client_addr));
} else { } else {
@ -128,7 +129,7 @@ int packetSendRequest(int method,unsigned char *packet,int packet_len,int batchP
while(1) while(1)
{ {
/* Wait for response */ /* 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"); if (r&&debug>1) fprintf(stderr,"getReplyPackets(): Returned on timeout\n");
switch(method) 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 sendToPeers() does it that way. We just have to remember to
ask for serialised attempts, rather than all at once. 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]; unsigned char packet[8000];
int packet_len=0; 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. /* 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. */ 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 */ /* Extract response */
if (debug>2) dumpResponses(&responses); if (debug>2) dumpResponses(&responses);
@ -292,9 +293,8 @@ int fixResponses(struct response_set *responses)
return 0; return 0;
} }
int getReplyPackets(int method,int peer,int batchP, int getReplyPackets(int method,int peer,int batchP,struct response_set *responses,
struct response_set *responses, unsigned char *transaction_id,struct sockaddr *recvaddr,int timeout)
unsigned char *transaction_id,int timeout)
{ {
/* set timeout alarm */ /* set timeout alarm */
@ -318,10 +318,11 @@ int getReplyPackets(int method,int peer,int batchP,
while(1) { while(1) {
unsigned char buffer[16384]; unsigned char buffer[16384];
socklen_t recvaddrlen=sizeof(recvaddr); struct sockaddr sender;
socklen_t recvaddrlen=sizeof(struct sockaddr);
struct pollfd fds; struct pollfd fds;
bzero((void *)&recvaddr,sizeof(recvaddr)); bzero((void *)recvaddr,sizeof(struct sockaddr));
fds.fd=sock; fds.events=POLLIN; fds.revents=0; fds.fd=sock; fds.events=POLLIN; fds.revents=0;
while (poll(&fds,1,10 /* wait for 10ms at a time */)==0) while (poll(&fds,1,10 /* wait for 10ms at a time */)==0)
@ -330,21 +331,21 @@ int getReplyPackets(int method,int peer,int batchP,
if (t.tv_sec>timeout_secs) return 1; if (t.tv_sec>timeout_secs) return 1;
if (t.tv_sec==timeout_secs&&t.tv_usec>=timeout_usecs) return 1; if (t.tv_sec==timeout_secs&&t.tv_usec>=timeout_usecs) return 1;
} }
len=recvfrom(sock,buffer,sizeof(buffer),0,&recvaddr,&recvaddrlen); len=recvfrom(sock,buffer,sizeof(buffer),0,recvaddr,&recvaddrlen);
if (len<=0) return setReason("Unable to receive packet."); if (len<=0) return setReason("Unable to receive packet.");
client_port=((struct sockaddr_in*)&recvaddr)->sin_port; client_port=((struct sockaddr_in *)recvaddr)->sin_port;
client_addr=((struct sockaddr_in*)&recvaddr)->sin_addr; 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) 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 (debug>2) dump("packet",(unsigned char *)buffer,len);
if (dropPacketP(len)) { if (dropPacketP(len)) {
if (debug) fprintf(stderr,"Simulation mode: Dropped packet due to simulated link parameters.\n"); if (debug) fprintf(stderr,"Simulation mode: Dropped packet due to simulated link parameters.\n");
continue; 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 */ /* Packet passes tests - extract responses and append them to the end of the response list */
if (extractResponses(client_addr,buffer,len,responses)) if (extractResponses(client_addr,buffer,len,responses))
return setReason("Problem extracting response fields from reply packets"); 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 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]; unsigned char packet[8000];
int packet_len=0; 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 (o+bytes>value_length) bytes=value_length-o;
if (debug>1) fprintf(stderr," writing [%d,%d)\n",o,o+bytes-1); 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, 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"); if (debug) fprintf(stderr," - writing installment failed\n");
return setReason("Failure during multi-packet write of long-value"); 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. /* XXX should be able to target to the peer holding the SID, if we have it.
In any case, we */ 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; r=responses.responses;
while(r) while(r)
@ -513,7 +514,7 @@ int peerAddress(char *did,char *sid,int flags)
method=REQ_PARALLEL; method=REQ_PARALLEL;
if (sid) method=REQ_FIRSTREPLY; 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"); if (debug) fprintf(stderr,"peerAddress() failed because packetSendRequest() failed.\n");
return -1; return -1;
} }
@ -594,7 +595,7 @@ int requestItem(char *did,char *sid,char *item,int instance,unsigned char *buffe
method=REQ_PARALLEL; method=REQ_PARALLEL;
if (sid) method=REQ_FIRSTREPLY; 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"); if (debug) fprintf(stderr,"requestItem() failed because packetSendRequest() failed.\n");
return -1; return -1;
} }
@ -737,7 +738,7 @@ int requestItem(char *did,char *sid,char *item,int instance,unsigned char *buffe
bzero(&responses,sizeof(responses)); bzero(&responses,sizeof(responses));
/* XXX should target specific peer that sent first piece */ /* 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; rr=responses.responses;
while(rr) while(rr)
{ {

6
dna.c
View File

@ -378,7 +378,7 @@ int main(int argc,char **argv)
int value_len=65535; int value_len=65535;
if (parseAssignment((unsigned char *)optarg,&var_id,value,&value_len)) return -1; if (parseAssignment((unsigned char *)optarg,&var_id,value,&value_len)) return -1;
value[value_len]=0; 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; break;
case 'U': /* write or update a variable */ case 'U': /* write or update a variable */
@ -388,14 +388,14 @@ int main(int argc,char **argv)
int value_len=65535; int value_len=65535;
if (parseAssignment((unsigned char *)optarg,&var_id,value,&value_len)) return -1; if (parseAssignment((unsigned char *)optarg,&var_id,value,&value_len)) return -1;
value[value_len]=0; 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; break;
case 'C': /* create a new HLR entry */ case 'C': /* create a new HLR entry */
{ {
if (optind<argc) usage("Extraneous options after HLR creation request"); 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"); 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; break;
case 'O': /* output to templated files */ case 'O': /* output to templated files */

28
mphlr.h
View File

@ -127,7 +127,6 @@ extern int serverMode;
extern char *gatewayspec; extern char *gatewayspec;
extern struct sockaddr recvaddr;
extern struct in_addr client_addr; extern struct in_addr client_addr;
extern int client_port; 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); int isFieldZeroP(unsigned char *packet,int start,int count);
void srandomdev(); void srandomdev();
int respondSimple(char *sid,int action,unsigned char *action_text,int action_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);
int requestItem(char *did,char *sid,char *item,int instance,unsigned char *buffer,int buffer_length,int *len, int requestItem(char *did,char *sid,char *item,int instance,unsigned char *buffer,int buffer_length,int *len,
unsigned char *transaction_id); 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 server(char *backing_file,int size,int foregroundMode);
int setReason(char *fmt, ...); int setReason(char *fmt, ...);
int hexvalue(unsigned char c); int hexvalue(unsigned char c);
int dump(char *name,unsigned char *addr,int len); 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 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 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); 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 packetGetID(unsigned char *packet,int len,char *did,char *sid);
int getPeerList(); int getPeerList();
int sendToPeers(unsigned char *packet,int packet_len,int method,int peerId,struct response_set *responses); int sendToPeers(unsigned char *packet,int packet_len,int method,int peerId,struct response_set *responses);
int getReplyPackets(int method,int peer,int batchP, int getReplyPackets(int method,int peer,int batchP,struct response_set *responses,
struct response_set *responses, unsigned char *transaction_id,struct sockaddr *recvaddr,int timeout);
unsigned char *transaction_id,int timeout);
int clearResponse(struct response **response); int clearResponse(struct response **response);
int nextHlr(unsigned char *hlr,int *ofs); int nextHlr(unsigned char *hlr,int *ofs);
int seedHlr(); 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); int extractDid(unsigned char *packet,int *ofs,char *did);
char *hlrSid(unsigned char *hlr,int ofs); char *hlrSid(unsigned char *hlr,int ofs);
int parseAssignment(unsigned char *text,int *var_id,unsigned char *value,int *value_len); 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 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 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, 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 *start_offset,int *max_offset,int *flags);
int hlrGetVariable(unsigned char *hlr,int hofs,int varid,int varinstance, int hlrGetVariable(unsigned char *hlr,int hofs,int varid,int varinstance,
unsigned char *value,int *len); 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 dumpResponses(struct response_set *responses);
int eraseLastResponse(struct response_set *responses); int eraseLastResponse(struct response_set *responses);
int dropPacketP(int packet_len); int dropPacketP(int packet_len);
@ -365,9 +363,15 @@ int exportHlr(unsigned char *hlr,char *text);
int openHlrFile(char *backing_file,int size); int openHlrFile(char *backing_file,int size);
int runCommand(char *cmd); int runCommand(char *cmd);
int asteriskObtainGateway(char *requestor_sid,char *did,char *uri_out); int asteriskObtainGateway(char *requestor_sid,char *did,char *uri_out);
int packetOkDNA(unsigned char *packet,int len,unsigned char *transaction_id); int packetOkDNA(unsigned char *packet,int len,unsigned char *transaction_id,
int packetOkOverlay(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 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 #define CRYPT_CIPHERED 1

View File

@ -228,8 +228,7 @@ int overlay_rx_messages()
fprintf(stderr,"Received %d bytes on interface #%d\n",plen,i); fprintf(stderr,"Received %d bytes on interface #%d\n",plen,i);
bzero(&transaction_id[0],8); 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");
} }
} }

View File

@ -57,20 +57,22 @@ int process_packet(unsigned char *packet,int len,struct sockaddr *sender,int sen
return 0; 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 (len<HEADERFIELDS_LEN) return setReason("Packet is too short");
if (packet[0]==0x41&&packet[1]==0x10) 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) 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."); 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 */ /* Make sure that the packet is meant for us, and is not mal-formed */
int version; 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>1) fprintf(stderr,"Packet passes sanity checks and is ready for decoding.\n");
if (debug>2) dump("unrotated packet",packet,len); 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, int packetMakeHeader(unsigned char *packet,int packet_maxlen,int *packet_len,

View File

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