aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet/ip-neighbor/ip_neighbor_types.h
blob: d7e818ba2528957a00942833cb6487deb8ae9746 (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
/*
 * ip_neighbor.h: ip neighbor generic services
 *
 * Copyright (c) 2018 Cisco and/or its affiliates.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef __INCLUDE_IP_NEIGHBOR_TYPES_H__
#define __INCLUDE_IP_NEIGHBOR_TYPES_H__

#include <vnet/ip/ip_types.h>
#include <vnet/ethernet/mac_address.h>
#include <vnet/fib/fib_types.h>

#define foreach_ip_neighbor_flag                 \
  _(STATIC, 1 << 0, "static", "S")               \
  _(DYNAMIC, 1 << 1, "dynamic", "D")             \
  _(NO_FIB_ENTRY, 1 << 2, "no-fib-entry", "N")   \
  _(PENDING, 1 << 3, "pending", "P")             \
  _(STALE, 1 << 4, "stale", "A")                 \

typedef enum ip_neighbor_flags_t_
{
  IP_NEIGHBOR_FLAG_NONE = 0,
#define _(a,b,c,d) IP_NEIGHBOR_FLAG_##a = b,
  foreach_ip_neighbor_flag
#undef _
} __clib_packed ip_neighbor_flags_t;

typedef struct ip_neighbor_watcher_t_
{
  u32 ipw_pid;
  u32 ipw_client;
  int ipw_api_version;
} ip_neighbor_watcher_t;

extern u8 *format_ip_neighbor_watcher (u8 * s, va_list * args);

typedef struct ip_neighbor_key_t_
{
  ip_address_t ipnk_ip;
  u8 __pad[3];
  u32 ipnk_sw_if_index;
} __clib_packed ip_neighbor_key_t;

/**
 * A representation of an IP neighbour/peer
 */
typedef struct ip_neighbor_t_
{
  /**
   * The idempotent key
   */
  ip_neighbor_key_t *ipn_key;

  /**
   * The learned MAC address of the neighbour
   */
  mac_address_t ipn_mac;

  /**
   * Falgs for this object
   */
  ip_neighbor_flags_t ipn_flags;

  /**
   * Aging related data
   *  - last time the neighbour was probed
   *  - number of probes - 3 and it's dead
   */
  f64 ipn_time_last_updated;
  u8 ipn_n_probes;
  index_t ipn_elt;

  /**
   * The index of the adj fib created for this neighbour
   */
  fib_node_index_t ipn_fib_entry_index;
} ip_neighbor_t;

extern u8 *format_ip_neighbor_flags (u8 * s, va_list * args);
extern u8 *format_ip_neighbor_key (u8 * s, va_list * args);
extern u8 *format_ip_neighbor (u8 * s, va_list * args);

extern ip_neighbor_t *ip_neighbor_get (index_t ipni);

typedef struct ip_neighbor_learn_t_
{
  ip_address_t ip;
  mac_address_t mac;
  u32 sw_if_index;
} ip_neighbor_learn_t;


typedef enum ip_neighbor_event_flags_t_
{
  IP_NEIGHBOR_EVENT_ADDED = (1 << 0),
  IP_NEIGHBOR_EVENT_REMOVED = (1 << 1),
} ip_neighbor_event_flags_t;

typedef struct ip_neighbor_event_t_
{
  ip_neighbor_watcher_t ipne_watch;
  ip_neighbor_event_flags_t ipne_flags;
  ip_neighbor_t ipne_nbr;
} ip_neighbor_event_t;

extern void ip_neighbor_clone (const ip_neighbor_t * ipn,
			       ip_neighbor_t * clone);

extern void ip_neighbor_free (ip_neighbor_t * ipn);

/**
 * Keep RX and TX counts per-AF
 */
#define foreach_ip_neighbor_counter_type                                      \
  _ (REPLY, "reply")                                                          \
  _ (REQUEST, "request")                                                      \
  _ (GRAT, "gratuitous")

typedef enum ip_neighbor_counter_type_t_
{
#define _(a, b) IP_NEIGHBOR_CTR_##a,
  foreach_ip_neighbor_counter_type
#undef _
} ip_neighbor_counter_type_t;

#define N_IP_NEIGHBOR_CTRS (IP_NEIGHBOR_CTR_GRAT + 1)

#define FOREACH_IP_NEIGHBOR_CTR(_type)                                        \
  for (_type = 0; _type < N_IP_NEIGHBOR_CTRS; _type++)

typedef struct ip_neighbor_counters_t_
{
  vlib_simple_counter_main_t ipnc[VLIB_N_DIR][N_IP_NEIGHBOR_CTRS];
} ip_neighbor_counters_t;

extern u8 *format_ip_neighbor_counters (u8 *s, va_list *args);

extern void ip_neighbor_alloc_ctr (ip_neighbor_counters_t *ctr,
				   u32 sw_if_index);

extern ip_neighbor_counters_t ip_neighbor_counters[N_AF];

#endif /* __INCLUDE_IP_NEIGHBOR_H__ */

/*
 * fd.io coding-style-patch-verification: ON
 *
 * Local Variables:
 * eval: (c-set-style "gnu")
 * End:
 */