summaryrefslogtreecommitdiffstats
path: root/zebra/rt_netlink.h
blob: d51944f1a46235d8d28fd3383289baa745d4cff4 (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
// SPDX-License-Identifier: GPL-2.0-or-later
/* Header file exported by rt_netlink.c to zebra.
 * Copyright (C) 1997, 98, 99 Kunihiro Ishiguro
 */

#ifndef _ZEBRA_RT_NETLINK_H
#define _ZEBRA_RT_NETLINK_H

#ifdef HAVE_NETLINK

#include "zebra/zebra_mpls.h"
#include "zebra/zebra_dplane.h"

#ifdef __cplusplus
extern "C" {
#endif


/*
 * Additional protocol strings to push into routes
 * If we add anything new here please make sure
 * to update:
 * zebra2proto                 Function
 * proto2zebra                 Function
 * is_selfroute                Function
 * tools/frr                   To flush the route upon exit
 *
 * Finally update this file to allow iproute2 to
 * know about this new route.
 * tools/etc/iproute2/rt_protos.d
 */
#define RTPROT_BGP         186
#define RTPROT_ISIS        187
#define RTPROT_OSPF        188
#define RTPROT_RIP         189
#define RTPROT_RIPNG       190
#if !defined(RTPROT_BABEL)
#define RTPROT_BABEL        42
#endif
#define RTPROT_NHRP        191
#define RTPROT_EIGRP       192
#define RTPROT_LDP         193
#define RTPROT_SHARP       194
#define RTPROT_PBR         195
#define RTPROT_ZSTATIC     196
#define RTPROT_OPENFABRIC  197
#define RTPROT_SRTE        198

void rt_netlink_init(void);

/* MPLS label forwarding table change, using dataplane context information. */
extern ssize_t netlink_mpls_multipath_msg_encode(int cmd,
						 struct zebra_dplane_ctx *ctx,
						 void *buf, size_t buflen);

extern ssize_t netlink_route_multipath_msg_encode(int cmd,
						  struct zebra_dplane_ctx *ctx,
						  uint8_t *data, size_t datalen,
						  bool fpm, bool force_nhg,
						  bool force_rr);
extern ssize_t netlink_macfdb_update_ctx(struct zebra_dplane_ctx *ctx,
					 void *data, size_t datalen);

extern int netlink_route_change(struct nlmsghdr *h, ns_id_t ns_id, int startup);
extern int netlink_route_read(struct zebra_ns *zns);

extern int netlink_nexthop_change(struct nlmsghdr *h, ns_id_t ns_id,
				  int startup);
extern int netlink_nexthop_read(struct zebra_ns *zns);
extern ssize_t netlink_nexthop_msg_encode(uint16_t cmd,
					  const struct zebra_dplane_ctx *ctx,
					  void *buf, size_t buflen, bool fpm);

extern ssize_t netlink_lsp_msg_encoder(struct zebra_dplane_ctx *ctx, void *buf,
				       size_t buflen);

extern int netlink_neigh_change(struct nlmsghdr *h, ns_id_t ns_id);
extern int netlink_macfdb_read(struct zebra_ns *zns);
extern int netlink_macfdb_read_for_bridge(struct zebra_ns *zns,
					  struct interface *ifp,
					  struct interface *br_if,
					  vlanid_t vid);
extern int netlink_macfdb_read_mcast_for_vni(struct zebra_ns *zns,
					     struct interface *ifp, vni_t vni);
extern int netlink_neigh_read(struct zebra_ns *zns);
extern int netlink_neigh_read_for_vlan(struct zebra_ns *zns,
				       struct interface *vlan_if);
extern int netlink_macfdb_read_specific_mac(struct zebra_ns *zns,
					    struct interface *br_if,
					    const struct ethaddr *mac,
					    uint16_t vid);
extern int netlink_neigh_read_specific_ip(const struct ipaddr *ip,
					  struct interface *vlan_if);

struct nl_batch;
extern enum netlink_msg_status
netlink_put_route_update_msg(struct nl_batch *bth,
			     struct zebra_dplane_ctx *ctx);
extern enum netlink_msg_status
netlink_put_nexthop_update_msg(struct nl_batch *bth,
			       struct zebra_dplane_ctx *ctx);
extern enum netlink_msg_status
netlink_put_mac_update_msg(struct nl_batch *bth, struct zebra_dplane_ctx *ctx);
extern enum netlink_msg_status
netlink_put_neigh_update_msg(struct nl_batch *bth,
			     struct zebra_dplane_ctx *ctx);
extern enum netlink_msg_status
netlink_put_lsp_update_msg(struct nl_batch *bth, struct zebra_dplane_ctx *ctx);
extern enum netlink_msg_status
netlink_put_pw_update_msg(struct nl_batch *bth, struct zebra_dplane_ctx *ctx);

int netlink_route_change_read_unicast_internal(struct nlmsghdr *h,
					       ns_id_t ns_id, int startup,
					       struct zebra_dplane_ctx *ctx);

#ifdef NETLINK_DEBUG
const char *nlmsg_type2str(uint16_t type);
const char *af_type2str(int type);
const char *ifi_type2str(int type);
const char *rta_type2str(int type);
const char *rtm_type2str(int type);
const char *ifla_pdr_type2str(int type);
const char *ifla_info_type2str(int type);
const char *rtm_protocol2str(int type);
const char *rtm_scope2str(int type);
const char *rtm_rta2str(int type);
const char *neigh_rta2str(int type);
const char *ifa_rta2str(int type);
const char *nhm_rta2str(int type);
const char *frh_rta2str(int type);
const char *frh_action2str(uint8_t action);
const char *nlmsg_flags2str(uint16_t flags, char *buf, size_t buflen);
const char *if_flags2str(uint32_t flags, char *buf, size_t buflen);
const char *rtm_flags2str(uint32_t flags, char *buf, size_t buflen);
const char *neigh_state2str(uint32_t flags, char *buf, size_t buflen);
const char *neigh_flags2str(uint32_t flags, char *buf, size_t buflen);
const char *ifa_flags2str(uint32_t flags, char *buf, size_t buflen);
const char *nh_flags2str(uint32_t flags, char *buf, size_t buflen);

void nl_dump(void *msg, size_t msglen);

extern int zebra2proto(int proto);

#endif /* NETLINK_DEBUG */

#ifdef __cplusplus
}
#endif

#endif /* HAVE_NETLINK */

#endif /* _ZEBRA_RT_NETLINK_H */