mirror of
https://github.com/servalproject/serval-dna.git
synced 2025-04-27 14:29:51 +00:00
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:
parent
7e30d62b79
commit
c8229c8517
43
client.c
43
client.c
@ -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 */
|
||||
|
||||
@ -318,10 +318,11 @@ 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)
|
||||
@ -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&&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.");
|
||||
|
||||
client_port=((struct sockaddr_in*)&recvaddr)->sin_port;
|
||||
client_addr=((struct sockaddr_in*)&recvaddr)->sin_addr;
|
||||
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
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
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,
|
||||
|
37
server.c
37
server.c
@ -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");
|
||||
|
Loading…
x
Reference in New Issue
Block a user