]> git.proxmox.com Git - mirror_frr.git/blob - bgpd/rfapi/rfapi_nve_addr.c
Merge pull request #12798 from donaldsharp/rib_match_multicast
[mirror_frr.git] / bgpd / rfapi / rfapi_nve_addr.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 *
4 * Copyright 2009-2016, LabN Consulting, L.L.C.
5 *
6 */
7
8
9 #include "lib/zebra.h"
10 #include "lib/prefix.h"
11 #include "lib/agg_table.h"
12 #include "lib/vty.h"
13 #include "lib/memory.h"
14 #include "lib/skiplist.h"
15
16
17 #include "bgpd/bgpd.h"
18
19 #include "bgpd/rfapi/bgp_rfapi_cfg.h"
20 #include "bgpd/rfapi/rfapi.h"
21 #include "bgpd/rfapi/rfapi_backend.h"
22
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"
27 #include "bgpd/rfapi/vnc_debug.h"
28
29 #define DEBUG_NVE_ADDR 0
30
31 void rfapiNveAddr2Str(struct rfapi_nve_addr *, char *, int);
32
33
34 #if DEBUG_NVE_ADDR
35 static void logdifferent(const char *tag, struct rfapi_nve_addr *a,
36 struct rfapi_nve_addr *b)
37 {
38 char a_str[BUFSIZ];
39 char b_str[BUFSIZ];
40
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);
44 }
45 #endif
46
47
48 int rfapi_nve_addr_cmp(const void *k1, const void *k2)
49 {
50 const struct rfapi_nve_addr *a = (struct rfapi_nve_addr *)k1;
51 const struct rfapi_nve_addr *b = (struct rfapi_nve_addr *)k2;
52 int ret = 0;
53
54 if (!a || !b) {
55 #if DEBUG_NVE_ADDR
56 vnc_zlog_debug_verbose("%s: missing address a=%p b=%p",
57 __func__, a, b);
58 #endif
59 return (a - b);
60 }
61 if (a->un.addr_family != b->un.addr_family) {
62 #if DEBUG_NVE_ADDR
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);
66 #endif
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) {
72 #if DEBUG_NVE_ADDR
73 logdifferent("diff: UN addr", a, b);
74 #endif
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) {
80 #if DEBUG_NVE_ADDR
81 logdifferent("diff: UN addr", a, b);
82 #endif
83 return ret;
84 }
85 } else {
86 assert(0);
87 }
88 if (a->vn.addr_family != b->vn.addr_family) {
89 #if DEBUG_NVE_ADDR
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);
93 #endif
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) {
99 #if DEBUG_NVE_ADDR
100 logdifferent("diff: VN addr", a, b);
101 #endif
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) {
107 #if DEBUG_NVE_ADDR
108 logdifferent("diff: VN addr", a, b);
109 #endif
110 return ret;
111 }
112 } else {
113 assert(0);
114 }
115 return 0;
116 }
117
118 void rfapiNveAddr2Str(struct rfapi_nve_addr *na, char *buf, int bufsize)
119 {
120 char *p = buf;
121 int r;
122
123 #define REMAIN (bufsize - (p-buf))
124 #define INCP {p += (r > REMAIN)? REMAIN: r;}
125
126 if (bufsize < 1)
127 return;
128
129 r = snprintf(p, REMAIN, "VN=");
130 INCP;
131
132 if (!rfapiRfapiIpAddr2Str(&na->vn, p, REMAIN))
133 goto done;
134
135 buf[bufsize - 1] = 0;
136 p = buf + strlen(buf);
137
138 r = snprintf(p, REMAIN, ", UN=");
139 INCP;
140
141 rfapiRfapiIpAddr2Str(&na->un, p, REMAIN);
142
143 done:
144 buf[bufsize - 1] = 0;
145 }