Merge tag 'upstream/1.2.4'
[quagga-debian.git] / lib / zclient.h
1 /* Zebra's client header.
2  * Copyright (C) 1999 Kunihiro Ishiguro
3  *
4  * This file is part of GNU Zebra.
5  *
6  * GNU Zebra is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2, or (at your option)
9  * any later version.
10  * 
11  * GNU Zebra is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * General Public License for more details.
15  * 
16  * You should have received a copy of the GNU General Public License
17  * along with GNU Zebra; see the file COPYING.  If not, write to the
18  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  */
21
22 #ifndef _ZEBRA_ZCLIENT_H
23 #define _ZEBRA_ZCLIENT_H
24
25 /* For struct zapi_ipv{4,6}. */
26 #include "prefix.h"
27
28 /* For struct interface and struct connected. */
29 #include "if.h"
30
31 /* For vrf_bitmap_t. */
32 #include "vrf.h"
33
34 /* For input/output buffer to zebra. */
35 #define ZEBRA_MAX_PACKET_SIZ          4096
36
37 /* Zebra header size. */
38 #define ZEBRA_HEADER_SIZE             8
39
40 /* Structure for the zebra client. */
41 struct zclient
42 {
43   /* The thread master we schedule ourselves on */
44   struct thread_master *master;
45
46   /* Socket to zebra daemon. */
47   int sock;
48
49   /* Flag of communication to zebra is enabled or not.  Default is on.
50      This flag is disabled by `no router zebra' statement. */
51   int enable;
52
53   /* Connection failure count. */
54   int fail;
55
56   /* Input buffer for zebra message. */
57   struct stream *ibuf;
58
59   /* Output buffer for zebra message. */
60   struct stream *obuf;
61
62   /* Buffer of data waiting to be written to zebra. */
63   struct buffer *wb;
64
65   /* Read and connect thread. */
66   struct thread *t_read;
67   struct thread *t_connect;
68
69   /* Thread to write buffered data to zebra. */
70   struct thread *t_write;
71
72   /* Redistribute information. */
73   u_char redist_default;
74   vrf_bitmap_t redist[ZEBRA_ROUTE_MAX];
75
76   /* Redistribute defauilt. */
77   vrf_bitmap_t default_information;
78
79   /* Pointer to the callback functions. */
80   void (*zebra_connected) (struct zclient *);
81   int (*router_id_update) (int, struct zclient *, uint16_t, vrf_id_t);
82   int (*interface_add) (int, struct zclient *, uint16_t, vrf_id_t);
83   int (*interface_delete) (int, struct zclient *, uint16_t, vrf_id_t);
84   int (*interface_up) (int, struct zclient *, uint16_t, vrf_id_t);
85   int (*interface_down) (int, struct zclient *, uint16_t, vrf_id_t);
86   int (*interface_address_add) (int, struct zclient *, uint16_t, vrf_id_t);
87   int (*interface_address_delete) (int, struct zclient *, uint16_t, vrf_id_t);
88   int (*interface_link_params) (int, struct zclient *, uint16_t);
89   int (*ipv4_route_add) (int, struct zclient *, uint16_t, vrf_id_t);
90   int (*ipv4_route_delete) (int, struct zclient *, uint16_t, vrf_id_t);
91   int (*ipv6_route_add) (int, struct zclient *, uint16_t, vrf_id_t);
92   int (*ipv6_route_delete) (int, struct zclient *, uint16_t, vrf_id_t);
93   int (*nexthop_update) (int, struct zclient *, uint16_t, vrf_id_t);
94 };
95
96 /* Zebra API message flag. */
97 #define ZAPI_MESSAGE_NEXTHOP  0x01
98 #define ZAPI_MESSAGE_IFINDEX  0x02
99 #define ZAPI_MESSAGE_DISTANCE 0x04
100 #define ZAPI_MESSAGE_METRIC   0x08
101 #define ZAPI_MESSAGE_MTU      0x10
102 #define ZAPI_MESSAGE_TAG      0x20
103
104 /* Zserv protocol message header */
105 struct zserv_header
106 {
107   uint16_t length;
108   uint8_t marker;       /* corresponds to command field in old zserv
109                          * always set to 255 in new zserv.
110                          */
111   uint8_t version;
112 #define ZSERV_VERSION   3
113   vrf_id_t vrf_id;
114   uint16_t command;
115 };
116
117 /* Zebra IPv4 route message API. */
118 struct zapi_ipv4
119 {
120   u_char type;
121
122   u_char flags;
123
124   u_char message;
125
126   safi_t safi;
127
128   u_char nexthop_num;
129   struct in_addr **nexthop;
130
131   u_char ifindex_num;
132   ifindex_t *ifindex;
133
134   u_char distance;
135
136   route_tag_t tag;
137
138   u_int32_t metric;
139
140   u_int32_t mtu;
141
142   vrf_id_t vrf_id;
143 };
144
145 /* Prototypes of zebra client service functions. */
146 extern struct zclient *zclient_new (struct thread_master *);
147 extern void zclient_init (struct zclient *, int);
148 extern int zclient_start (struct zclient *);
149 extern void zclient_stop (struct zclient *);
150 extern void zclient_reset (struct zclient *);
151 extern void zclient_free (struct zclient *);
152
153 extern int  zclient_socket_connect (struct zclient *);
154 extern void zclient_serv_path_set  (char *path);
155 extern const char *zclient_serv_path_get (void);
156
157 extern void zclient_send_requests (struct zclient *, vrf_id_t);
158
159 /* Send redistribute command to zebra daemon. Do not update zclient state. */
160 extern int zebra_redistribute_send (int command, struct zclient *, int type,
161     vrf_id_t vrf_id);
162
163 /* If state has changed, update state and call zebra_redistribute_send. */
164 extern void zclient_redistribute (int command, struct zclient *, int type,
165     vrf_id_t vrf_id);
166
167 /* If state has changed, update state and send the command to zebra. */
168 extern void zclient_redistribute_default (int command, struct zclient *,
169     vrf_id_t vrf_id);
170
171 /* Send the message in zclient->obuf to the zebra daemon (or enqueue it).
172    Returns 0 for success or -1 on an I/O error. */
173 extern int zclient_send_message(struct zclient *);
174
175 /* create header for command, length to be filled in by user later */
176 extern void zclient_create_header (struct stream *, uint16_t, vrf_id_t);
177 extern int zclient_read_header (struct stream *s, int sock, u_int16_t *size,
178                                 u_char *marker, u_char *version,
179                                 u_int16_t *vrf_id, u_int16_t *cmd);
180
181 extern struct interface *zebra_interface_add_read (struct stream *,
182     vrf_id_t);
183 extern struct interface *zebra_interface_state_read (struct stream *,
184     vrf_id_t);
185 extern struct connected *zebra_interface_address_read (int, struct stream *,
186     vrf_id_t);
187 extern void zebra_interface_if_set_value (struct stream *, struct interface *);
188 extern void zebra_router_id_update_read (struct stream *s, struct prefix *rid);
189 extern int zapi_ipv4_route (u_char, struct zclient *, struct prefix_ipv4 *, 
190                             struct zapi_ipv4 *);
191
192 extern struct interface *zebra_interface_link_params_read (struct stream *);
193 extern size_t zebra_interface_link_params_write (struct stream *,
194                                                  struct interface *);
195 #ifdef HAVE_IPV6
196 /* IPv6 prefix add and delete function prototype. */
197
198 struct zapi_ipv6
199 {
200   u_char type;
201
202   u_char flags;
203
204   u_char message;
205
206   safi_t safi;
207
208   u_char nexthop_num;
209   struct in6_addr **nexthop;
210
211   u_char ifindex_num;
212   ifindex_t *ifindex;
213
214   u_char distance;
215
216   route_tag_t tag;
217
218   u_int32_t metric;
219
220   u_int32_t mtu;
221
222   vrf_id_t vrf_id;
223 };
224
225 extern int zapi_ipv6_route (u_char cmd, struct zclient *zclient, 
226                      struct prefix_ipv6 *p, struct zapi_ipv6 *api);
227 #endif /* HAVE_IPV6 */
228
229 #endif /* _ZEBRA_ZCLIENT_H */