summaryrefslogtreecommitdiffstats
path: root/zebra/rt.h
blob: 6f4dd48a54cd0d85ee45dbc3c7ffebc48507d191 (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
/*
 * kernel routing table update prototype.
 * Copyright (C) 1998 Kunihiro Ishiguro
 *
 * This file is part of GNU Zebra.
 *
 * GNU Zebra 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, or (at your option) any
 * later version.
 *
 * GNU Zebra 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
 */

#ifndef _ZEBRA_RT_H
#define _ZEBRA_RT_H

#include "prefix.h"
#include "if.h"
#include "vlan.h"
#include "vxlan.h"
#include "zebra/rib.h"
#include "zebra/zebra_ns.h"
#include "zebra/zebra_mpls.h"
#include "zebra/zebra_dplane.h"

#ifdef __cplusplus
extern "C" {
#endif

#define ROUTE_INSTALLATION_METRIC 20

#define RKERNEL_ROUTE(type) ((type) == ZEBRA_ROUTE_KERNEL)

#define RSYSTEM_ROUTE(type)                                                    \
	((RKERNEL_ROUTE(type)) || (type) == ZEBRA_ROUTE_CONNECT)

#ifndef HAVE_NETLINK
/*
 * Update or delete a route, nexthop, LSP, pseudowire, or vxlan MAC from the
 * kernel, using info from a dataplane context.
 */
extern enum zebra_dplane_result kernel_route_update(
	struct zebra_dplane_ctx *ctx);

extern enum zebra_dplane_result
kernel_nexthop_update(struct zebra_dplane_ctx *ctx);

extern enum zebra_dplane_result kernel_lsp_update(
	struct zebra_dplane_ctx *ctx);

enum zebra_dplane_result kernel_pw_update(struct zebra_dplane_ctx *ctx);

enum zebra_dplane_result kernel_address_update_ctx(
	struct zebra_dplane_ctx *ctx);

enum zebra_dplane_result kernel_mac_update_ctx(struct zebra_dplane_ctx *ctx);

enum zebra_dplane_result kernel_neigh_update_ctx(struct zebra_dplane_ctx *ctx);

extern enum zebra_dplane_result
kernel_pbr_rule_update(struct zebra_dplane_ctx *ctx);

extern enum zebra_dplane_result
kernel_intf_update(struct zebra_dplane_ctx *ctx);

extern enum zebra_dplane_result
kernel_intf_netconf_update(struct zebra_dplane_ctx *ctx);
extern enum zebra_dplane_result kernel_tc_update(struct zebra_dplane_ctx *ctx);

#endif /* !HAVE_NETLINK */

extern int kernel_neigh_update(int cmd, int ifindex, void *addr, char *lla,
			       int llalen, ns_id_t ns_id, uint8_t family,
			       bool permanent);
extern int kernel_neigh_register(vrf_id_t vrf_id, struct zserv *client,
				 bool reg);
extern int kernel_interface_set_master(struct interface *master,
				       struct interface *slave);

extern int mpls_kernel_init(void);

/* Global init and deinit for platform-/OS-specific things */
void kernel_router_init(void);
void kernel_router_terminate(void);

extern uint32_t kernel_get_speed(struct interface *ifp, int *error);
extern int kernel_get_ipmr_sg_stats(struct zebra_vrf *zvrf, void *mroute);

/*
 * Southbound Initialization routines to get initial starting
 * state.
 */
extern void interface_list(struct zebra_ns *zns);
extern void kernel_init(struct zebra_ns *zns);
extern void kernel_terminate(struct zebra_ns *zns, bool complete);
extern void macfdb_read(struct zebra_ns *zns);
extern void macfdb_read_for_bridge(struct zebra_ns *zns, struct interface *ifp,
				   struct interface *br_if);
extern void macfdb_read_specific_mac(struct zebra_ns *zns,
				     struct interface *br_if,
				     const struct ethaddr *mac, vlanid_t vid);
extern void neigh_read(struct zebra_ns *zns);
extern void neigh_read_for_vlan(struct zebra_ns *zns, struct interface *ifp);
extern void neigh_read_specific_ip(const struct ipaddr *ip,
				   struct interface *vlan_if);
extern void route_read(struct zebra_ns *zns);
extern int kernel_upd_mac_nh(uint32_t nh_id, struct in_addr vtep_ip);
extern int kernel_del_mac_nh(uint32_t nh_id);
extern int kernel_upd_mac_nhg(uint32_t nhg_id, uint32_t nh_cnt,
		struct nh_grp *nh_ids);
extern int kernel_del_mac_nhg(uint32_t nhg_id);

/*
 * Message batching interface.
 */
extern void kernel_update_multi(struct dplane_ctx_list_head *ctx_list);

/*
 * Called by the dplane pthread to read incoming OS messages and dispatch them.
 */
int kernel_dplane_read(struct zebra_dplane_info *info);

#ifdef __cplusplus
}
#endif

#endif /* _ZEBRA_RT_H */