diff --git a/overlay_mdp_services.c b/overlay_mdp_services.c index 478e2c0c..a186bb54 100644 --- a/overlay_mdp_services.c +++ b/overlay_mdp_services.c @@ -26,6 +26,19 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "mdp_client.h" #include "crypto.h" +int overlay_mdp_service_rhizomerequest(overlay_mdp_frame *mdp) +{ + IN(); + + RETURN(-1); +} + +int overlay_mdp_service_rhizomeresponse(overlay_mdp_frame *mdp) +{ + IN(); + + RETURN(-1); +} int overlay_mdp_service_dnalookup(overlay_mdp_frame *mdp) { @@ -133,19 +146,12 @@ int overlay_mdp_try_interal_services(overlay_mdp_frame *mdp) { IN(); switch(mdp->out.dst.port) { - case MDP_PORT_VOMP: - RETURN(vomp_mdp_received(mdp)); - case MDP_PORT_KEYMAPREQUEST: - /* Either respond with the appropriate SAS, or record this one if it - verifies out okay. */ - if (debug & DEBUG_MDPREQUESTS) DEBUG("MDP_PORT_KEYMAPREQUEST"); - RETURN(keyring_mapping_request(keyring,mdp)); - case MDP_PORT_DNALOOKUP: /* attempt to resolve DID to SID */ - RETURN(overlay_mdp_service_dnalookup(mdp)); - break; - case MDP_PORT_ECHO: /* well known ECHO port for TCP/UDP and now MDP */ - RETURN(overlay_mdp_service_echo(mdp)); - break; + case MDP_PORT_VOMP: RETURN(vomp_mdp_received(mdp)); + case MDP_PORT_KEYMAPREQUEST: RETURN(keyring_mapping_request(keyring,mdp)); + case MDP_PORT_DNALOOKUP: RETURN(overlay_mdp_service_dnalookup(mdp)); + case MDP_PORT_ECHO: RETURN(overlay_mdp_service_echo(mdp)); + case MDP_PORT_RHIZOME_REQUEST: RETURN(overlay_mdp_service_rhizomerequest(mdp)); + case MDP_PORT_RHIZOME_RESPONSE: RETURN(overlay_mdp_service_rhizomeresponse(mdp)); default: /* Unbound socket. We won't be sending ICMP style connection refused messages, partly because they are a waste of bandwidth. */ diff --git a/packetformats.c b/packetformats.c index be8bbb9e..ea1bd24d 100644 --- a/packetformats.c +++ b/packetformats.c @@ -40,3 +40,24 @@ int packetOk(struct overlay_interface *interface, unsigned char *packet, size_t return WHY("Packet type not recognised."); } +void write_uint64(unsigned char *o,uint64_t v) +{ + int i; + for(i=0;i<8;i++) + { *(o++)=v&0xff; v=v>>8; } +} + +void write_uint32(unsigned char *o,uint32_t v) +{ + int i; + for(i=0;i<4;i++) + { *(o++)=v&0xff; v=v>>8; } +} + +void write_uint16(unsigned char *o,uint16_t v) +{ + int i; + for(i=0;i<2;i++) + { *(o++)=v&0xff; v=v>>8; } +} + diff --git a/rhizome_fetch.c b/rhizome_fetch.c index b515f919..aca2caf4 100644 --- a/rhizome_fetch.c +++ b/rhizome_fetch.c @@ -1036,10 +1036,17 @@ static int rhizome_fetch_mdp_requestblocks(struct rhizome_fetch_slot *slot) mdp.out.dst.port=MDP_PORT_RHIZOME_REQUEST; mdp.out.ttl=1; mdp.packetTypeAndFlags=MDP_TX; - DEBUGF("Set request manifest in MDP frame body"); + + mdp.out.queue=OQ_ORDINARY; + mdp.out.payload_length=RHIZOME_BAR_BYTES+8+4+2; + bcopy(slot->bar,&mdp.out.payload[0],RHIZOME_BAR_BYTES); + + write_uint64(&mdp.out.payload[RHIZOME_BAR_BYTES],slot->mdpRXWindowStart); + write_uint32(&mdp.out.payload[RHIZOME_BAR_BYTES+8],slot->mdpRXBitmap); + write_uint16(&mdp.out.payload[RHIZOME_BAR_BYTES+8+4],slot->mdpRXBlockLength); + overlay_mdp_dispatch(&mdp,0 /* system generated */,NULL,0); - DEBUGF("Set callback function, and set alarm"); slot->alarm.function = rhizome_fetch_mdp_slot_callback; slot->alarm.alarm=slot->mdpNextTX; schedule(&slot->alarm); @@ -1049,6 +1056,11 @@ static int rhizome_fetch_mdp_requestblocks(struct rhizome_fetch_slot *slot) static int rhizome_fetch_mdp_requestmanifest(struct rhizome_fetch_slot *slot) { + if (slot->prefix_length<1||slot->prefix_length>32) { + // invalid request + return rhizome_fetch_close(slot); + } + if ((gettime_ms()-slot->mdpLastRX)>slot->mdpIdleTimeout) { // connection timed out return rhizome_fetch_close(slot); @@ -1065,7 +1077,11 @@ static int rhizome_fetch_mdp_requestmanifest(struct rhizome_fetch_slot *slot) mdp.out.dst.port=MDP_PORT_RHIZOME_REQUEST; mdp.out.ttl=1; mdp.packetTypeAndFlags=MDP_TX; - DEBUGF("Set request manifest in MDP frame body"); + + mdp.out.queue=OQ_ORDINARY; + mdp.out.payload_length=slot->prefix_length; + bcopy(slot->prefix,&mdp.out.payload[0],slot->prefix_length); + overlay_mdp_dispatch(&mdp,0 /* system generated */,NULL,0); DEBUGF("Set callback function, and set alarm"); diff --git a/serval.h b/serval.h index 8649f8e2..5be1ce15 100644 --- a/serval.h +++ b/serval.h @@ -765,4 +765,8 @@ void dump_stack(); int olsr_init_socket(void); int olsr_send(struct overlay_frame *frame); +void write_uint64(unsigned char *o,uint64_t v); +void write_uint16(unsigned char *o,uint16_t v); +void write_uint32(unsigned char *o,uint32_t v); + #endif // __SERVALD_SERVALD_H