aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/gbp/gbp_bridge_domain.h
blob: 0449240083c77b2ce60d95feac83aecf2f504949 (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
/*
 * 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 __GBP_BRIDGE_DOMAIN_H__
#define __GBP_BRIDGE_DOMAIN_H__

#include <plugins/gbp/gbp_types.h>
#include <plugins/gbp/gbp_itf.h>

#include <vnet/fib/fib_types.h>
#include <vnet/l2/l2_bd.h>

/**
 * Bridge Domain Flags
 */
typedef enum gbp_bridge_domain_flags_t_
{
  GBP_BD_FLAG_NONE = 0,
  GBP_BD_FLAG_DO_NOT_LEARN = (1 << 0),
  GBP_BD_FLAG_UU_FWD_DROP = (1 << 1),
  GBP_BD_FLAG_MCAST_DROP = (1 << 2),
  GBP_BD_FLAG_UCAST_ARP = (1 << 3),
} gbp_bridge_domain_flags_t;

/**
 * A bridge Domain Representation.
 * This is a standard bridge-domain plus all the attributes it must
 * have to supprt the GBP model.
 */
typedef struct gbp_bridge_domain_t_
{
  /**
   * Bridge-domain ID
   */
  u32 gb_bd_id;
  u32 gb_bd_index;

  /**
   * Index of the Route-domain this BD is associated with. This is used as the
   * 'scope' of the packets for contract matching.
   */
  u32 gb_rdi;

  /**
   * Flags conttrolling behaviour
   */
  gbp_bridge_domain_flags_t gb_flags;

  /**
   * The BD's BVI interface (obligatory)
   */
  u32 gb_bvi_sw_if_index;

  /**
   * The BD's MAC spine-proxy interface (optional)
   */
  u32 gb_uu_fwd_sw_if_index;

  /**
   * The BD's interface to sned Broadcast and multicast packets
   */
  gbp_itf_hdl_t gb_bm_flood_itf;

  /**
   * The index of the BD's VNI interface on which packets from
   * unkown endpoints arrive
   */
  u32 gb_vni;

  /**
   * locks/references to the BD so it does not get deleted (from the API)
   * whilst it is still being used
   */
  u32 gb_locks;
} gbp_bridge_domain_t;

extern void gbp_bridge_domain_itf_add (index_t gbdi,
				       u32 sw_if_index,
				       l2_bd_port_type_t type);
extern void gbp_bridge_domain_itf_del (index_t gbdi,
				       u32 sw_if_index,
				       l2_bd_port_type_t type);

extern int gbp_bridge_domain_add_and_lock (u32 bd_id,
					   u32 rd_id,
					   gbp_bridge_domain_flags_t flags,
					   u32 bvi_sw_if_index,
					   u32 uu_fwd_sw_if_index,
					   u32 bm_flood_sw_if_index);

extern void gbp_bridge_domain_unlock (index_t gbi);
extern index_t gbp_bridge_domain_find_and_lock (u32 bd_id);
extern int gbp_bridge_domain_delete (u32 bd_id);
extern index_t gbp_bridge_domain_index (const gbp_bridge_domain_t *);
extern u32 gbp_bridge_domain_get_bd_id (index_t gbdi);

typedef int (*gbp_bridge_domain_cb_t) (gbp_bridge_domain_t * gb, void *ctx);
extern void gbp_bridge_domain_walk (gbp_bridge_domain_cb_t bgpe, void *ctx);

extern u8 *format_gbp_bridge_domain (u8 * s, va_list * args);
extern u8 *format_gbp_bridge_domain_flags (u8 * s, va_list * args);

/**
 * DB of bridge_domains
 */
typedef struct gbp_bridge_domain_db_t
{
  uword *gbd_by_bd_id;
  index_t *gbd_by_bd_index;
} gbp_bridge_domain_db_t;

extern gbp_bridge_domain_db_t gbp_bridge_domain_db;
extern gbp_bridge_domain_t *gbp_bridge_domain_pool;

always_inline gbp_bridge_domain_t *
gbp_bridge_domain_get (index_t i)
{
  return (pool_elt_at_index (gbp_bridge_domain_pool, i));
}

always_inline gbp_bridge_domain_t *
gbp_bridge_domain_get_by_bd_index (u32 bd_index)
{
  return (gbp_bridge_domain_get
	  (gbp_bridge_domain_db.gbd_by_bd_index[bd_index]));
}

extern gbp_scope_t *gbp_scope_by_bd_index;

always_inline gbp_scope_t
gbp_bridge_domain_get_scope (u32 bd_index)
{
  return (gbp_scope_by_bd_index[bd_index]);
}

#endif

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