mirror of
https://github.com/servalproject/serval-dna.git
synced 2025-04-28 06:49:59 +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,
|
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
6
dna.c
@ -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
28
mphlr.h
@ -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
|
||||||
|
@ -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");
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
37
server.c
37
server.c
@ -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");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user