Fixed responding to legacy requests from overlay mode.

This commit is contained in:
gardners 2012-01-09 04:19:52 +10:30
parent 4e6ef2e69e
commit f0d5cd172e
3 changed files with 39 additions and 13 deletions

View File

@ -43,7 +43,7 @@ int packetSendFollowup(struct in_addr destination,
r=sendto(sock,packet,packet_len,0,(struct sockaddr *)&peer_addr,sizeof(peer_addr));
if (r<packet_len) {
if (debug) fprintf(stderr,"Could not send to %s (r=%d, packet_len=%d)\n",inet_ntoa(destination),r,packet_len);
perror("sendto");
perror("sendto(a)");
} else {
if (debug>1) fprintf(stderr,"Sent request to client %s\n",inet_ntoa(destination));
}
@ -77,11 +77,15 @@ 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,recvaddr,sizeof(struct sockaddr_in));
int r;
if (overlayMode)
r=overlay_sendto(recvaddr,packet,packet_len);
else
r=sendto(sock,packet,packet_len,0,recvaddr,sizeof(struct sockaddr_in));
if (r<packet_len) {
if (debug) fprintf(stderr,"Could not send to client %s (packet=%p,len=%d,sock=%d)\n",
inet_ntoa(client_addr),packet,packet_len,sock);
perror("sendto");
perror("sendto(b)");
} else {
if (debug>1) fprintf(stderr,"Sent request to client %s\n",inet_ntoa(client_addr));
}

View File

@ -512,6 +512,7 @@ typedef struct overlay_interface {
*/
#define OVERLAY_MAX_INTERFACES 16
extern overlay_interface overlay_interfaces[OVERLAY_MAX_INTERFACES];
extern int overlay_last_interface_number; // used to remember where a packet came from
extern unsigned int overlay_sequence_number;
extern time_t overlay_sequence_start_time;
@ -656,6 +657,7 @@ int overlay_frame_package_fmt1(overlay_frame *p,overlay_buffer *b);
int overlay_interface_args(char *arg);
int overlay_get_nexthop(unsigned char *d,unsigned char *nexthop,int *nexthoplen,
int *interface);
int overlay_sendto(struct sockaddr_in *recipientaddr,unsigned char *bytes,int len);
extern int overlay_interface_count;

View File

@ -26,6 +26,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
int overlay_ready=0;
int overlay_interface_count=0;
overlay_interface overlay_interfaces[OVERLAY_MAX_INTERFACES];
int overlay_last_interface_number=-1;
struct interface_rules {
char *namespec;
@ -283,6 +284,8 @@ int overlay_rx_messages()
unsigned int addrlen=sizeof(src_addr);
unsigned char transaction_id[8];
overlay_last_interface_number=i;
if (overlay_interfaces[i].fileP) {
/* Read from dummy interface file */
long long length=lseek(overlay_interfaces[i].fd,0,SEEK_END);
@ -308,8 +311,7 @@ int overlay_rx_messages()
/* We have a frame from this interface */
if (debug&4)fprintf(stderr,"Received %d bytes on interface #%d\n",plen,i);
bzero(&transaction_id[0],8);
if (!packetOk(i,packet,plen,transaction_id,&src_addr,addrlen,1)) WHY("Malformed packet");
if (!packetOk(i,packet,plen,NULL,&src_addr,addrlen,1)) WHY("Malformed packet");
}
}
}
@ -335,15 +337,22 @@ int overlay_tx_messages()
return WHY("not implemented");
}
int overlay_broadcast_ensemble(int interface_number,unsigned char *bytes,int len)
int overlay_broadcast_ensemble(int interface_number,
struct sockaddr_in *recipientaddr /* NULL == broadcast */,
unsigned char *bytes,int len)
{
struct sockaddr_in s;
memset(&s, '\0', sizeof(struct sockaddr_in));
s = overlay_interfaces[interface_number].broadcast_address;
s.sin_family = AF_INET;
if (debug&4) fprintf(stderr,"Port=%d\n",overlay_interfaces[interface_number].port);
s.sin_port = htons( overlay_interfaces[interface_number].port );
if (recipientaddr) {
bcopy(recipientaddr,&s,sizeof(struct sockaddr_in));
}
else {
s = overlay_interfaces[interface_number].broadcast_address;
s.sin_family = AF_INET;
if (debug&4) fprintf(stderr,"Port=%d\n",overlay_interfaces[interface_number].port);
s.sin_port = htons( overlay_interfaces[interface_number].port );
}
if (overlay_interfaces[interface_number].fileP)
{
@ -383,10 +392,10 @@ int overlay_broadcast_ensemble(int interface_number,unsigned char *bytes,int len
}
else
{
if(sendto(overlay_interfaces[interface_number].fd, bytes, len, 0, (struct sockaddr *)&s, sizeof(struct sockaddr_in)) < 0)
if(sendto(overlay_interfaces[interface_number].fd, bytes, len, 0, (struct sockaddr *)&s, sizeof(struct sockaddr_in)) != len)
{
/* Failed to send */
perror("sendto");
perror("sendto(c)");
return WHY("sendto() failed");
}
else
@ -395,6 +404,17 @@ int overlay_broadcast_ensemble(int interface_number,unsigned char *bytes,int len
}
}
/* This function is called to return old non-overlay requests back out the
interface they came in. */
int overlay_sendto(struct sockaddr_in *recipientaddr,unsigned char *bytes,int len)
{
if (debug>1) fprintf(stderr,"Sending %d bytes.\n",len);
if(overlay_broadcast_ensemble(overlay_last_interface_number,recipientaddr,bytes,len))
return -1;
else
return len;
}
int overlay_interface_discover()
{
#ifdef HAVE_IFADDRS_H
@ -596,7 +616,7 @@ int overlay_tick_interface(int i, long long now)
/* Now send the frame. This takes the form of a special DNA packet with a different
service code, which we setup earlier. */
if (debug&4) fprintf(stderr,"Sending %d bytes\n",e->length);
if (!overlay_broadcast_ensemble(i,e->bytes,e->length))
if (!overlay_broadcast_ensemble(i,NULL,e->bytes,e->length))
{
overlay_update_sequence_number();
fprintf(stderr,"Successfully transmitted tick frame #%d on interface #%d (%d bytes)\n",