]> git.proxmox.com Git - mirror_frr.git/blame - bgpd/rfapi/rfapi_nve_addr.c
*: always set SO_SNDBUF and SO_RCVBUF using a best effort approach
[mirror_frr.git] / bgpd / rfapi / rfapi_nve_addr.c
CommitLineData
65efcfce
LB
1/*
2 *
3 * Copyright 2009-2016, LabN Consulting, L.L.C.
4 *
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 *
20 */
21
22
f8b6f499
LB
23#include "lib/zebra.h"
24#include "lib/prefix.h"
25#include "lib/table.h"
26#include "lib/vty.h"
27#include "lib/memory.h"
28#include "lib/skiplist.h"
65efcfce
LB
29
30
f8b6f499 31#include "bgpd/bgpd.h"
65efcfce 32
f8b6f499
LB
33#include "bgpd/rfapi/bgp_rfapi_cfg.h"
34#include "bgpd/rfapi/rfapi.h"
35#include "bgpd/rfapi/rfapi_backend.h"
65efcfce 36
f8b6f499
LB
37#include "bgpd/rfapi/rfapi_import.h"
38#include "bgpd/rfapi/rfapi_private.h"
39#include "bgpd/rfapi/rfapi_nve_addr.h"
40#include "bgpd/rfapi/rfapi_vty.h"
65efcfce
LB
41
42#define DEBUG_NVE_ADDR 0
43
44void rfapiNveAddr2Str (struct rfapi_nve_addr *, char *, int);
45
46
47#if DEBUG_NVE_ADDR
48static void
49logdifferent (const char *tag,
50 struct rfapi_nve_addr *a, struct rfapi_nve_addr *b)
51{
52 char a_str[BUFSIZ];
53 char b_str[BUFSIZ];
54
55 rfapiNveAddr2Str (a, a_str, BUFSIZ);
56 rfapiNveAddr2Str (b, b_str, BUFSIZ);
57 zlog_debug ("%s: [%s] [%s]", tag, a_str, b_str);
58}
59#endif
60
61
62int
63rfapi_nve_addr_cmp (void *k1, void *k2)
64{
65 struct rfapi_nve_addr *a = (struct rfapi_nve_addr *) k1;
66 struct rfapi_nve_addr *b = (struct rfapi_nve_addr *) k2;
67 int ret = 0;
68
69 if (!a || !b)
70 {
71#if DEBUG_NVE_ADDR
72 zlog_debug ("%s: missing address a=%p b=%p", __func__, a, b);
73#endif
74 return (a - b);
75 }
76 if (a->un.addr_family != b->un.addr_family)
77 {
78#if DEBUG_NVE_ADDR
79 zlog_debug ("diff: UN addr fam a->un.af=%d, b->un.af=%d",
80 a->un.addr_family, b->un.addr_family);
81#endif
82 return (a->un.addr_family - b->un.addr_family);
83 }
84 if (a->un.addr_family == AF_INET)
85 {
86 ret = IPV4_ADDR_CMP (&a->un.addr.v4, &b->un.addr.v4);
87 if (ret != 0)
88 {
89#if DEBUG_NVE_ADDR
90 logdifferent ("diff: UN addr", a, b);
91#endif
92 return ret;
93 }
94 }
95 else if (a->un.addr_family == AF_INET6)
96 {
97 ret = IPV6_ADDR_CMP (&a->un.addr.v6, &b->un.addr.v6);
98 if (ret == 0)
99 {
100#if DEBUG_NVE_ADDR
101 logdifferent ("diff: UN addr", a, b);
102#endif
103 return ret;
104 }
105 }
106 else
107 {
108 assert (0);
109 }
110 if (a->vn.addr_family != b->vn.addr_family)
111 {
112#if DEBUG_NVE_ADDR
113 zlog_debug ("diff: pT addr fam a->vn.af=%d, b->vn.af=%d",
114 a->vn.addr_family, b->vn.addr_family);
115#endif
116 return (a->vn.addr_family - b->vn.addr_family);
117 }
118 if (a->vn.addr_family == AF_INET)
119 {
120 ret = IPV4_ADDR_CMP (&a->vn.addr.v4, &b->vn.addr.v4);
121 if (ret != 0)
122 {
123#if DEBUG_NVE_ADDR
124 logdifferent ("diff: VN addr", a, b);
125#endif
126 return ret;
127 }
128 }
129 else if (a->vn.addr_family == AF_INET6)
130 {
131 ret = IPV6_ADDR_CMP (&a->vn.addr.v6, &b->vn.addr.v6);
132 if (ret == 0)
133 {
134#if DEBUG_NVE_ADDR
135 logdifferent ("diff: VN addr", a, b);
136#endif
137 return ret;
138 }
139 }
140 else
141 {
142 assert (0);
143 }
144 return 0;
145}
146
147void
148rfapiNveAddr2Str (struct rfapi_nve_addr *na, char *buf, int bufsize)
149{
150 char *p = buf;
151 int r;
152
153#define REMAIN (bufsize - (p-buf))
154#define INCP {p += (r > REMAIN)? REMAIN: r;}
155
156 if (bufsize < 1)
157 return;
158
159 r = snprintf (p, REMAIN, "VN=");
160 INCP;
161
162 if (!rfapiRfapiIpAddr2Str (&na->vn, p, REMAIN))
163 goto done;
164
165 buf[bufsize - 1] = 0;
166 p = buf + strlen (buf);
167
168 r = snprintf (p, REMAIN, ", UN=");
169 INCP;
170
171 rfapiRfapiIpAddr2Str (&na->un, p, REMAIN);
172
173done:
174 buf[bufsize - 1] = 0;
175}