]> git.proxmox.com Git - mirror_frr.git/blame - bgpd/rfapi/rfapi_nve_addr.c
Merge pull request #12798 from donaldsharp/rib_match_multicast
[mirror_frr.git] / bgpd / rfapi / rfapi_nve_addr.c
CommitLineData
acddc0ed 1// SPDX-License-Identifier: GPL-2.0-or-later
d62a17ae 2/*
65efcfce
LB
3 *
4 * Copyright 2009-2016, LabN Consulting, L.L.C.
5 *
65efcfce
LB
6 */
7
8
f8b6f499
LB
9#include "lib/zebra.h"
10#include "lib/prefix.h"
fe08ba7e 11#include "lib/agg_table.h"
f8b6f499
LB
12#include "lib/vty.h"
13#include "lib/memory.h"
14#include "lib/skiplist.h"
65efcfce
LB
15
16
f8b6f499 17#include "bgpd/bgpd.h"
65efcfce 18
f8b6f499
LB
19#include "bgpd/rfapi/bgp_rfapi_cfg.h"
20#include "bgpd/rfapi/rfapi.h"
21#include "bgpd/rfapi/rfapi_backend.h"
65efcfce 22
f8b6f499
LB
23#include "bgpd/rfapi/rfapi_import.h"
24#include "bgpd/rfapi/rfapi_private.h"
25#include "bgpd/rfapi/rfapi_nve_addr.h"
26#include "bgpd/rfapi/rfapi_vty.h"
a3b55c25 27#include "bgpd/rfapi/vnc_debug.h"
65efcfce
LB
28
29#define DEBUG_NVE_ADDR 0
30
d62a17ae 31void rfapiNveAddr2Str(struct rfapi_nve_addr *, char *, int);
65efcfce
LB
32
33
34#if DEBUG_NVE_ADDR
d62a17ae 35static void logdifferent(const char *tag, struct rfapi_nve_addr *a,
36 struct rfapi_nve_addr *b)
65efcfce 37{
d62a17ae 38 char a_str[BUFSIZ];
39 char b_str[BUFSIZ];
65efcfce 40
d62a17ae 41 rfapiNveAddr2Str(a, a_str, BUFSIZ);
42 rfapiNveAddr2Str(b, b_str, BUFSIZ);
43 vnc_zlog_debug_verbose("%s: [%s] [%s]", tag, a_str, b_str);
65efcfce
LB
44}
45#endif
46
47
1a4189d4 48int rfapi_nve_addr_cmp(const void *k1, const void *k2)
65efcfce 49{
1a4189d4
DS
50 const struct rfapi_nve_addr *a = (struct rfapi_nve_addr *)k1;
51 const struct rfapi_nve_addr *b = (struct rfapi_nve_addr *)k2;
d62a17ae 52 int ret = 0;
65efcfce 53
d62a17ae 54 if (!a || !b) {
65efcfce 55#if DEBUG_NVE_ADDR
d62a17ae 56 vnc_zlog_debug_verbose("%s: missing address a=%p b=%p",
57 __func__, a, b);
65efcfce 58#endif
d62a17ae 59 return (a - b);
60 }
61 if (a->un.addr_family != b->un.addr_family) {
65efcfce 62#if DEBUG_NVE_ADDR
d62a17ae 63 vnc_zlog_debug_verbose(
64 "diff: UN addr fam a->un.af=%d, b->un.af=%d",
65 a->un.addr_family, b->un.addr_family);
65efcfce 66#endif
d62a17ae 67 return (a->un.addr_family - b->un.addr_family);
68 }
69 if (a->un.addr_family == AF_INET) {
70 ret = IPV4_ADDR_CMP(&a->un.addr.v4, &b->un.addr.v4);
71 if (ret != 0) {
65efcfce 72#if DEBUG_NVE_ADDR
d62a17ae 73 logdifferent("diff: UN addr", a, b);
65efcfce 74#endif
d62a17ae 75 return ret;
76 }
77 } else if (a->un.addr_family == AF_INET6) {
78 ret = IPV6_ADDR_CMP(&a->un.addr.v6, &b->un.addr.v6);
79 if (ret == 0) {
65efcfce 80#if DEBUG_NVE_ADDR
d62a17ae 81 logdifferent("diff: UN addr", a, b);
65efcfce 82#endif
d62a17ae 83 return ret;
84 }
85 } else {
86 assert(0);
87 }
88 if (a->vn.addr_family != b->vn.addr_family) {
65efcfce 89#if DEBUG_NVE_ADDR
d62a17ae 90 vnc_zlog_debug_verbose(
91 "diff: pT addr fam a->vn.af=%d, b->vn.af=%d",
92 a->vn.addr_family, b->vn.addr_family);
65efcfce 93#endif
d62a17ae 94 return (a->vn.addr_family - b->vn.addr_family);
95 }
96 if (a->vn.addr_family == AF_INET) {
97 ret = IPV4_ADDR_CMP(&a->vn.addr.v4, &b->vn.addr.v4);
98 if (ret != 0) {
65efcfce 99#if DEBUG_NVE_ADDR
d62a17ae 100 logdifferent("diff: VN addr", a, b);
65efcfce 101#endif
d62a17ae 102 return ret;
103 }
104 } else if (a->vn.addr_family == AF_INET6) {
105 ret = IPV6_ADDR_CMP(&a->vn.addr.v6, &b->vn.addr.v6);
106 if (ret == 0) {
65efcfce 107#if DEBUG_NVE_ADDR
d62a17ae 108 logdifferent("diff: VN addr", a, b);
65efcfce 109#endif
d62a17ae 110 return ret;
111 }
112 } else {
113 assert(0);
114 }
115 return 0;
65efcfce
LB
116}
117
d62a17ae 118void rfapiNveAddr2Str(struct rfapi_nve_addr *na, char *buf, int bufsize)
65efcfce 119{
d62a17ae 120 char *p = buf;
121 int r;
65efcfce
LB
122
123#define REMAIN (bufsize - (p-buf))
124#define INCP {p += (r > REMAIN)? REMAIN: r;}
125
d62a17ae 126 if (bufsize < 1)
127 return;
65efcfce 128
d62a17ae 129 r = snprintf(p, REMAIN, "VN=");
130 INCP;
65efcfce 131
d62a17ae 132 if (!rfapiRfapiIpAddr2Str(&na->vn, p, REMAIN))
133 goto done;
65efcfce 134
d62a17ae 135 buf[bufsize - 1] = 0;
136 p = buf + strlen(buf);
65efcfce 137
d62a17ae 138 r = snprintf(p, REMAIN, ", UN=");
139 INCP;
65efcfce 140
d62a17ae 141 rfapiRfapiIpAddr2Str(&na->un, p, REMAIN);
65efcfce
LB
142
143done:
d62a17ae 144 buf[bufsize - 1] = 0;
65efcfce 145}