summaryrefslogtreecommitdiffstats
path: root/bgpd/rfapi/rfapi_rib.h
blob: 40e4c0c2f2b52e892266c89dedc1f3ba6c1045cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
/* 
 *
 * Copyright 2009-2016, LabN Consulting, L.L.C.
 *
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; see the file COPYING; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */

/*
 * File:	rfapi_rib.h
 * Purpose:	per-nve rib
 */

#ifndef QUAGGA_HGP_RFAPI_RIB_H
#define QUAGGA_HGP_RFAPI_RIB_H

/*
 * Key for indexing RIB and Pending RIB skiplists. For L3 RIBs,
 * the VN address is sufficient because it represents the actual next hop.
 *
 * For L2 RIBs, it is possible to have multiple routes to a given L2
 * prefix via a given VN address, but each route having a unique aux_prefix.
 */
struct rfapi_rib_key
{
  struct prefix		vn;
  struct prefix_rd	rd;

  /*
   * for L2 routes: optional IP addr
   * .family == 0 means "none"
   */
  struct prefix aux_prefix;
};
#include "rfapi.h"

/*
 * RFAPI Advertisement Data Block
 *
 * Holds NVE prefix advertisement information
 */
struct rfapi_adb
{
  union {
    struct {
      struct prefix		prefix_ip;
      struct prefix_rd		prd;
      struct prefix		prefix_eth;
    } s;                                        /* mainly for legacy use */
    struct rfapi_rib_key        key;
  } u;
  uint32_t			lifetime;
  uint8_t			cost;
  struct rfapi_l2address_option	l2o;
};

struct rfapi_info
{
  struct rfapi_rib_key		rk;		/* NVE VN addr + aux addr */
  struct prefix			un;
  uint8_t			cost;
  uint32_t			lifetime;
  time_t			last_sent_time;
  uint32_t			rsp_counter;	/* dedup initial responses */
  struct bgp_tea_options	*tea_options;
  struct rfapi_un_option	*un_options;
  struct rfapi_vn_option	*vn_options;
  struct thread		*timer;
};

/*
 * Work item for updated responses queue
 */
struct rfapi_updated_responses_queue
{
  struct rfapi_descriptor	*rfd;
  afi_t				afi;
};


extern void
rfapiRibClear (struct rfapi_descriptor *rfd);

extern void
rfapiRibFree (struct rfapi_descriptor *rfd);

extern void
rfapiRibUpdatePendingNode (
  struct bgp			*bgp,
  struct rfapi_descriptor	*rfd,
  struct rfapi_import_table	*it,
  struct route_node		*it_node,
  uint32_t			lifetime);

extern void
rfapiRibUpdatePendingNodeSubtree (
  struct bgp			*bgp,
  struct rfapi_descriptor	*rfd,
  struct rfapi_import_table	*it,
  struct route_node		*it_node,
  struct route_node		*omit_subtree,
  uint32_t			lifetime);

extern int
rfapiRibPreloadBi(
  struct route_node *rfd_rib_node,
  struct prefix     *pfx_vn,
  struct prefix     *pfx_un,
  uint32_t          lifetime,
  struct bgp_info   *bi);

extern struct rfapi_next_hop_entry *
rfapiRibPreload (
  struct bgp			*bgp,
  struct rfapi_descriptor	*rfd,
  struct rfapi_next_hop_entry	*response,
  int				use_eth_resolution);

extern void
rfapiRibPendingDeleteRoute (
  struct bgp			*bgp,
  struct rfapi_import_table	*it,
  afi_t				afi,
  struct route_node		*it_node);

extern void
rfapiRibShowResponsesSummary (void *stream);

extern void
rfapiRibShowResponsesSummaryClear (void);

extern void
rfapiRibShowResponses (
  void		*stream,
  struct prefix	*pfx_match,
  int		show_removed);

extern int
rfapiRibFTDFilterRecentPrefix(
  struct rfapi_descriptor	*rfd,
  struct route_node             *it_rn,                /* import table node */
  struct prefix                 *pfx_target_original); /* query target */

extern void
rfapiFreeRfapiUnOptionChain (struct rfapi_un_option *p);

extern void
rfapiFreeRfapiVnOptionChain (struct rfapi_vn_option *p);

extern void
rfapiRibCheckCounts (
  int		checkstats,	/* validate rfd & global counts */
  unsigned int	offset);	/* number of ri's held separately */

/* enable for debugging; disable for performance */
#if 0
#define RFAPI_RIB_CHECK_COUNTS(checkstats, offset)	rfapiRibCheckCounts(checkstats, offset)
#else
#define RFAPI_RIB_CHECK_COUNTS(checkstats, offset)
#endif

extern void
rfapi_rib_key_init (struct prefix        *prefix, /* may be NULL */
                    struct prefix_rd     *rd,     /* may be NULL */
                    struct prefix        *aux,    /* may be NULL */
                    struct rfapi_rib_key *rk);

extern int
rfapi_rib_key_cmp (void *k1, void *k2);

extern void
rfapiAdbFree (struct rfapi_adb *adb);

#endif /* QUAGGA_HGP_RFAPI_RIB_H */