nhrpd: copy NAT extension if present else attempt to populate

Signed-off-by: Reuben Dowle <reuben.dowle@4rf.com>
This commit is contained in:
Amol Lad 2021-02-26 13:30:34 +05:30 committed by Reuben Dowle
parent 9c292647a9
commit 1bd508da17

View File

@ -966,32 +966,37 @@ static void nhrp_peer_forward(struct nhrp_peer *p,
} }
break; break;
case NHRP_EXTENSION_NAT_ADDRESS: case NHRP_EXTENSION_NAT_ADDRESS:
if(packet_types[hdr->type].type == PACKET_REQUEST) { /* if NAT extension is not empty then copy it across else attempt to populate it */
debugf(NHRP_DEBUG_COMMON,"Processing NHRP_EXTENSION_NAT_ADDRESS while forwarding the request packet"); if (len > 0) {
proto = &pp->src_proto; zbuf_copy(zb, &extpl, len);
} else if(packet_types[hdr->type].type == PACKET_REPLY) { } else {
debugf(NHRP_DEBUG_COMMON,"Processing NHRP_EXTENSION_NAT_ADDRESS while forwarding the reply packet"); if(packet_types[hdr->type].type == PACKET_REQUEST) {
/* For reply packet use protocol specified in CIE of mandatory part for cache lookup */ debugf(NHRP_DEBUG_COMMON,"Processing NHRP_EXTENSION_NAT_ADDRESS while forwarding the request packet");
if(sockunion_family(&cie_protocol_mandatory) != AF_UNSPEC) proto = &pp->src_proto;
proto = &cie_protocol_mandatory; } else if(packet_types[hdr->type].type == PACKET_REPLY) {
} debugf(NHRP_DEBUG_COMMON,"Processing NHRP_EXTENSION_NAT_ADDRESS while forwarding the reply packet");
/* For reply packet use protocol specified in CIE of mandatory part for cache lookup */
if(sockunion_family(&cie_protocol_mandatory) != AF_UNSPEC)
proto = &cie_protocol_mandatory;
}
if(proto) { if(proto) {
debugf(NHRP_DEBUG_COMMON,"Proto is %s", sockunion2str(proto, buf, sizeof(buf))); debugf(NHRP_DEBUG_COMMON,"Proto is %s", sockunion2str(proto, buf, sizeof(buf)));
c = nhrp_cache_get(nifp->ifp, proto, 0); c = nhrp_cache_get(nifp->ifp, proto, 0);
if(c) { if(c) {
debugf(NHRP_DEBUG_COMMON,"c->cur.remote_nbma_natoa is %s", sockunion2str(&c->cur.remote_nbma_natoa, buf, sizeof(buf)) ? buf : "NULL"); debugf(NHRP_DEBUG_COMMON,"c->cur.remote_nbma_natoa is %s", sockunion2str(&c->cur.remote_nbma_natoa, buf, sizeof(buf)) ? buf : "NULL");
if (sockunion_family(&c->cur.remote_nbma_natoa) != AF_UNSPEC) { if (sockunion_family(&c->cur.remote_nbma_natoa) != AF_UNSPEC) {
cie = nhrp_cie_push(zb, NHRP_CODE_SUCCESS,&c->cur.remote_nbma_natoa, proto); cie = nhrp_cie_push(zb, NHRP_CODE_SUCCESS,&c->cur.remote_nbma_natoa, proto);
if (!cie) if (!cie)
goto err; goto err;
}
} else {
debugf(NHRP_DEBUG_COMMON,"No cache entry for Proto is %s", sockunion2str(proto, buf, sizeof(buf)));
zbuf_put(zb, extpl.head, len);
} }
} else { } else {
debugf(NHRP_DEBUG_COMMON,"No cache entry for Proto is %s", sockunion2str(proto, buf, sizeof(buf)));
zbuf_put(zb, extpl.head, len); zbuf_put(zb, extpl.head, len);
} }
} else {
zbuf_put(zb, extpl.head, len);
} }
break; break;
default: default: