FD.io VPP  v17.01.1-3-gc6833f8
Vector Packet Processing
api.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <lb/lb.h>
17 
18 #include <vppinfra/byte_order.h>
19 #include <vlibapi/api.h>
20 #include <vlibapi/api.h>
21 #include <vlibmemory/api.h>
22 #include <vlibsocket/api.h>
23 
24 #define vl_msg_id(n,h) n,
25 typedef enum {
26 #include <lb/lb.api.h>
27  /* We'll want to know how many messages IDs we need... */
29 } vl_msg_id_t;
30 #undef vl_msg_id
31 
32 
33 /* define message structures */
34 #define vl_typedefs
35 #include <lb/lb.api.h>
36 #undef vl_typedefs
37 
38 /* define generated endian-swappers */
39 #define vl_endianfun
40 #include <lb/lb.api.h>
41 #undef vl_endianfun
42 
43 #define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__)
44 
45 /* Get the API version number */
46 #define vl_api_version(n,v) static u32 api_version=(v);
47 #include <lb/lb.api.h>
48 #undef vl_api_version
49 
50 #define vl_msg_name_crc_list
51 #include <lb/lb.api.h>
52 #undef vl_msg_name_crc_list
53 
54 static void
56 {
57 #define _(id,n,crc) \
58  vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id + lbm->msg_id_base);
59  foreach_vl_msg_name_crc_lb;
60 #undef _
61 }
62 
63 /* Macro to finish up custom dump fns */
64 #define FINISH \
65  vec_add1 (s, 0); \
66  vl_print (handle, (char *)s); \
67  vec_free (s); \
68  return handle;
69 
70 /*
71  * A handy macro to set up a message reply.
72  * Assumes that the following variables are available:
73  * mp - pointer to request message
74  * rmp - pointer to reply message type
75  * rv - return value
76  */
77 
78 #define REPLY_MACRO(t) \
79 do { \
80  unix_shared_memory_queue_t * q = \
81  vl_api_client_index_to_input_queue (mp->client_index); \
82  if (!q) \
83  return; \
84  \
85  rmp = vl_msg_api_alloc (sizeof (*rmp)); \
86  rmp->_vl_msg_id = ntohs((t)+lbm->msg_id_base); \
87  rmp->context = mp->context; \
88  rmp->retval = ntohl(rv); \
89  \
90  vl_msg_api_send_shmem (q, (u8 *)&rmp); \
91 } while(0);
92 
93 static void
96 {
97  lb_main_t *lbm = &lb_main;
99  int rv = 0;
100 
104  mp->flow_timeout);
105 
106  REPLY_MACRO (VL_API_LB_CONF_REPLY);
107 }
108 
109 static void *vl_api_lb_conf_t_print
110 (vl_api_lb_conf_t *mp, void * handle)
111 {
112  u8 * s;
113  s = format (0, "SCRIPT: lb_conf ");
114  s = format (s, "%U ", format_ip4_address, (ip4_address_t *)&mp->ip4_src_address);
115  s = format (s, "%U ", format_ip6_address, (ip6_address_t *)mp->ip6_src_address);
116  s = format (s, "%u ", mp->sticky_buckets_per_core);
117  s = format (s, "%u ", mp->flow_timeout);
118  FINISH;
119 }
120 
121 
122 static void
125 {
126  lb_main_t *lbm = &lb_main;
128  int rv = 0;
129  ip46_address_t prefix;
130  memcpy(&prefix.ip6, mp->ip_prefix, sizeof(prefix.ip6));
131 
132  if (mp->is_del) {
133  u32 vip_index;
134  if (!(rv = lb_vip_find_index(&prefix, mp->prefix_length, &vip_index)))
135  rv = lb_vip_del(vip_index);
136  } else {
137  u32 vip_index;
139  if (ip46_prefix_is_ip4(&prefix, mp->prefix_length)) {
141  } else {
143  }
144 
145  rv = lb_vip_add(&prefix, mp->prefix_length, type,
146  mp->new_flows_table_length, &vip_index);
147  }
148  REPLY_MACRO (VL_API_LB_CONF_REPLY);
149 }
150 
152 (vl_api_lb_add_del_vip_t *mp, void * handle)
153 {
154  u8 * s;
155  s = format (0, "SCRIPT: lb_add_del_vip ");
156  s = format (s, "%U ", format_ip46_prefix,
157  (ip46_address_t *)mp->ip_prefix, mp->prefix_length, IP46_TYPE_ANY);
158  s = format (s, "%s ", mp->is_gre4?"gre4":"gre6");
159  s = format (s, "%u ", mp->new_flows_table_length);
160  s = format (s, "%s ", mp->is_del?"del":"add");
161  FINISH;
162 }
163 
164 static void
167 {
168  lb_main_t *lbm = &lb_main;
170  int rv = 0;
171  u32 vip_index;
172  if ((rv = lb_vip_find_index((ip46_address_t *)mp->vip_ip_prefix,
173  mp->vip_prefix_length, &vip_index)))
174  goto done;
175 
176  if (mp->is_del)
177  rv = lb_vip_del_ass(vip_index, (ip46_address_t *)mp->as_address, 1);
178  else
179  rv = lb_vip_add_ass(vip_index, (ip46_address_t *)mp->as_address, 1);
180 
181 done:
182  REPLY_MACRO (VL_API_LB_CONF_REPLY);
183 }
184 
185 static void *vl_api_lb_add_del_as_t_print
186 (vl_api_lb_add_del_as_t *mp, void * handle)
187 {
188  u8 * s;
189  s = format (0, "SCRIPT: lb_add_del_as ");
190  s = format (s, "%U ", format_ip46_prefix,
191  (ip46_address_t *)mp->vip_ip_prefix, mp->vip_prefix_length, IP46_TYPE_ANY);
192  s = format (s, "%U ", format_ip46_address,
193  (ip46_address_t *)mp->as_address, IP46_TYPE_ANY);
194  s = format (s, "%s ", mp->is_del?"del":"add");
195  FINISH;
196 }
197 
198 /* List of message types that this plugin understands */
199 #define foreach_lb_plugin_api_msg \
200 _(LB_CONF, lb_conf) \
201 _(LB_ADD_DEL_VIP, lb_add_del_vip) \
202 _(LB_ADD_DEL_AS, lb_add_del_as)
203 
205 {
206  lb_main_t *lbm = &lb_main;
207  u8 *name = format (0, "lb_%08x%c", api_version, 0);
209  ((char *) name, VL_MSG_FIRST_AVAILABLE);
210 
211 #define _(N,n) \
212  vl_msg_api_set_handlers((VL_API_##N + lbm->msg_id_base), \
213  #n, \
214  vl_api_##n##_t_handler, \
215  vl_noop_handler, \
216  vl_api_##n##_t_endian, \
217  vl_api_##n##_t_print, \
218  sizeof(vl_api_##n##_t), 1);
220 #undef _
221 
222  /* Add our API messages to the global name_crc hash table */
224 
225  return 0;
226 }
227 
format_function_t format_ip46_address
Definition: format.h:61
static void vl_api_lb_conf_t_handler(vl_api_lb_conf_t *mp)
Definition: api.c:95
u32 flow_timeout
Definition: lb.api:18
format_function_t format_ip6_address
Definition: format.h:95
static clib_error_t * lb_api_init(vlib_main_t *vm)
Definition: api.c:204
bad routing header type(not 4)") sr_error (NO_MORE_SEGMENTS
u16 msg_id_base
API dynamically registered base ID.
Definition: lb.h:298
static void setup_message_id_table(lb_main_t *lbm, api_main_t *am)
Definition: api.c:55
u8 * format_ip46_prefix(u8 *s, va_list *args)
Definition: util.c:54
int lb_conf(ip4_address_t *ip4_address, ip6_address_t *ip6_address, u32 per_cpu_sticky_buckets, u32 flow_timeout)
Fix global load-balancer parameters.
Definition: lb.c:362
int lb_vip_add_ass(u32 vip_index, ip46_address_t *addresses, u32 n)
Definition: lb.c:425
format_function_t format_ip4_address
Definition: format.h:79
u8 ip6_src_address[16]
Definition: lb.api:16
#define foreach_lb_plugin_api_msg
Definition: api.c:199
api_main_t api_main
Definition: api_shared.c:39
static void * vl_api_lb_conf_t_print(vl_api_lb_conf_t *mp, void *handle)
Definition: api.c:110
#define VLIB_INIT_FUNCTION(x)
Definition: init.h:111
lb_main_t lb_main
Definition: lb.c:26
Definition: lb.h:228
static void * vl_api_lb_add_del_as_t_print(vl_api_lb_add_del_as_t *mp, void *handle)
Definition: api.c:186
static void vl_api_lb_add_del_vip_t_handler(vl_api_lb_add_del_vip_t *mp)
Definition: api.c:124
static void * vl_api_lb_add_del_vip_t_print(vl_api_lb_add_del_vip_t *mp, void *handle)
Definition: api.c:152
int lb_vip_del(u32 vip_index)
Definition: lb.c:696
Add an application server for a given VIP.
Definition: lb.api:59
u8 vip_ip_prefix[16]
Definition: lb.api:62
#define ip46_prefix_is_ip4(ip46, len)
Definition: util.h:27
int lb_vip_add(ip46_address_t *prefix, u8 plen, lb_vip_type_t type, u32 new_length, u32 *vip_index)
Definition: lb.c:638
#define REPLY_MACRO(t)
Definition: api.c:78
u32 new_flows_table_length
Definition: lb.api:42
#define FINISH
Definition: api.c:64
int lb_vip_del_ass(u32 vip_index, ip46_address_t *addresses, u32 n)
Definition: lb.c:583
u32 sticky_buckets_per_core
Definition: lb.api:17
Add a virtual address (or prefix)
Definition: lb.api:36
unsigned int u32
Definition: types.h:88
lb_vip_type_t
The load balancer supports IPv4 and IPv6 traffic and GRE4 and GRE6 encap.
Definition: lb.h:135
u8 as_address[16]
Definition: lb.api:64
int lb_vip_find_index(ip46_address_t *prefix, u8 plen, u32 *vip_index)
Definition: lb.c:398
vl_msg_id_t
Definition: api.c:25
static void vl_api_lb_add_del_as_t_handler(vl_api_lb_add_del_as_t *mp)
Definition: api.c:166
Configure Load-Balancer global parameters.
Definition: lb.api:11
unsigned char u8
Definition: types.h:56
u32 ip4_src_address
Definition: lb.api:15
u8 * format(u8 *s, const char *fmt,...)
Definition: format.c:418
u16 vl_msg_api_get_msg_ids(char *name, int n)
Definition: api_shared.c:1309