diff options
author | Amol Lad <amol.lad@4rf.com> | 2021-02-26 09:00:34 +0100 |
---|---|---|
committer | Reuben Dowle <reuben.dowle@4rf.com> | 2021-03-18 04:35:41 +0100 |
commit | 1bd508da172483f24c86747ffb4831d79bd65b4a (patch) | |
tree | 5b6a5c42cc2dc3fd1f6e3b172ee10d6575cf7c27 /nhrpd/nhrp_peer.c | |
parent | nhrpd: parse multiple CIEs in NAT extension header (diff) | |
download | frr-1bd508da172483f24c86747ffb4831d79bd65b4a.tar.xz frr-1bd508da172483f24c86747ffb4831d79bd65b4a.zip |
nhrpd: copy NAT extension if present else attempt to populate
Signed-off-by: Reuben Dowle <reuben.dowle@4rf.com>
Diffstat (limited to '')
-rw-r--r-- | nhrpd/nhrp_peer.c | 47 |
1 files changed, 26 insertions, 21 deletions
diff --git a/nhrpd/nhrp_peer.c b/nhrpd/nhrp_peer.c index 3395a685e..86e52be17 100644 --- a/nhrpd/nhrp_peer.c +++ b/nhrpd/nhrp_peer.c @@ -966,32 +966,37 @@ static void nhrp_peer_forward(struct nhrp_peer *p, } break; case NHRP_EXTENSION_NAT_ADDRESS: - if(packet_types[hdr->type].type == PACKET_REQUEST) { - debugf(NHRP_DEBUG_COMMON,"Processing NHRP_EXTENSION_NAT_ADDRESS while forwarding the request packet"); - proto = &pp->src_proto; - } 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 NAT extension is not empty then copy it across else attempt to populate it */ + if (len > 0) { + zbuf_copy(zb, &extpl, len); + } else { + if(packet_types[hdr->type].type == PACKET_REQUEST) { + debugf(NHRP_DEBUG_COMMON,"Processing NHRP_EXTENSION_NAT_ADDRESS while forwarding the request packet"); + proto = &pp->src_proto; + } 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) { - debugf(NHRP_DEBUG_COMMON,"Proto is %s", sockunion2str(proto, buf, sizeof(buf))); - c = nhrp_cache_get(nifp->ifp, proto, 0); - if(c) { - 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) { - cie = nhrp_cie_push(zb, NHRP_CODE_SUCCESS,&c->cur.remote_nbma_natoa, proto); - if (!cie) - goto err; + if(proto) { + debugf(NHRP_DEBUG_COMMON,"Proto is %s", sockunion2str(proto, buf, sizeof(buf))); + c = nhrp_cache_get(nifp->ifp, proto, 0); + if(c) { + 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) { + cie = nhrp_cie_push(zb, NHRP_CODE_SUCCESS,&c->cur.remote_nbma_natoa, proto); + if (!cie) + 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 { - debugf(NHRP_DEBUG_COMMON,"No cache entry for Proto is %s", sockunion2str(proto, buf, sizeof(buf))); zbuf_put(zb, extpl.head, len); } - } else { - zbuf_put(zb, extpl.head, len); } break; default: |