various simplifications of DNA reply generation and related code.

This commit is contained in:
gardners 2012-06-21 12:21:25 +09:30
parent 2cb84bb8db
commit 374e4676a7
2 changed files with 41 additions and 26 deletions

View File

@ -476,10 +476,22 @@ int overlay_saw_mdp_frame(int interface, overlay_mdp_frame *mdp,long long now)
} }
if (match>-1) { if (match>-1) {
struct sockaddr_un addr; struct sockaddr_un addr;
printf("unix domain socket '%s'\n",mdp_bindings_sockets[match]);
bcopy(mdp_bindings_sockets[match],&addr.sun_path[0],mdp_bindings_socket_name_lengths[match]); bcopy(mdp_bindings_sockets[match],&addr.sun_path[0],mdp_bindings_socket_name_lengths[match]);
addr.sun_family=AF_UNIX; addr.sun_family=AF_UNIX;
int r=sendto(mdp_named_socket,mdp,overlay_mdp_relevant_bytes(mdp),0,(struct sockaddr*)&addr,sizeof(addr)); errno=0;
if (r==overlay_mdp_relevant_bytes(mdp)) return 0; int len=overlay_mdp_relevant_bytes(mdp);
int r=sendto(mdp_named_socket,mdp,len,0,(struct sockaddr*)&addr,sizeof(addr));
if (r==overlay_mdp_relevant_bytes(mdp)) {
dump("Sent to MDP client",(unsigned char *)mdp,len);
perror("errno after sendto()");
return 0;
}
if (errno==ENOENT) {
/* far-end of socket has died, so drop binding */
printf("Closing dead MDP client '%s'\n",mdp_bindings_sockets[match]);
overlay_mdp_releasebindings(&addr,mdp_bindings_socket_name_lengths[match]);
}
WHY_perror("sendto(e)"); WHY_perror("sendto(e)");
return WHY("Failed to pass received MDP frame to client"); return WHY("Failed to pass received MDP frame to client");
} else { } else {
@ -505,13 +517,23 @@ int overlay_saw_mdp_frame(int interface, overlay_mdp_frame *mdp,long long now)
/* make sure it is null terminated */ /* make sure it is null terminated */
did[pll]=0; did[pll]=0;
/* remember source sid for putting back later */ /* remember source sid for putting back later */
unsigned char srcsid[32]; overlay_mdp_frame mdpreply;
bcopy(&mdp->out.src.sid[0],&srcsid[0],SID_SIZE);
/* now switch addresses around for any replies */
overlay_mdp_swap_src_dst(mdp);
int results=0; int results=0;
while(keyring_find_did(keyring,&cn,&in,&kp,did)) while(keyring_find_did(keyring,&cn,&in,&kp,did))
{ {
bzero(&mdpreply,sizeof(mdpreply));
/* mark as outgoing MDP message */
mdp->packetTypeAndFlags&=MDP_FLAG_MASK;
mdp->packetTypeAndFlags|=MDP_TX;
/* Set source and destination addresses */
bcopy(&mdp->out.dst.sid,mdpreply.out.src.sid,SID_SIZE);
bcopy(&mdp->out.src.sid,mdpreply.out.dst.sid,SID_SIZE);
mdpreply.out.src.port=mdp->out.dst.port;
mdpreply.out.dst.port=mdp->out.src.port;
/* package DID and Name into reply (we include the DID because /* package DID and Name into reply (we include the DID because
it could be a wild-card DID search, but the SID is implied it could be a wild-card DID search, but the SID is implied
in the source address of our reply). */ in the source address of our reply). */
@ -530,18 +552,15 @@ int overlay_saw_mdp_frame(int interface, overlay_mdp_frame *mdp,long long now)
(char *)keyring->contexts[cn]->identities[in]->keypairs[kp] (char *)keyring->contexts[cn]->identities[in]->keypairs[kp]
->public_key; ->public_key;
/* copy SID out into source address of frame */ /* copy SID out into source address of frame */
bcopy(packedSid,&mdp->out.src.sid[0],SID_SIZE); bcopy(packedSid,&mdpreply.out.src.sid[0],SID_SIZE);
/* and build reply as did\nname\nURI<NUL> */ /* and build reply as did\nname\nURI<NUL> */
snprintf((char *)&mdp->out.payload[0],512,"%s\n%s\nsid://%s/%s", snprintf((char *)&mdpreply.out.payload[0],512,"%s\n%s\nsid://%s/%s",
unpackedDid,name,overlay_render_sid(packedSid), unpackedDid,name,overlay_render_sid(packedSid),
unpackedDid); unpackedDid);
mdp->out.payload_length=strlen((char *)mdp->out.payload)+1; mdpreply.out.payload_length=strlen((char *)mdpreply.out.payload)+1;
/* mark as outgoing MDP message */ /* deliver reply */
mdp->packetTypeAndFlags&=MDP_FLAG_MASK; overlay_mdp_dispatch(&mdpreply,0 /* system generated */,NULL,0);
mdp->packetTypeAndFlags|=MDP_TX;
overlay_mdp_dispatch(mdp,0 /* system generated */,
NULL,0);
kp++; kp++;
results++; results++;
} }
@ -556,18 +575,8 @@ int overlay_saw_mdp_frame(int interface, overlay_mdp_frame *mdp,long long now)
when results become available, so this function will return when results become available, so this function will return
immediately, so as not to cause blockages and delays in servald. immediately, so as not to cause blockages and delays in servald.
*/ */
dna_helper_enqueue(did,mdp->out.dst.sid); dna_helper_enqueue(did,mdp->out.src.sid);
} }
/* and switch addresses back around in case the caller was planning on
using MDP structure again (this happens if there is a loop-back reply
and the frame needs sending on, as happens with broadcasts. MDP ping
is a simple application where this occurs).
Similarly restore destination address & MDP payload content and
length */
overlay_mdp_swap_src_dst(mdp);
bcopy(&srcsid[0],&mdp->out.src.sid[0],SID_SIZE);
bcopy(&did[0],&mdp->out.payload[0],pll);
mdp->out.payload_length=pll;
return 0; return 0;
} }
break; break;
@ -610,7 +619,8 @@ int overlay_saw_mdp_frame(int interface, overlay_mdp_frame *mdp,long long now)
default: default:
/* Unbound socket. We won't be sending ICMP style connection refused /* Unbound socket. We won't be sending ICMP style connection refused
messages, partly because they are a waste of bandwidth. */ messages, partly because they are a waste of bandwidth. */
return WHY("Received packet for which no listening process exists"); return WHYF("Received packet for which no listening process exists (MDP ports: src=%d, dst=%d",
mdp->out.src.port,mdp->out.dst.port);
} }
} }
break; break;
@ -682,6 +692,8 @@ int overlay_mdp_sanitytest_sourceaddr(sockaddr_mdp *src,int userGeneratedFrameP,
printf("addr=%s port=%u (0x%x)\n", printf("addr=%s port=%u (0x%x)\n",
overlay_render_sid(src->sid),src->port,src->port); overlay_render_sid(src->sid),src->port,src->port);
if (recvaddr) printf("recvaddr='%s'\n",
recvaddr->sun_path);
return WHY("No such socket binding:unix domain socket tuple exists -- someone might be trying to spoof someone else's connection"); return WHY("No such socket binding:unix domain socket tuple exists -- someone might be trying to spoof someone else's connection");
} }
@ -1151,6 +1163,7 @@ int overlay_mdp_send(overlay_mdp_frame *mdp,int flags,int timeout_ms)
return WHY("Timeout waiting for server response"); return WHY("Timeout waiting for server response");
} }
int ttl=-1; int ttl=-1;
if (!overlay_mdp_recv(mdp,&ttl)) { if (!overlay_mdp_recv(mdp,&ttl)) {
/* If all is well, examine result and return error code provided */ /* If all is well, examine result and return error code provided */

View File

@ -1523,6 +1523,8 @@ int server_probe(int *pid);
int dna_helper_enqueue(char *did, unsigned char *requestorSid); int dna_helper_enqueue(char *did, unsigned char *requestorSid);
int dna_return_resolution(overlay_mdp_frame *mdp, unsigned char *fromSid, int dna_return_resolution(overlay_mdp_frame *mdp, unsigned char *fromSid,
const char *did,const char *name,const char *uri); const char *did,const char *name,const char *uri);
int parseDnaReply(unsigned char *bytes,int count,
char *did,char *name,char *uri);
extern int sigPipeFlag; extern int sigPipeFlag;
extern int sigIoFlag; extern int sigIoFlag;