mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-13 17:40:04 +00:00
nhrpd: copy NAT extension if present else attempt to populate
Signed-off-by: Reuben Dowle <reuben.dowle@4rf.com>
This commit is contained in:
parent
9c292647a9
commit
1bd508da17
@ -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:
|
||||||
|
Loading…
Reference in New Issue
Block a user