Coverage Report

Created: 2026-01-25 06:17

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/frr/bgpd/rfapi/rfapi_nve_addr.c
Line
Count
Source
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
0
{
50
0
  const struct rfapi_nve_addr *a = (struct rfapi_nve_addr *)k1;
51
0
  const struct rfapi_nve_addr *b = (struct rfapi_nve_addr *)k2;
52
0
  int ret = 0;
53
54
0
  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
0
    return (a - b);
60
0
  }
61
0
  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
0
    return (a->un.addr_family - b->un.addr_family);
68
0
  }
69
0
  if (a->un.addr_family == AF_INET) {
70
0
    ret = IPV4_ADDR_CMP(&a->un.addr.v4, &b->un.addr.v4);
71
0
    if (ret != 0) {
72
#if DEBUG_NVE_ADDR
73
      logdifferent("diff: UN addr", a, b);
74
#endif
75
0
      return ret;
76
0
    }
77
0
  } else if (a->un.addr_family == AF_INET6) {
78
0
    ret = IPV6_ADDR_CMP(&a->un.addr.v6, &b->un.addr.v6);
79
0
    if (ret == 0) {
80
#if DEBUG_NVE_ADDR
81
      logdifferent("diff: UN addr", a, b);
82
#endif
83
0
      return ret;
84
0
    }
85
0
  } else {
86
0
    assert(0);
87
0
  }
88
0
  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
0
    return (a->vn.addr_family - b->vn.addr_family);
95
0
  }
96
0
  if (a->vn.addr_family == AF_INET) {
97
0
    ret = IPV4_ADDR_CMP(&a->vn.addr.v4, &b->vn.addr.v4);
98
0
    if (ret != 0) {
99
#if DEBUG_NVE_ADDR
100
      logdifferent("diff: VN addr", a, b);
101
#endif
102
0
      return ret;
103
0
    }
104
0
  } else if (a->vn.addr_family == AF_INET6) {
105
0
    ret = IPV6_ADDR_CMP(&a->vn.addr.v6, &b->vn.addr.v6);
106
0
    if (ret == 0) {
107
#if DEBUG_NVE_ADDR
108
      logdifferent("diff: VN addr", a, b);
109
#endif
110
0
      return ret;
111
0
    }
112
0
  } else {
113
0
    assert(0);
114
0
  }
115
0
  return 0;
116
0
}
117
118
void rfapiNveAddr2Str(struct rfapi_nve_addr *na, char *buf, int bufsize)
119
0
{
120
0
  char *p = buf;
121
0
  int r;
122
123
0
#define REMAIN (bufsize - (p-buf))
124
0
#define INCP {p += (r > REMAIN)? REMAIN: r;}
125
126
0
  if (bufsize < 1)
127
0
    return;
128
129
0
  r = snprintf(p, REMAIN, "VN=");
130
0
  INCP;
131
132
0
  if (!rfapiRfapiIpAddr2Str(&na->vn, p, REMAIN))
133
0
    goto done;
134
135
0
  buf[bufsize - 1] = 0;
136
0
  p = buf + strlen(buf);
137
138
0
  r = snprintf(p, REMAIN, ", UN=");
139
0
  INCP;
140
141
0
  rfapiRfapiIpAddr2Str(&na->un, p, REMAIN);
142
143
0
done:
144
0
  buf[bufsize - 1] = 0;
145
0
}