FD.io VPP  v16.06
Vector Packet Processing
vppjni.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 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 #define _GNU_SOURCE /* for strcasestr(3) */
16 #include <vnet/vnet.h>
17 
18 #define vl_api_version(n,v) static u32 vpe_api_version = (v);
19 #include <api/vpe.api.h>
20 #undef vl_api_version
21 
22 #include <jni.h>
23 #include <japi/vppjni.h>
25 #include <japi/vppjni_env.h>
26 #include <japi/org_openvpp_vppjapi_vppConn.h>
27 #include <japi/org_openvpp_vppjapi_vppApi.h>
28 
29 #include <api/vpe_msg_enum.h>
30 #define vl_typedefs /* define message structures */
31 #include <api/vpe_all_api_h.h>
32 #undef vl_typedefs
33 
34 #define vl_endianfun
35 #include <api/vpe_all_api_h.h>
36 #undef vl_endianfun
37 
38 /* instantiate all the print functions we know about */
39 #define vl_print(handle, ...)
40 #define vl_printfun
41 #include <api/vpe_all_api_h.h>
42 #undef vl_printfun
43 
44 #define VPPJNI_DEBUG 0
45 
46 #if VPPJNI_DEBUG == 1
47  #define DEBUG_LOG(...) clib_warning(__VA_ARGS__)
48 #else
49  #define DEBUG_LOG(...)
50 #endif
51 
52 static int connect_to_vpe(char *name);
53 
54 /*
55  * The Java runtime isn't compile w/ -fstack-protector,
56  * so we have to supply missing external references for the
57  * regular vpp libraries. Weak reference in case folks get religion
58  * at a later date...
59  */
60 void __stack_chk_guard (void) __attribute__((weak));
61 void __stack_chk_guard (void) { }
62 
63 BIND_JAPI_CLASS(vppBridgeDomainDetails, "()V");
64 BIND_JAPI_BOOL_FIELD(vppBridgeDomainDetails, arpTerm);
65 BIND_JAPI_BOOL_FIELD(vppBridgeDomainDetails, flood);
66 BIND_JAPI_BOOL_FIELD(vppBridgeDomainDetails, forward);
67 BIND_JAPI_BOOL_FIELD(vppBridgeDomainDetails, learn);
68 BIND_JAPI_BOOL_FIELD(vppBridgeDomainDetails, uuFlood);
69 BIND_JAPI_INT_FIELD(vppBridgeDomainDetails, bdId);
70 BIND_JAPI_STRING_FIELD(vppBridgeDomainDetails, name);
71 BIND_JAPI_STRING_FIELD(vppBridgeDomainDetails, bviInterfaceName);
72 BIND_JAPI_OBJ_FIELD(vppBridgeDomainDetails, interfaces, "[Lorg/openvpp/vppjapi/vppBridgeDomainInterfaceDetails;");
73 
74 BIND_JAPI_CLASS(vppBridgeDomainInterfaceDetails, "()V");
75 BIND_JAPI_BYTE_FIELD(vppBridgeDomainInterfaceDetails, splitHorizonGroup);
76 BIND_JAPI_STRING_FIELD(vppBridgeDomainInterfaceDetails, interfaceName);
77 
78 BIND_JAPI_CLASS(vppInterfaceCounters, "(JJJJJJJJJJJJJJJJJJJJJJ)V");
79 BIND_JAPI_CLASS(vppInterfaceDetails, "(ILjava/lang/String;I[BBBBBIBBIIBBBBIIIII)V");
80 BIND_JAPI_CLASS(vppIPv4Address, "(IB)V");
81 BIND_JAPI_CLASS(vppIPv6Address, "([BB)V");
82 BIND_JAPI_CLASS(vppL2Fib, "([BZLjava/lang/String;ZZ)V");
83 BIND_JAPI_CLASS(vppVersion, "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
84 BIND_JAPI_CLASS(vppVxlanTunnelDetails, "(IIIII)V");
85 
87 {
88  /*
89  * Send the main API signature in slot 0. This bit of code must
90  * match the checks in ../vpe/api/api.c: vl_msg_api_version_check().
91  */
92  mp->api_versions[0] = clib_host_to_net_u32 (vpe_api_version);
93 }
94 
95 /* Note: non-static, called once to set up the initial intfc table */
97 {
99  f64 timeout;
100  hash_pair_t * p;
101  name_sort_t * nses = 0, * ns;
103 
104  /* Toss the old name table */
106  ({
107  vec_add2 (nses, ns, 1);
108  ns->name = (u8 *)(p->key);
109  ns->value = (u32) p->value[0];
110  }));
111 
113 
114  vec_foreach (ns, nses)
115  vec_free (ns->name);
116 
117  vec_free (nses);
118 
119  vec_foreach (sub, jm->sw_if_subif_table) {
120  vec_free (sub->interface_name);
121  }
123 
124  /* recreate the interface name hash table */
126  = hash_create_string (0, sizeof(uword));
127 
128  /* Get list of ethernets */
129  M(SW_INTERFACE_DUMP, sw_interface_dump);
130  mp->name_filter_valid = 1;
131  strncpy ((char *) mp->name_filter, "Ether", sizeof(mp->name_filter)-1);
132  S;
133 
134  /* and local / loopback interfaces */
135  M(SW_INTERFACE_DUMP, sw_interface_dump);
136  mp->name_filter_valid = 1;
137  strncpy ((char *) mp->name_filter, "lo", sizeof(mp->name_filter)-1);
138  S;
139 
140  /* and vxlan tunnel interfaces */
141  M(SW_INTERFACE_DUMP, sw_interface_dump);
142  mp->name_filter_valid = 1;
143  strncpy ((char *) mp->name_filter, "vxlan", sizeof(mp->name_filter)-1);
144  S;
145 
146  /* and tap tunnel interfaces */
147  M(SW_INTERFACE_DUMP, sw_interface_dump);
148  mp->name_filter_valid = 1;
149  strncpy ((char *) mp->name_filter, "tap", sizeof(mp->name_filter)-1);
150  S;
151 
152  /* and host (af_packet) interfaces */
153  M(SW_INTERFACE_DUMP, sw_interface_dump);
154  mp->name_filter_valid = 1;
155  strncpy ((char *) mp->name_filter, "host", sizeof(mp->name_filter)-1);
156  S;
157 
158  /* and l2tpv3 tunnel interfaces */
159  M(SW_INTERFACE_DUMP, sw_interface_dump);
160  mp->name_filter_valid = 1;
161  strncpy ((char *) mp->name_filter, "l2tpv3_tunnel",
162  sizeof(mp->name_filter)-1);
163  S;
164 
165  /* Use a control ping for synchronization */
166  {
168  M(CONTROL_PING, control_ping);
169  S;
170  }
171  W;
172 }
173 
174 JNIEXPORT jobject JNICALL Java_org_openvpp_vppjapi_vppConn_getVppVersion0
175  (JNIEnv *env, jobject obj)
176 {
177  vppjni_main_t * jm = &vppjni_main;
178 
179  vppjni_lock (jm, 11);
180  jstring progName = (*env)->NewStringUTF(env, (char *)jm->program_name);
181  jstring buildDir = (*env)->NewStringUTF(env, (char *)jm->build_directory);
182  jstring version = (*env)->NewStringUTF(env, (char *)jm->version);
183  jstring buildDate = (*env)->NewStringUTF(env, (char *)jm->build_date);
184  vppjni_unlock (jm);
185 
186  return vppVersionObject(env, progName, buildDir, version, buildDate);
187 }
188 
190 {
191  int rv;
193  f64 timeout;
194 
195  vppjni_lock (jm, 10);
196  M(SHOW_VERSION, show_version);
197 
198  S;
199  vppjni_unlock (jm);
200  WNR;
201  return rv;
202 }
203 
204 static int jm_stats_enable_disable (vppjni_main_t *jm, u8 enable)
205 {
206  vl_api_want_stats_t * mp;
207  f64 timeout;
208  int rv;
209 
210  vppjni_lock (jm, 13);
211 
212  M(WANT_STATS, want_stats);
213 
214  mp->enable_disable = enable;
215 
216  S;
217  vppjni_unlock (jm);
218  WNR;
219 
220  // already subscribed / already disabled (it's ok)
221  if (rv == -2 || rv == -3)
222  rv = 0;
223  return rv;
224 }
225 
227  (JNIEnv *env, jobject obj, jstring ifName, jstring ifDesc)
228 {
229  int rv = 0;
230  vppjni_main_t * jm = &vppjni_main;
231  uword * p;
232  u32 sw_if_index = ~0;
233  sw_if_config_t *cfg;
234 
235  const char *if_name_str = (*env)->GetStringUTFChars (env, ifName, 0);
236  const char *if_desc_str = (*env)->GetStringUTFChars (env, ifDesc, 0);
237 
238  vppjni_lock (jm, 23);
239 
240  p = hash_get_mem (jm->sw_if_index_by_interface_name, if_name_str);
241  if (p == 0) {
242  rv = -1;
243  goto out;
244  }
245  sw_if_index = (jint) p[0];
246 
247  u8 *if_desc = 0;
248  vec_validate_init_c_string (if_desc, if_desc_str, strlen(if_desc_str));
249  (*env)->ReleaseStringUTFChars (env, ifDesc, if_desc_str);
250 
251  p = hash_get (jm->sw_if_config_by_sw_if_index, sw_if_index);
252  if (p != 0) {
253  cfg = (sw_if_config_t *) (p[0]);
254  if (cfg->desc)
255  vec_free(cfg->desc);
256  } else {
257  cfg = (sw_if_config_t *) clib_mem_alloc(sizeof(sw_if_config_t));
258  hash_set (jm->sw_if_config_by_sw_if_index, sw_if_index, cfg);
259  }
260 
261  cfg->desc = if_desc;
262 
263 out:
264  (*env)->ReleaseStringUTFChars (env, ifName, if_name_str);
265  vppjni_unlock (jm);
266  return rv;
267 }
268 
270 (JNIEnv * env, jobject obj, jstring ifName)
271 {
272  vppjni_main_t * jm = &vppjni_main;
273  u32 sw_if_index = ~0;
274  uword * p;
275  jstring ifDesc = NULL;
276  const char *if_name_str = (*env)->GetStringUTFChars (env, ifName, 0);
277  if (!if_name_str)
278  return NULL;
279 
280  vppjni_lock (jm, 24);
281  p = hash_get_mem (jm->sw_if_index_by_interface_name, if_name_str);
282  if (p == 0)
283  goto out;
284 
285  sw_if_index = (jint) p[0];
286 
287  p = hash_get (jm->sw_if_config_by_sw_if_index, sw_if_index);
288  if (p == 0)
289  goto out;
290 
291  sw_if_config_t *cfg = (sw_if_config_t *) (p[0]);
292  u8 * s = format (0, "%s%c", cfg->desc, 0);
293  ifDesc = (*env)->NewStringUTF(env, (char *)s);
294 
295 out:
296  vppjni_unlock (jm);
297 
298  return ifDesc;
299 }
300 
302  (JNIEnv *env, jobject obj, jstring clientName)
303 {
304  int rv;
305  const char *client_name;
306  void vl_msg_reply_handler_hookup(void);
307  vppjni_main_t * jm = &vppjni_main;
308  api_main_t * am = &api_main;
309  u8 * heap;
310  mheap_t * h;
311  f64 timeout;
312 
313  /*
314  * Bail out now if we're not running as root
315  */
316  if (geteuid() != 0)
317  return -1;
318 
319  if (jm->is_connected)
320  return -2;
321 
322  client_name = (*env)->GetStringUTFChars(env, clientName, 0);
323  if (!client_name)
324  return -3;
325 
326  if (jm->heap == 0)
327  clib_mem_init (0, 128<<20);
328 
329  heap = clib_mem_get_per_cpu_heap();
330  h = mheap_header (heap);
331 
332  clib_time_init (&jm->clib_time);
333 
334  rv = connect_to_vpe ((char *) client_name);
335 
336  if (rv < 0)
337  clib_warning ("connection failed, rv %d", rv);
338 
339  (*env)->ReleaseStringUTFChars (env, clientName, client_name);
340 
341  if (rv == 0) {
342  vl_msg_reply_handler_hookup ();
343  jm->is_connected = 1;
344  /* make the main heap thread-safe */
346 
347  jm->reply_hash = hash_create (0, sizeof (uword));
348  //jm->callback_hash = hash_create (0, sizeof (uword));
349  //jm->ping_hash = hash_create (0, sizeof (uword));
350  jm->api_main = am;
353  hash_create_string (0, sizeof (uword));
355  hash_create (0, sizeof (uword));
356 
357  {
358  // call control ping first to attach rx thread to java thread
360  M(CONTROL_PING, control_ping);
361  S;
362  WNR;
363 
364  if (rv != 0) {
365  clib_warning ("first control ping failed: %d", rv);
366  }
367  }
368  rv = jm_show_version(jm);
369  if (rv != 0)
370  clib_warning ("unable to retrieve vpp version (rv: %d)", rv);
371  rv = sw_interface_dump(jm);
372  if (rv != 0)
373  clib_warning ("unable to retrieve interface list (rv: %d)", rv);
374  rv = jm_stats_enable_disable(jm, 1);
375  if (rv != 0)
376  clib_warning ("unable to subscribe to stats (rv: %d)", rv);
377  }
378  DEBUG_LOG ("clientConnect result: %d", rv);
379 
380  return rv;
381 }
382 
384  (JNIEnv *env, jobject obj)
385 {
386  u8 *save_heap;
387  vppjni_main_t * jm = &vppjni_main;
389 
390  save_heap = jm->heap;
391  memset (jm, 0, sizeof (*jm));
392  jm->heap = save_heap;
393 }
394 
395 void vl_api_generic_reply_handler (vl_api_generic_reply_t *mp)
396 {
397  api_main_t * am = &api_main;
398  u16 msg_id = clib_net_to_host_u16 (mp->_vl_msg_id);
399  trace_cfg_t *cfgp;
400  i32 retval = clib_net_to_host_u32 (mp->retval);
401  int total_bytes = sizeof(mp);
402  vppjni_main_t * jm = &vppjni_main;
403  u8 * saved_reply = 0;
404  u32 context = clib_host_to_net_u32 (mp->context);
405 
406  cfgp = am->api_trace_cfg + msg_id;
407 
408  if (!cfgp)
409  clib_warning ("msg id %d: no trace configuration\n", msg_id);
410  else
411  total_bytes = cfgp->size;
412 
413  jm->context_id_received = context;
414 
415  DEBUG_LOG ("Received generic reply for msg id %d", msg_id);
416 
417  /* A generic reply, successful, we're done */
418  if (retval >= 0 && total_bytes == sizeof(*mp))
419  return;
420 
421  /* Save the reply */
422  vec_validate (saved_reply, total_bytes - 1);
423  clib_memcpy (saved_reply, mp, total_bytes);
424 
425  vppjni_lock (jm, 2);
426  hash_set (jm->reply_hash, context, saved_reply);
427  jm->saved_reply_count ++;
428  vppjni_unlock (jm);
429 }
430 
431 JNIEXPORT jint JNICALL Java_org_openvpp_vppjapi_vppConn_getRetval0
432 (JNIEnv * env, jobject obj, jint context, jint release)
433 {
434  vppjni_main_t * jm = &vppjni_main;
435  vl_api_generic_reply_t * mp;
436  uword * p;
437  int rv = 0;
438 
439  /* Dunno yet? */
440  if (context > jm->context_id_received)
441  return (VNET_API_ERROR_RESPONSE_NOT_READY);
442 
443  vppjni_lock (jm, 1);
444  p = hash_get (jm->reply_hash, context);
445 
446  /*
447  * Two cases: a generic "yes" reply - won't be in the hash table
448  * or "no", or "more data" which will be in the table.
449  */
450  if (p == 0)
451  goto out;
452 
453  mp = (vl_api_generic_reply_t *) (p[0]);
454  rv = clib_net_to_host_u32 (mp->retval);
455 
456  if (release) {
457  u8 * free_me = (u8 *) mp;
458  vec_free (free_me);
459  hash_unset (jm->reply_hash, context);
460  jm->saved_reply_count --;
461  }
462 
463 out:
464  vppjni_unlock (jm);
465  return (rv);
466 }
467 
468 static int
469 name_sort_cmp (void * a1, void * a2)
470 {
471  name_sort_t * n1 = a1;
472  name_sort_t * n2 = a2;
473 
474  return strcmp ((char *)n1->name, (char *)n2->name);
475 }
476 
478  (JNIEnv * env, jobject obj, jstring name_filter)
479 {
480  vppjni_main_t * jm = &vppjni_main;
481  jstring rv;
482  hash_pair_t * p;
483  name_sort_t * nses = 0, * ns;
484  const char *this_name;
485  u8 * s = 0;
486  const char * nf = (*env)->GetStringUTFChars (env, name_filter, NULL);
487  if (!nf)
488  return NULL;
489 
490  vppjni_lock (jm, 4);
491 
493  ({
494  this_name = (const char *)(p->key);
495  if (strlen (nf) == 0 || strcasestr (this_name, nf)) {
496  vec_add2 (nses, ns, 1);
497  ns->name = (u8 *)(p->key);
498  ns->value = (u32) p->value[0];
499  }
500  }));
501 
503 
504  vec_foreach (ns, nses)
505  s = format (s, "%s: %d, ", ns->name, ns->value);
506 
507  _vec_len (s) = vec_len (s) - 2;
509  vppjni_unlock (jm);
510 
511  vec_free (nses);
512 
513  (*env)->ReleaseStringUTFChars (env, name_filter, nf);
514 
515  rv = (*env)->NewStringUTF (env, (char *) s);
516  vec_free (s);
517 
518  return rv;
519 }
520 
522  (JNIEnv * env, jobject obj, jstring interfaceName)
523 {
524  vppjni_main_t * jm = &vppjni_main;
525  jint rv = -1;
526  const char * if_name = (*env)->GetStringUTFChars (env, interfaceName, NULL);
527  if (if_name) {
528  uword * p;
529 
530  vppjni_lock (jm, 5);
531 
532  p = hash_get_mem (jm->sw_if_index_by_interface_name, if_name);
533 
534  if (p != 0)
535  rv = (jint) p[0];
536 
537  vppjni_unlock (jm);
538 
539  (*env)->ReleaseStringUTFChars (env, interfaceName, if_name);
540  }
541 
542  return rv;
543 }
544 
546 (JNIEnv * env, jobject obj, jint swIfIndex)
547 {
548  vppjni_main_t * jm = &vppjni_main;
550  u32 sw_if_index = swIfIndex;
551  jobject result = NULL;
552 
553  vppjni_lock (jm, 16);
554 
555  if (sw_if_index >= vec_len(jm->sw_if_stats_by_sw_if_index)) {
556  goto out;
557  }
558  s = &jm->sw_if_stats_by_sw_if_index[sw_if_index];
559  if (!s->valid) {
560  goto out;
561  }
562 
563  result = vppInterfaceCountersObject(env,
564  s->rx.octets, s->rx.pkts.ip4, s->rx.pkts.ip6, s->rx.pkts.unicast,
567  s->rx.pkts.miss,
568  s->tx.octets, s->tx.pkts.ip4, s->tx.pkts.ip6, s->tx.pkts.unicast,
571  s->tx.pkts.miss);
572 
573 out:
574  vppjni_unlock (jm);
575  return result;
576 }
577 
579 (JNIEnv * env, jobject obj, jint swIfIndex)
580 {
581  vppjni_main_t * jm = &vppjni_main;
582  sw_interface_details_t *sw_if_details;
583  u32 sw_if_index;
584  jstring ifname = NULL;
585 
586  vppjni_lock (jm, 8);
587 
588  sw_if_index = swIfIndex;
589 
590  if (sw_if_index >= vec_len(jm->sw_if_table)) {
591  goto out;
592  }
593  sw_if_details = &jm->sw_if_table[sw_if_index];
594  if (!sw_if_details->valid) {
595  goto out;
596  }
597 
598  u8 * s = format (0, "%s%c", sw_if_details->interface_name, 0);
599  ifname = (*env)->NewStringUTF(env, (char *)s);
600 
601 out:
602  vppjni_unlock (jm);
603 
604  return ifname;
605 }
606 
608 (JNIEnv * env, jobject obj)
609 {
610  vppjni_main_t * jm = &vppjni_main;
611 
612  vppjni_lock (jm, 21);
613 
615 
616  vppjni_unlock (jm);
617 }
618 
619 static jobjectArray sw_if_dump_get_interfaces ();
620 
621 JNIEXPORT jobjectArray JNICALL Java_org_openvpp_vppjapi_vppConn_swInterfaceDump0
622 (JNIEnv * env, jobject obj, jbyte name_filter_valid, jbyteArray name_filter)
623 {
624  vppjni_main_t *jm = &vppjni_main;
625  f64 timeout;
627  u32 my_context_id;
628  int rv;
629  rv = vppjni_sanity_check (jm);
630  if (rv) {
631  clib_warning("swInterfaceDump sanity_check rv = %d", rv);
632  return NULL;
633  }
634 
635  vppjni_lock (jm, 7);
636  my_context_id = vppjni_get_context_id (jm);
637  jsize cnt = (*env)->GetArrayLength (env, name_filter);
638 
639  M(SW_INTERFACE_DUMP, sw_interface_dump);
640  mp->context = clib_host_to_net_u32 (my_context_id);
641  mp->name_filter_valid = name_filter_valid;
642 
643  if (cnt > sizeof(mp->name_filter))
644  cnt = sizeof(mp->name_filter);
645 
646  (*env)->GetByteArrayRegion(env, name_filter, 0, cnt, (jbyte *)mp->name_filter);
647 
648  DEBUG_LOG ("interface filter (%d, %s, len: %d)", mp->name_filter_valid, (char *)mp->name_filter, cnt);
649 
650  jm->collect_indices = 1;
651 
652  S;
653  {
654  // now send control ping so we know when it ends
656  M(CONTROL_PING, control_ping);
657  mp->context = clib_host_to_net_u32 (my_context_id);
658 
659  S;
660  }
661  vppjni_unlock (jm);
662  WNR;
663 
664  vppjni_lock (jm, 7);
665  jobjectArray result = sw_if_dump_get_interfaces(env);
666  vppjni_unlock (jm);
667  return result;
668 }
669 
670 static jobjectArray sw_if_dump_get_interfaces (JNIEnv * env)
671 {
672  vppjni_main_t * jm = &vppjni_main;
673  sw_interface_details_t *sw_if_details;
674  u32 i;
675 
676  int len = vec_len(jm->sw_if_dump_if_indices);
677 
678  jobjectArray ifArray = vppInterfaceDetailsArray(env, len);
679 
680  for (i = 0; i < len; i++) {
681  u32 sw_if_index = jm->sw_if_dump_if_indices[i];
682  ASSERT(sw_if_index < vec_len(jm->sw_if_table));
683  sw_if_details = &jm->sw_if_table[sw_if_index];
684  ASSERT(sw_if_details->valid);
685 
686  u8 * s = format (0, "%s%c", sw_if_details->interface_name, 0);
687 
688  jstring ifname = (*env)->NewStringUTF(env, (char *)s);
689  jint ifIndex = sw_if_details->sw_if_index;
690  jint supIfIndex = sw_if_details->sup_sw_if_index;
691  jbyteArray physAddr = (*env)->NewByteArray(env,
692  sw_if_details->l2_address_length);
693  (*env)->SetByteArrayRegion(env, physAddr, 0,
694  sw_if_details->l2_address_length,
695  (signed char*)sw_if_details->l2_address);
696  jint subId = sw_if_details->sub_id;
697  jint subOuterVlanId = sw_if_details->sub_outer_vlan_id;
698  jint subInnerVlanId = sw_if_details->sub_inner_vlan_id;
699  jint vtrOp = sw_if_details->vtr_op;
700  jint vtrPushDot1q = sw_if_details->vtr_push_dot1q;
701  jint vtrTag1 = sw_if_details->vtr_tag1;
702  jint vtrTag2 = sw_if_details->vtr_tag2;
703  jint linkMtu = sw_if_details->link_mtu;
704 
705  jbyte adminUpDown = sw_if_details->admin_up_down;
706  jbyte linkUpDown = sw_if_details->link_up_down;
707  jbyte linkDuplex = sw_if_details->link_duplex;
708  jbyte linkSpeed = sw_if_details->link_speed;
709  jbyte subDot1ad = sw_if_details->sub_dot1ad;
710  jbyte subNumberOfTags = sw_if_details->sub_number_of_tags;
711  jbyte subExactMatch = sw_if_details->sub_exact_match;
712  jbyte subDefault = sw_if_details->sub_default;
713  jbyte subOuterVlanIdAny = sw_if_details->sub_outer_vlan_id_any;
714  jbyte subInnerVlanIdAny = sw_if_details->sub_inner_vlan_id_any;
715 
716  jobject ifObj = vppInterfaceDetailsObject(env,
717  ifIndex, ifname,
718  supIfIndex, physAddr, adminUpDown, linkUpDown,
719  linkDuplex, linkSpeed, subId, subDot1ad,
720  subNumberOfTags, subOuterVlanId, subInnerVlanId,
721  subExactMatch, subDefault, subOuterVlanIdAny,
722  subInnerVlanIdAny, vtrOp, vtrPushDot1q, vtrTag1, vtrTag2, linkMtu);
723  (*env)->SetObjectArrayElement(env, ifArray, i, ifObj);
724  }
725 
726  jm->collect_indices = 0;
728  return ifArray;
729 }
730 
732  (JNIEnv * env, jobject obj, jstring bridgeDomain)
733 {
734  vppjni_main_t * jm = &vppjni_main;
735  jint rv = -1;
736  const char * bdName = (*env)->GetStringUTFChars (env, bridgeDomain, NULL);
737  if (bdName) {
738  static u8 * bd_name = 0;
739 
740  vec_validate_init_c_string (bd_name, bdName, strlen(bdName));
741  (*env)->ReleaseStringUTFChars (env, bridgeDomain, bdName);
742 
743  vppjni_lock (jm, 6);
744  rv = (jint)vjbd_find_or_add_bd (&jm->vjbd_main, bd_name);
745  vppjni_unlock (jm);
746 
747  _vec_len(bd_name) = 0;
748  }
749  return rv;
750 }
751 
753  (JNIEnv * env, jobject obj, jstring bridgeDomain)
754 {
755  vppjni_main_t * jm = &vppjni_main;
756  jint rv = -1;
757  const char * bdName = (*env)->GetStringUTFChars (env, bridgeDomain, NULL);
758  if (bdName) {
759  static u8 * bd_name = 0;
760 
761  vec_validate_init_c_string (bd_name, bdName, strlen(bdName));
762  (*env)->ReleaseStringUTFChars (env, bridgeDomain, bdName);
763 
764  vppjni_lock (jm, 20);
765  rv = (jint)vjbd_id_from_name(&jm->vjbd_main, (u8 *)bd_name);
766  vppjni_unlock (jm);
767 
768  _vec_len(bd_name) = 0;
769  }
770 
771  return rv;
772 }
773 
775  (JNIEnv * env, jobject obj, jstring interfaceName)
776 {
777  vppjni_main_t * jm = &vppjni_main;
778  vjbd_main_t * bdm = &jm->vjbd_main;
779  u32 sw_if_index;
780  jint rv = -1;
781  const char * if_name;
782  uword * p;
783 
784  if_name = (*env)->GetStringUTFChars (env, interfaceName, NULL);
785 
786  vppjni_lock (jm, 14);
787 
788  p = hash_get_mem (jm->sw_if_index_by_interface_name, if_name);
789 
790  if (p != 0) {
791  sw_if_index = (jint) p[0];
792  p = hash_get (bdm->bd_id_by_sw_if_index, sw_if_index);
793  if (p != 0) {
794  rv = (jint) p[0];
795  }
796  }
797 
798  vppjni_unlock (jm);
799 
800  (*env)->ReleaseStringUTFChars (env, interfaceName, if_name);
801 
802  return rv;
803 }
804 
805 /*
806  * Special-case: build the interface table, maintain
807  * the next loopback sw_if_index vbl.
808  */
811 {
812  vppjni_main_t * jm = &vppjni_main;
813  static sw_interface_details_t empty_sw_if_details = {0,};
814  sw_interface_details_t *sw_if_details;
815  u32 sw_if_index;
816 
817  vppjni_lock (jm, 1);
818 
819  sw_if_index = ntohl (mp->sw_if_index);
820 
821  u8 * s = format (0, "%s%c", mp->interface_name, 0);
822 
823  if (jm->collect_indices) {
824  u32 pos = vec_len(jm->sw_if_dump_if_indices);
826  jm->sw_if_dump_if_indices[pos] = sw_if_index;
827  }
828 
829  vec_validate_init_empty(jm->sw_if_table, sw_if_index, empty_sw_if_details);
830  sw_if_details = &jm->sw_if_table[sw_if_index];
831  sw_if_details->valid = 1;
832 
833  snprintf((char *)sw_if_details->interface_name,
834  sizeof(sw_if_details->interface_name), "%s", (char *)s);
835  sw_if_details->sw_if_index = sw_if_index;
836  sw_if_details->sup_sw_if_index = ntohl(mp->sup_sw_if_index);
837  sw_if_details->l2_address_length = ntohl (mp->l2_address_length);
838  ASSERT(sw_if_details->l2_address_length <= sizeof(sw_if_details->l2_address));
839  clib_memcpy(sw_if_details->l2_address, mp->l2_address,
840  sw_if_details->l2_address_length);
841  sw_if_details->sub_id = ntohl (mp->sub_id);
842  sw_if_details->sub_outer_vlan_id = ntohl (mp->sub_outer_vlan_id);
843  sw_if_details->sub_inner_vlan_id = ntohl (mp->sub_inner_vlan_id);
844  sw_if_details->vtr_op = ntohl (mp->vtr_op);
845  sw_if_details->vtr_push_dot1q = ntohl (mp->vtr_push_dot1q);
846  sw_if_details->vtr_tag1 = ntohl (mp->vtr_tag1);
847  sw_if_details->vtr_tag2 = ntohl (mp->vtr_tag2);
848 
849  sw_if_details->admin_up_down = mp->admin_up_down;
850  sw_if_details->link_up_down = mp->link_up_down;
851  sw_if_details->link_duplex = mp->link_duplex;
852  sw_if_details->link_speed = mp->link_speed;
853  sw_if_details->sub_dot1ad = mp->sub_dot1ad;
854  sw_if_details->sub_number_of_tags = mp->sub_number_of_tags;
855  sw_if_details->sub_exact_match = mp->sub_exact_match;
856  sw_if_details->sub_default = mp->sub_default;
857  sw_if_details->sub_outer_vlan_id_any = mp->sub_outer_vlan_id_any;
858  sw_if_details->sub_inner_vlan_id_any = mp->sub_inner_vlan_id_any;
859 
860  hash_set_mem (jm->sw_if_index_by_interface_name, s, sw_if_index);
861  DEBUG_LOG ("Got interface %s", (char *)s);
862 
863  /* In sub interface case, fill the sub interface table entry */
864  if (mp->sw_if_index != mp->sup_sw_if_index) {
866 
867  vec_add2(jm->sw_if_subif_table, sub, 1);
868 
869  vec_validate(sub->interface_name, strlen((char *)s) + 1);
870  strncpy((char *)sub->interface_name, (char *)s,
871  vec_len(sub->interface_name));
872  sub->sw_if_index = ntohl(mp->sw_if_index);
873  sub->sub_id = ntohl(mp->sub_id);
874 
875  sub->sub_dot1ad = mp->sub_dot1ad;
877  sub->sub_outer_vlan_id = ntohs(mp->sub_outer_vlan_id);
878  sub->sub_inner_vlan_id = ntohs(mp->sub_inner_vlan_id);
879  sub->sub_exact_match = mp->sub_exact_match;
880  sub->sub_default = mp->sub_default;
883 
884  /* vlan tag rewrite */
885  sub->vtr_op = ntohl(mp->vtr_op);
886  sub->vtr_push_dot1q = ntohl(mp->vtr_push_dot1q);
887  sub->vtr_tag1 = ntohl(mp->vtr_tag1);
888  sub->vtr_tag2 = ntohl(mp->vtr_tag2);
889  }
890  vppjni_unlock (jm);
891 }
892 
895 {
896  /* $$$ nothing for the moment */
897 }
898 
899 static jintArray create_array_of_bd_ids(JNIEnv * env, jint bd_id)
900 {
901  vppjni_main_t *jm = &vppjni_main;
902  vjbd_main_t * bdm = &jm->vjbd_main;
903  u32 *buf = NULL;
904  u32 i;
905 
906  if (bd_id != ~0) {
907  vec_add1(buf, bd_id);
908  } else {
909  for (i = 0; i < vec_len(bdm->bd_oper); i++) {
910  u32 bd_id = bdm->bd_oper[i].bd_id;
911  vec_add1(buf, bd_id);
912  }
913  }
914 
915  jintArray bdidArray = (*env)->NewIntArray(env, vec_len(buf));
916  if (!bdidArray) {
917  goto out;
918  }
919 
920  (*env)->SetIntArrayRegion(env, bdidArray, 0, vec_len(buf), (int*)buf);
921 
922 out:
923  vec_free(buf);
924  return bdidArray;
925 }
926 
927 static void bridge_domain_oper_free(void)
928 {
929  vppjni_main_t *jm = &vppjni_main;
930  vjbd_main_t *bdm = &jm->vjbd_main;
931  u32 i;
932 
933  for (i = 0; i < vec_len(bdm->bd_oper); i++) {
934  vec_free(bdm->bd_oper->l2fib_oper);
935  }
939 }
940 
941 JNIEXPORT jintArray JNICALL Java_org_openvpp_vppjapi_vppConn_bridgeDomainDump0
942 (JNIEnv * env, jobject obj, jint bd_id)
943 {
944  vppjni_main_t *jm = &vppjni_main;
946  u32 my_context_id;
947  f64 timeout;
948  int rv;
949  rv = vppjni_sanity_check (jm);
950  if (rv) return NULL;
951 
952  vppjni_lock (jm, 15);
953 
954  if (~0 == bd_id) {
956  }
957 
958  my_context_id = vppjni_get_context_id (jm);
959  M(BRIDGE_DOMAIN_DUMP, bridge_domain_dump);
960  mp->context = clib_host_to_net_u32 (my_context_id);
961  mp->bd_id = clib_host_to_net_u32(bd_id);
962  S;
963 
964  /* Use a control ping for synchronization */
965  {
967  M(CONTROL_PING, control_ping);
968  S;
969  }
970 
971  WNR;
972  if (0 != rv) {
973  return NULL;
974  }
975 
976  jintArray ret = create_array_of_bd_ids(env, bd_id);
977 
978  vppjni_unlock (jm);
979 
980  return ret;
981 }
982 
983 static void
985 {
986  vppjni_main_t *jm = &vppjni_main;
987  vjbd_main_t * bdm = &jm->vjbd_main;
988  vjbd_oper_t * bd_oper;
989  u32 bd_id, bd_index;
990 
991  bd_id = ntohl (mp->bd_id);
992 
993  bd_index = vec_len(bdm->bd_oper);
994  vec_validate (bdm->bd_oper, bd_index);
995  bd_oper = vec_elt_at_index(bdm->bd_oper, bd_index);
996 
997  hash_set(bdm->oper_bd_index_by_bd_id, bd_id, bd_index);
998 
999  bd_oper->bd_id = bd_id;
1000  bd_oper->flood = mp->flood != 0;
1001  bd_oper->forward = mp->forward != 0;
1002  bd_oper->learn = mp->learn != 0;
1003  bd_oper->uu_flood = mp->uu_flood != 0;
1004  bd_oper->arp_term = mp->arp_term != 0;
1005  bd_oper->bvi_sw_if_index = ntohl (mp->bvi_sw_if_index);
1006  bd_oper->n_sw_ifs = ntohl (mp->n_sw_ifs);
1007 
1008  bd_oper->bd_sw_if_oper = 0;
1009 }
1010 
1011 static void
1014 {
1015  vppjni_main_t *jm = &vppjni_main;
1016  vjbd_main_t * bdm = &jm->vjbd_main;
1017  bd_sw_if_oper_t * bd_sw_if_oper;
1018  u32 bd_id, sw_if_index;
1019 
1020  bd_id = ntohl (mp->bd_id);
1021  sw_if_index = ntohl (mp->sw_if_index);
1022 
1023  uword *p;
1024  p = hash_get (bdm->oper_bd_index_by_bd_id, bd_id);
1025  if (p == 0) {
1026  clib_warning("Invalid bd_id %d in bridge_domain_sw_if_details_t_handler", bd_id);
1027  return;
1028  }
1029  u32 oper_bd_index = (jint) p[0];
1030  vjbd_oper_t *bd_oper = vec_elt_at_index(bdm->bd_oper, oper_bd_index);
1031 
1032  u32 len = vec_len(bd_oper->bd_sw_if_oper);
1033  vec_validate(bd_oper->bd_sw_if_oper, len);
1034  bd_sw_if_oper = &bd_oper->bd_sw_if_oper[len];
1035  bd_sw_if_oper->bd_id = bd_id;
1036  bd_sw_if_oper->sw_if_index = sw_if_index;
1037  bd_sw_if_oper->shg = mp->shg;
1038 
1039  hash_set(bdm->bd_id_by_sw_if_index, sw_if_index, bd_id);
1040 }
1041 
1042 static const char* interface_name_from_sw_if_index(u32 sw_if_index)
1043 {
1044  vppjni_main_t *jm = &vppjni_main;
1045 
1046  if (sw_if_index >= vec_len(jm->sw_if_table)) {
1047  return NULL;
1048  }
1049  if (!jm->sw_if_table[sw_if_index].valid) {
1050  return NULL;
1051  }
1052  return (const char*)jm->sw_if_table[sw_if_index].interface_name;
1053 }
1054 
1056 (JNIEnv * env, jobject obj, jint bdId)
1057 {
1058  vppjni_main_t *jm = &vppjni_main;
1059  vjbd_main_t * bdm = &jm->vjbd_main;
1060  u32 oper_bd_index;
1061  u32 bd_id = bdId;
1062  jobject rv = NULL;
1063  uword *p;
1064 
1065  vppjni_lock (jm, 16);
1066 
1067  p = hash_get (bdm->oper_bd_index_by_bd_id, bd_id);
1068  if (p == 0) {
1069  rv = NULL;
1070  goto out;
1071  }
1072  oper_bd_index = (jint) p[0];
1073 
1074  vjbd_oper_t *bd_oper = vec_elt_at_index(bdm->bd_oper, oper_bd_index);
1075 
1076 
1077  /* setting BridgeDomainDetails */
1078 
1079  jobject bddObj = vppBridgeDomainDetailsObject(env);
1080 
1081  u8 *vec_bd_name = vjbd_oper_name_from_id(bdm, bd_id);
1082  if (NULL == vec_bd_name) {
1083  rv = NULL;
1084  goto out;
1085  }
1086  char *str_bd_name = (char*)format (0, "%s%c", vec_bd_name, 0);
1087  vec_free(vec_bd_name);
1088  jstring bdName = (*env)->NewStringUTF(env, str_bd_name);
1089  vec_free(str_bd_name);
1090  if (NULL == bdName) {
1091  rv = NULL;
1092  goto out;
1093  }
1094 
1095  set_vppBridgeDomainDetails_name(env, bddObj, bdName);
1096  set_vppBridgeDomainDetails_bdId(env, bddObj, bdId);
1097  set_vppBridgeDomainDetails_flood(env, bddObj, (jboolean)bd_oper->flood);
1098  set_vppBridgeDomainDetails_uuFlood(env, bddObj, (jboolean)bd_oper->uu_flood);
1099  set_vppBridgeDomainDetails_forward(env, bddObj, (jboolean)bd_oper->forward);
1100  set_vppBridgeDomainDetails_learn(env, bddObj, (jboolean)bd_oper->learn);
1101  set_vppBridgeDomainDetails_arpTerm(env, bddObj, (jboolean)bd_oper->arp_term);
1102 
1103  jstring bviInterfaceName = NULL;
1104  if (~0 != bd_oper->bvi_sw_if_index) {
1105  const char *str_if_name = interface_name_from_sw_if_index(bd_oper->bvi_sw_if_index);
1106  if (NULL == str_if_name) {
1107  clib_warning("Could not get interface name for sw_if_index %d", bd_oper->bvi_sw_if_index);
1108  rv = NULL;
1109  goto out;
1110  }
1111  bviInterfaceName = (*env)->NewStringUTF(env, str_if_name);
1112  if (NULL == bviInterfaceName) {
1113  rv = NULL;
1114  goto out;
1115  }
1116  }
1117 
1118  set_vppBridgeDomainDetails_bviInterfaceName(env, bddObj, bviInterfaceName);
1119 
1120  /* setting BridgeDomainInterfaceDetails */
1121 
1122  u32 len = vec_len(bd_oper->bd_sw_if_oper);
1123  ASSERT(len == bd_oper->n_sw_ifs);
1124 
1125  jobjectArray bdidArray = vppBridgeDomainInterfaceDetailsArray(env, len);
1126 
1127  u32 i;
1128  for (i = 0; i < len; i++) {
1129  bd_sw_if_oper_t *sw_if_oper = &bd_oper->bd_sw_if_oper[i];
1130 
1131  jobject bdidObj = vppBridgeDomainInterfaceDetailsObject(env);
1132  (*env)->SetObjectArrayElement(env, bdidArray, i, bdidObj);
1133 
1134  u32 sw_if_index = sw_if_oper->sw_if_index;
1135  const char *str_if_name = interface_name_from_sw_if_index(sw_if_index);
1136  if (NULL == str_if_name) {
1137  rv = NULL;
1138  goto out;
1139  }
1140  jstring interfaceName = (*env)->NewStringUTF(env, str_if_name);
1141  if (NULL == interfaceName) {
1142  rv = NULL;
1143  goto out;
1144  }
1145 
1146  set_vppBridgeDomainInterfaceDetails_interfaceName(env, bdidObj, interfaceName);
1147  set_vppBridgeDomainInterfaceDetails_splitHorizonGroup(env, bdidObj, (jbyte)sw_if_oper->shg);
1148  }
1149 
1150  set_vppBridgeDomainDetails_interfaces(env, bddObj, bdidArray);
1151 
1152  rv = bddObj;
1153 
1154 out:
1155 
1156  vppjni_unlock (jm);
1157 
1158  return rv;
1159 }
1160 
1161 static jobject l2_fib_create_object(JNIEnv *env, bd_l2fib_oper_t *l2_fib)
1162 {
1163  u32 sw_if_index = l2_fib->sw_if_index;
1164  const char *str_if_name = interface_name_from_sw_if_index(sw_if_index);
1165  if (NULL == str_if_name) {
1166  return NULL;
1167  }
1168  jstring interfaceName = (*env)->NewStringUTF(env, str_if_name);
1169  if (NULL == interfaceName) {
1170  return NULL;
1171  }
1172 
1173  jbyteArray physAddr = (*env)->NewByteArray(env, 6);
1174  (*env)->SetByteArrayRegion(env, physAddr, 0, 6,
1175  (signed char*)l2_fib->mac_addr.fields.mac);
1176  jboolean staticConfig = !l2_fib->learned;
1177  jstring outgoingInterface = interfaceName;
1178  jboolean filter = l2_fib->filter;
1179  jboolean bridgedVirtualInterface = l2_fib->bvi;
1180 
1181  return vppL2FibObject(env, physAddr, staticConfig, outgoingInterface, filter, bridgedVirtualInterface);
1182 }
1183 
1184 JNIEXPORT jobjectArray JNICALL Java_org_openvpp_vppjapi_vppConn_l2FibTableDump0
1185 (JNIEnv * env, jobject obj, jint bd_id)
1186 {
1187  vppjni_main_t *jm = &vppjni_main;
1188  vjbd_main_t * bdm = &jm->vjbd_main;
1190  jobjectArray l2FibArray = NULL;
1191  vjbd_oper_t *bd_oper;
1192  u32 oper_bd_index;
1193  uword *p;
1194  f64 timeout;
1195  int rv;
1196  u32 i;
1197 
1198  vppjni_lock (jm, 17);
1199 
1200  //vjbd_l2fib_oper_reset (bdm);
1201 
1202  p = hash_get (bdm->oper_bd_index_by_bd_id, bd_id);
1203  if (p == 0) {
1204  goto done;
1205  }
1206  oper_bd_index = p[0];
1207  bd_oper = vec_elt_at_index(bdm->bd_oper, oper_bd_index);
1208  vec_reset_length (bd_oper->l2fib_oper);
1209 
1210  /* Get list of l2 fib table entries */
1211  M(L2_FIB_TABLE_DUMP, l2_fib_table_dump);
1212  mp->bd_id = ntohl(bd_id);
1213  S;
1214 
1215  /* Use a control ping for synchronization */
1216  {
1217  vl_api_control_ping_t * mp;
1218  M(CONTROL_PING, control_ping);
1219  S;
1220  }
1221 
1222  WNR;
1223  if (0 != rv) {
1224  goto done;
1225  }
1226 
1227  u32 count = vec_len(bd_oper->l2fib_oper);
1228  bd_l2fib_oper_t *l2fib_oper = bd_oper->l2fib_oper;
1229 
1230  l2FibArray = vppL2FibArray(env, count);
1231  for (i = 0; i < count; i++) {
1232  bd_l2fib_oper_t *l2_fib = &l2fib_oper[i];
1233  jobject l2FibObj = l2_fib_create_object(env, l2_fib);
1234  (*env)->SetObjectArrayElement(env, l2FibArray, i, l2FibObj);
1235  }
1236 
1237 done:
1238  vppjni_unlock (jm);
1239 
1240  return l2FibArray;
1241 }
1242 
1243 static void
1245 {
1246  //static u8 * mac_addr;
1247  vppjni_main_t *jm = &vppjni_main;
1248  vjbd_main_t * bdm = &jm->vjbd_main;
1249  vjbd_oper_t * bd_oper;
1250  u32 bd_id, oper_bd_index;
1251  //uword mhash_val_l2fi;
1252  bd_l2fib_oper_t * l2fib_oper;
1253  l2fib_u64_mac_t * l2fe_u64_mac = (l2fib_u64_mac_t *)&mp->mac;
1254 
1255  bd_id = ntohl (mp->bd_id);
1256 
1257  uword *p = hash_get (bdm->oper_bd_index_by_bd_id, bd_id);
1258  if (p == 0) {
1259  return;
1260  }
1261  oper_bd_index = (jint) p[0];
1262  bd_oper = vec_elt_at_index(bdm->bd_oper, oper_bd_index);
1263 
1264 #if 0
1265  vec_validate (mac_addr, MAC_ADDRESS_SIZE);
1266  clib_memcpy (mac_addr, l2fe_u64_mac->fields.mac, MAC_ADDRESS_SIZE);
1267  mhash_val_l2fi = vec_len (bd_oper->l2fib_oper);
1268  if (mhash_elts (&bd_oper->l2fib_index_by_mac) == 0)
1269  mhash_init (&bd_oper->l2fib_index_by_mac, sizeof (u32), MAC_ADDRESS_SIZE);
1270  mhash_set_mem (&bd_oper->l2fib_index_by_mac, mac_addr, &mhash_val_l2fi, 0);
1271 #endif
1272 
1273  vec_add2 (bd_oper->l2fib_oper, l2fib_oper, 1);
1274 
1275  l2fib_oper->bd_id = bd_id;
1276  l2fib_oper->mac_addr.raw = l2fib_mac_to_u64 (l2fe_u64_mac->fields.mac);
1277  l2fib_oper->sw_if_index = ntohl (mp->sw_if_index);
1278  l2fib_oper->learned = !mp->static_mac;
1279  l2fib_oper->filter = mp->filter_mac;
1280  l2fib_oper->bvi = mp->bvi_mac;
1281 }
1282 
1283 static int ipAddressDump
1284 (JNIEnv * env, jobject obj, jstring interfaceName, jboolean isIPv6)
1285 {
1286  vppjni_main_t *jm = &vppjni_main;
1288  const char *if_name;
1289  u32 my_context_id;
1290  u32 sw_if_index;
1291  f64 timeout;
1292  uword *p;
1293  int rv = 0;
1294 
1295  if (NULL == interfaceName) {
1296  return -1;
1297  }
1298 
1299  if_name = (*env)->GetStringUTFChars (env, interfaceName, NULL);
1300  if (!if_name) {
1301  return -1;
1302  }
1303 
1304  p = hash_get_mem (jm->sw_if_index_by_interface_name, if_name);
1305  (*env)->ReleaseStringUTFChars (env, interfaceName, if_name);
1306  if (p == 0) {
1307  return -1;
1308  }
1309  sw_if_index = (u32) p[0];
1310 
1311  rv = vppjni_sanity_check (jm);
1312  if (0 != rv) {
1313  return rv;
1314  }
1315 
1316  my_context_id = vppjni_get_context_id (jm);
1317  M(IP_ADDRESS_DUMP, ip_address_dump);
1318  mp->context = clib_host_to_net_u32 (my_context_id);
1319  mp->sw_if_index = clib_host_to_net_u32(sw_if_index);
1320  mp->is_ipv6 = isIPv6;
1321  jm->is_ipv6 = isIPv6;
1322  S;
1323 
1324  /* Use a control ping for synchronization */
1325  {
1326  vl_api_control_ping_t * mp;
1327  M(CONTROL_PING, control_ping);
1328  S;
1329  }
1330 
1331  WNR;
1332 
1333  return rv;
1334 }
1335 
1336 JNIEXPORT jobjectArray JNICALL Java_org_openvpp_vppjapi_vppConn_ipv4AddressDump0
1337 (JNIEnv * env, jobject obj, jstring interfaceName)
1338 {
1339  vppjni_main_t *jm = &vppjni_main;
1340  jobject returnArray = NULL;
1341  int i;
1342 
1343  vppjni_lock (jm, 18);
1344 
1346 
1347  if (0 != ipAddressDump(env, obj, interfaceName, 0)) {
1348  goto done;
1349  }
1350 
1351  u32 count = vec_len(jm->ipv4_addresses);
1352  ipv4_address_t *ipv4_address = jm->ipv4_addresses;
1353 
1354  jobjectArray ipv4AddressArray = vppIPv4AddressArray(env, count);
1355 
1356  for (i = 0; i < count; i++) {
1357  ipv4_address_t *address = &ipv4_address[i];
1358 
1359  jint ip = address->ip;
1360  jbyte prefixLength = address->prefix_length;
1361 
1362  jobject ipv4AddressObj = vppIPv4AddressObject(env, ip, prefixLength);
1363 
1364  (*env)->SetObjectArrayElement(env, ipv4AddressArray, i, ipv4AddressObj);
1365  }
1366 
1367  returnArray = ipv4AddressArray;
1368 
1369 done:
1370  vppjni_unlock (jm);
1371  return returnArray;
1372 }
1373 
1374 JNIEXPORT jobjectArray JNICALL Java_org_openvpp_vppjapi_vppConn_ipv6AddressDump0
1375 (JNIEnv * env, jobject obj, jstring interfaceName)
1376 {
1377  vppjni_main_t *jm = &vppjni_main;
1378  jobject returnArray = NULL;
1379  int i;
1380 
1381  vppjni_lock (jm, 19);
1382 
1384 
1385  if (0 != ipAddressDump(env, obj, interfaceName, 1)) {
1386  goto done;
1387  }
1388 
1389  u32 count = vec_len(jm->ipv6_addresses);
1390  ipv6_address_t *ipv6_address = jm->ipv6_addresses;
1391 
1392  jobjectArray ipv6AddressArray = vppIPv6AddressArray(env, count);
1393 
1394  for (i = 0; i < count; i++) {
1395  ipv6_address_t *address = &ipv6_address[i];
1396 
1397  jbyteArray ip = (*env)->NewByteArray(env, 16);
1398  (*env)->SetByteArrayRegion(env, ip, 0, 16,
1399  (signed char*)address->ip);
1400 
1401  jbyte prefixLength = address->prefix_length;
1402 
1403  jobject ipv6AddressObj = vppIPv6AddressObject(env, ip, prefixLength);
1404 
1405  (*env)->SetObjectArrayElement(env, ipv6AddressArray, i, ipv6AddressObj);
1406  }
1407 
1408  returnArray = ipv6AddressArray;
1409 
1410 done:
1411  vppjni_unlock (jm);
1412  return returnArray;
1413 }
1414 
1416 {
1417  vppjni_main_t * jm = &vppjni_main;
1418 
1419  if (!jm->is_ipv6) {
1420  ipv4_address_t *address = 0;
1421  vec_add2(jm->ipv4_addresses, address, 1);
1422  clib_memcpy(&address->ip, mp->ip, 4);
1423  address->prefix_length = mp->prefix_length;
1424  } else {
1425  ipv6_address_t *address = 0;
1426  vec_add2(jm->ipv6_addresses, address, 1);
1427  clib_memcpy(address->ip, mp->ip, 16);
1428  address->prefix_length = mp->prefix_length;
1429  }
1430 }
1431 
1432 #define VXLAN_TUNNEL_INTERFACE_NAME_PREFIX "vxlan_tunnel"
1433 
1434 JNIEXPORT jobjectArray JNICALL Java_org_openvpp_vppjapi_vppConn_vxlanTunnelDump0
1435 (JNIEnv * env, jobject obj, jint swIfIndex)
1436 {
1437  vppjni_main_t *jm = &vppjni_main;
1439  jobjectArray returnArray = NULL;
1440  u32 my_context_id;
1441  f64 timeout;
1442  int rv = 0;
1443  int i;
1444 
1445  vppjni_lock (jm, 22);
1446 
1448 
1449  my_context_id = vppjni_get_context_id (jm);
1450  M(VXLAN_TUNNEL_DUMP, vxlan_tunnel_dump);
1451  mp->context = clib_host_to_net_u32 (my_context_id);
1452  mp->sw_if_index = clib_host_to_net_u32 (swIfIndex);
1453  S;
1454 
1455  /* Use a control ping for synchronization */
1456  {
1457  vl_api_control_ping_t * mp;
1458  M(CONTROL_PING, control_ping);
1459  S;
1460  }
1461 
1462  WNR;
1463  if (0 != rv) {
1464  goto done;
1465  }
1466 
1467  u32 count = vec_len(jm->vxlan_tunnel_details);
1468 
1469  jobjectArray vxlanTunnelDetailsArray = vppVxlanTunnelDetailsArray(env, count);
1470 
1471  for (i = 0; i < count; i++) {
1473 
1474 
1475  /* This interface to support both v4 and v6 addresses is nasty */
1476  jbyteArray src_address = (*env)->NewByteArray(env, 16);
1477  (*env)->SetByteArrayRegion(env, src_address, 0, 16,
1478  (signed char*)details->src_address);
1479 
1480  jbyteArray dst_address = (*env)->NewByteArray(env, 16);
1481  (*env)->SetByteArrayRegion(env, dst_address, 0, 16,
1482  (signed char*)details->dst_address);
1483 
1484  jint encap_vrf_id = details->encap_vrf_id;
1485  jint vni = details->vni;
1486  jint decap_next_index = details->decap_next_index;
1487  jboolean is_ipv6 = details->is_ipv6 ? 1 : 0;
1488 
1489  jobject vxlanTunnelDetailsObj = vppVxlanTunnelDetailsObject(env,
1490  src_address, dst_address, encap_vrf_id, vni,
1491  decap_next_index, is_ipv6);
1492 
1493  (*env)->SetObjectArrayElement(env, vxlanTunnelDetailsArray, i,
1494  vxlanTunnelDetailsObj);
1495  }
1496 
1497  returnArray = vxlanTunnelDetailsArray;
1498 
1499 done:
1500  vppjni_unlock (jm);
1501  return returnArray;
1502 }
1503 
1506 {
1507  vppjni_main_t * jm = &vppjni_main;
1508  vxlan_tunnel_details_t *tunnel_details;
1509 
1510  vec_add2(jm->vxlan_tunnel_details, tunnel_details, 1);
1511  if (mp->is_ipv6){
1512  u64 *s, *d;
1513 
1514  /* this is ugly - why is this in host order at all? -cluke */
1515  /* Per notes from Ole, Maros and Keith, this should all be
1516  * superceded with a new api builder soon, so this interface will
1517  * be short lived -cluke */
1518  s = (void *)mp->src_address;
1519  d = (void *)tunnel_details->src_address;
1520 #if CLIB_ARCH_IS_LITTLE_ENDIAN
1521  d[0] = clib_net_to_host_u64(s[1]);
1522  d[1] = clib_net_to_host_u64(s[0]);
1523 #else /* big endian */
1524  d[0] = s[0];
1525  d[1] = s[1];
1526 #endif
1527 
1528  s = (void *)mp->dst_address;
1529  d = (void *)tunnel_details->dst_address;
1530 #if CLIB_ARCH_IS_LITTLE_ENDIAN
1531  d[0] = clib_net_to_host_u64(s[1]);
1532  d[1] = clib_net_to_host_u64(s[0]);
1533 #else /* big endian */
1534  d[0] = s[0];
1535  d[1] = s[1];
1536 #endif
1537  } else {
1538  u32 *s, *d;
1539 
1540  /* the type changed from a u32 to u8[16] - this does
1541  * the same as dst = ntohl(src) with the u32 of a v4
1542  * address in the first 32 bits */
1543 
1544  s = (void *)mp->src_address;
1545  d = (void *)tunnel_details->src_address;
1546  d[0] = ntohl(s[0]);
1547 
1548  s = (void *)mp->dst_address;
1549  d = (void *)tunnel_details->dst_address;
1550  d[0] = ntohl(s[0]);
1551  }
1552  tunnel_details->encap_vrf_id = ntohl(mp->encap_vrf_id);
1553  tunnel_details->vni = ntohl(mp->vni);
1554  tunnel_details->decap_next_index = ntohl(mp->decap_next_index);
1555  tunnel_details->is_ipv6 = mp->is_ipv6;
1556 }
1557 
1558 /* cleanup handler for RX thread */
1559 static void cleanup_rx_thread(void *arg)
1560 {
1561  vppjni_main_t * jm = &vppjni_main;
1562 
1563  vppjni_lock (jm, 99);
1564 
1565  int getEnvStat = (*jm->jvm)->GetEnv(jm->jvm, (void **)&(jm->jenv), JNI_VERSION_1_6);
1566  if (getEnvStat == JNI_EVERSION) {
1567  clib_warning ("Unsupported JNI version\n");
1568  jm->retval = -999;
1569  goto out;
1570  } else if (getEnvStat != JNI_EDETACHED) {
1571  (*jm->jvm)->DetachCurrentThread(jm->jvm);
1572  }
1573 out:
1574  vppjni_unlock (jm);
1575 }
1576 
1577 static void
1579 {
1580  vppjni_main_t * jm = &vppjni_main;
1581  i32 retval = ntohl(mp->retval);
1582 
1583  if (retval >= 0) {
1584  DEBUG_LOG ("show version request succeeded(%d)");
1585  strncpy((char*)jm->program_name, (const char*)mp->program,
1586  sizeof(jm->program_name)-1);
1587  jm->program_name[sizeof(jm->program_name)-1] = 0;
1588 
1589  strncpy((char*)jm->build_directory, (const char*)mp->build_directory,
1590  sizeof(jm->build_directory)-1);
1591  jm->build_directory[sizeof(jm->build_directory)-1] = 0;
1592 
1593  strncpy((char*)jm->version, (const char*)mp->version,
1594  sizeof(jm->version)-1);
1595  jm->version[sizeof(jm->version)-1] = 0;
1596 
1597  strncpy((char*)jm->build_date, (const char*)mp->build_date,
1598  sizeof(jm->build_date)-1);
1599  jm->build_date[sizeof(jm->build_date)-1] = 0;
1600  } else {
1601  clib_error ("show version request failed(%d)", retval);
1602  }
1603  jm->retval = retval;
1604  jm->result_ready = 1;
1605 }
1606 
1608 {
1609  vppjni_main_t * jm = &vppjni_main;
1610  jm->retval = mp->retval; // FIXME: vpp api does not do ntohl on this retval
1611  jm->result_ready = 1;
1612 }
1613 
1614 // control ping needs to be very first thing called
1615 // to attach rx thread to java thread
1618 {
1619  vppjni_main_t * jm = &vppjni_main;
1620  i32 retval = ntohl(mp->retval);
1621  jm->retval = retval;
1622 
1623  // attach to java thread if not attached
1624  int getEnvStat = (*jm->jvm)->GetEnv(jm->jvm, (void **)&(jm->jenv), JNI_VERSION_1_6);
1625  if (getEnvStat == JNI_EDETACHED) {
1626  if ((*jm->jvm)->AttachCurrentThread(jm->jvm, (void **)&(jm->jenv), NULL) != 0) {
1627  clib_warning("Failed to attach thread\n");
1628  jm->retval = -999;
1629  goto out;
1630  }
1631 
1632  // workaround as we can't use pthread_cleanup_push
1633  pthread_key_create(&jm->cleanup_rx_thread_key, cleanup_rx_thread);
1634  // destructor is only called if the value of key is non null
1635  pthread_setspecific(jm->cleanup_rx_thread_key, (void *)1);
1636  } else if (getEnvStat == JNI_EVERSION) {
1637  clib_warning ("Unsupported JNI version\n");
1638  jm->retval = -999;
1639  goto out;
1640  }
1641  // jm->jenv is now stable global reference that can be reused (only within RX thread)
1642 
1643 #if 0
1644  // ! callback system removed for now
1645  //
1646  // get issuer msg-id
1647  p = hash_get (jm->ping_hash, context);
1648  if (p != 0) { // ping marks end of some dump call
1649  JNIEnv *env = jm->jenv;
1650  u16 msg_id = (u16)p[0];
1651 
1652  // we will no longer need this
1653  hash_unset (jm->ping_hash, context);
1654 
1655  // get original caller obj
1656  p = hash_get (jm->callback_hash, context);
1657 
1658  if (p == 0) // don't have callback stored
1659  goto out;
1660 
1661  jobject obj = (jobject)p[0]; // object that called original call
1662 
1663  switch (msg_id) {
1664  case VL_API_SW_INTERFACE_DUMP:
1665  if (0 != sw_if_dump_call_all_callbacks(obj)) {
1666  goto out2;
1667  }
1668  break;
1669  default:
1670  clib_warning("Unhandled control ping issuer msg-id: %d", msg_id);
1671  goto out2;
1672  break;
1673  }
1674 out2:
1675  // free the saved obj
1676  hash_unset (jm->callback_hash, context);
1677  // delete global reference
1678  (*env)->DeleteGlobalRef(env, obj);
1679  }
1680 #endif
1681 
1682 out:
1683  jm->result_ready = 1;
1684 }
1685 
1686 #define VPPJNI_DEBUG_COUNTERS 0
1687 
1690 {
1691  vppjni_main_t *jm = &vppjni_main;
1692  CLIB_UNUSED(char *counter_name);
1693  u32 count, sw_if_index;
1694  int i;
1695  static sw_interface_stats_t empty_stats = {0, };
1696 
1697  vppjni_lock (jm, 12);
1698  count = ntohl (mp->count);
1699  sw_if_index = ntohl (mp->first_sw_if_index);
1700  if (mp->is_combined == 0) {
1701  u64 * vp, v;
1702  vp = (u64 *) mp->data;
1703 
1704  for (i = 0; i < count; i++) {
1705  sw_interface_details_t *sw_if = NULL;
1706 
1707  v = clib_mem_unaligned (vp, u64);
1708  v = clib_net_to_host_u64 (v);
1709  vp++;
1710 
1711  if (sw_if_index < vec_len(jm->sw_if_table))
1712  sw_if = vec_elt_at_index(jm->sw_if_table, sw_if_index);
1713 
1714  if (sw_if /* && (sw_if->admin_up_down == 1)*/ && sw_if->interface_name[0] != 0) {
1715  vec_validate_init_empty(jm->sw_if_stats_by_sw_if_index, sw_if_index, empty_stats);
1717 
1718  s->sw_if_index = sw_if_index;
1719  s->valid = 1;
1720 
1721  switch (mp->vnet_counter_type) {
1723  counter_name = "drop";
1724  s->rx.pkts.discard = v;
1725  break;
1727  counter_name = "punt";
1728  s->rx.pkts.unknown_proto = v;
1729  break;
1731  counter_name = "ip4";
1732  s->rx.pkts.ip4 = v;
1733  break;
1735  counter_name = "ip6";
1736  s->rx.pkts.ip6 = v;
1737  break;
1739  counter_name = "rx-no-buf";
1740  s->rx.pkts.fifo_full = v;
1741  break;
1743  counter_name = "rx-miss";
1744  s->rx.pkts.miss = v;
1745  break;
1747  counter_name = "rx-error";
1748  s->rx.pkts.error = v;
1749  break;
1751  counter_name = "tx-error (fifo-full)";
1752  s->tx.pkts.fifo_full = v;
1753  break;
1754  default:
1755  counter_name = "bogus";
1756  break;
1757  }
1758 
1759 #if VPPJNI_DEBUG_COUNTERS == 1
1760  clib_warning ("%s (%d): %s (%lld)\n", sw_if->interface_name, s->sw_if_index,
1761  counter_name, v);
1762 #endif
1763  }
1764  sw_if_index++;
1765  }
1766  } else {
1767  vlib_counter_t *vp;
1768  u64 packets, bytes;
1769  vp = (vlib_counter_t *) mp->data;
1770 
1771  for (i = 0; i < count; i++) {
1772  sw_interface_details_t *sw_if = NULL;
1773 
1774  packets = clib_mem_unaligned (&vp->packets, u64);
1775  packets = clib_net_to_host_u64 (packets);
1776  bytes = clib_mem_unaligned (&vp->bytes, u64);
1777  bytes = clib_net_to_host_u64 (bytes);
1778  vp++;
1779 
1780  if (sw_if_index < vec_len(jm->sw_if_table))
1781  sw_if = vec_elt_at_index(jm->sw_if_table, sw_if_index);
1782 
1783  if (sw_if /* && (sw_if->admin_up_down == 1) */ && sw_if->interface_name[0] != 0) {
1784  vec_validate_init_empty(jm->sw_if_stats_by_sw_if_index, sw_if_index, empty_stats);
1786 
1787  s->valid = 1;
1788  s->sw_if_index = sw_if_index;
1789 
1790  switch (mp->vnet_counter_type) {
1792  s->rx.pkts.unicast = packets;
1793  s->rx.octets = bytes;
1794  counter_name = "rx";
1795  break;
1796 
1798  s->tx.pkts.unicast = packets;
1799  s->tx.octets = bytes;
1800  counter_name = "tx";
1801  break;
1802 
1803  default:
1804  counter_name = "bogus";
1805  break;
1806  }
1807 
1808 #if VPPJNI_DEBUG_COUNTERS == 1
1809  clib_warning ("%s (%d): %s.packets %lld\n",
1810  sw_if->interface_name,
1811  sw_if_index, counter_name, packets);
1812  clib_warning ("%s (%d): %s.bytes %lld\n",
1813  sw_if->interface_name,
1814  sw_if_index, counter_name, bytes);
1815 #endif
1816  }
1817  sw_if_index++;
1818  }
1819  }
1820  vppjni_unlock (jm);
1821 }
1822 
1823 jint JNI_OnLoad(JavaVM *vm, void *reserved) {
1824  vppjni_main_t * jm = &vppjni_main;
1825  JNIEnv* env;
1826  if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_6) != JNI_OK) {
1827  return JNI_ERR;
1828  }
1829 
1830  if (vppjni_init(env) != 0) {
1831  return JNI_ERR;
1832  }
1833 
1834  jm->jvm = vm;
1835  return JNI_VERSION_1_6;
1836 }
1837 
1838 void JNI_OnUnload(JavaVM *vm, void *reserved) {
1839  vppjni_main_t * jm = &vppjni_main;
1840  JNIEnv* env;
1841  if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_6) != JNI_OK) {
1842  return;
1843  }
1844 
1845  vppjni_uninit(env);
1846 
1847  jm->jenv = NULL;
1848  jm->jvm = NULL;
1849 }
1850 
1851 #define foreach_vpe_api_msg \
1852 _(CONTROL_PING_REPLY, control_ping_reply) \
1853 _(SW_INTERFACE_DETAILS, sw_interface_details) \
1854 _(SHOW_VERSION_REPLY, show_version_reply) \
1855 _(WANT_STATS_REPLY, want_stats_reply) \
1856 _(VNET_INTERFACE_COUNTERS, vnet_interface_counters) \
1857 _(SW_INTERFACE_SET_FLAGS, sw_interface_set_flags) \
1858 _(BRIDGE_DOMAIN_DETAILS, bridge_domain_details) \
1859 _(BRIDGE_DOMAIN_SW_IF_DETAILS, bridge_domain_sw_if_details) \
1860 _(L2_FIB_TABLE_ENTRY, l2_fib_table_entry) \
1861 _(IP_ADDRESS_DETAILS, ip_address_details) \
1862 _(VXLAN_TUNNEL_DETAILS, vxlan_tunnel_details)
1863 
1864 static int connect_to_vpe(char *name)
1865 {
1866  vppjni_main_t * jm = &vppjni_main;
1867  api_main_t * am = &api_main;
1868 
1869  if (vl_client_connect_to_vlib("/vpe-api", name, 32) < 0)
1870  return -1;
1871 
1872  jm->my_client_index = am->my_client_index;
1874 
1875 #define _(N,n) \
1876  vl_msg_api_set_handlers(VL_API_##N, #n, \
1877  vl_api_##n##_t_handler, \
1878  vl_noop_handler, \
1879  vl_api_##n##_t_endian, \
1880  vl_api_##n##_t_print, \
1881  sizeof(vl_api_##n##_t), 1);
1883 #undef _
1884 
1885  return 0;
1886 }
1887 
1888 /* Format an IP6 address. */
1889 u8 * format_ip6_address (u8 * s, va_list * args)
1890 {
1891  ip6_address_t * a = va_arg (*args, ip6_address_t *);
1892  u32 max_zero_run = 0, this_zero_run = 0;
1893  int max_zero_run_index = -1, this_zero_run_index=0;
1894  int in_zero_run = 0, i;
1895  int last_double_colon = 0;
1896 
1897  /* Ugh, this is a pain. Scan forward looking for runs of 0's */
1898  for (i = 0; i < ARRAY_LEN (a->as_u16); i++) {
1899  if (a->as_u16[i] == 0) {
1900  if (in_zero_run) {
1901  this_zero_run++;
1902  } else {
1903  in_zero_run = 1;
1904  this_zero_run =1;
1905  this_zero_run_index = i;
1906  }
1907  } else {
1908  if (in_zero_run) {
1909  /* offer to compress the biggest run of > 1 zero */
1910  if (this_zero_run > max_zero_run && this_zero_run > 1) {
1911  max_zero_run_index = this_zero_run_index;
1912  max_zero_run = this_zero_run;
1913  }
1914  }
1915  in_zero_run = 0;
1916  this_zero_run = 0;
1917  }
1918  }
1919 
1920  if (in_zero_run) {
1921  if (this_zero_run > max_zero_run && this_zero_run > 1) {
1922  max_zero_run_index = this_zero_run_index;
1923  max_zero_run = this_zero_run;
1924  }
1925  }
1926 
1927  for (i = 0; i < ARRAY_LEN (a->as_u16); i++) {
1928  if (i == max_zero_run_index) {
1929  s = format (s, "::");
1930  i += max_zero_run - 1;
1931  last_double_colon = 1;
1932  } else {
1933  s = format (s, "%s%x",
1934  (last_double_colon || i == 0) ? "" : ":",
1935  clib_net_to_host_u16 (a->as_u16[i]));
1936  last_double_colon = 0;
1937  }
1938  }
1939 
1940  return s;
1941 }
1942 
1943 /* Format an IP4 address. */
1944 u8 * format_ip4_address (u8 * s, va_list * args)
1945 {
1946  u8 * a = va_arg (*args, u8 *);
1947  return format (s, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]);
1948 }
1949 
1950 
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
Definition: vec.h:394
jint JNI_OnLoad(JavaVM *vm, void *reserved)
Definition: vppjni.c:1823
int vl_client_connect_to_vlib(char *svm_name, char *client_name, int rx_queue_size)
struct l2fib_u64_mac_t::@183::@185 fields
static void vl_api_bridge_domain_details_t_handler(vl_api_bridge_domain_details_t *mp)
Definition: vppjni.c:984
BIND_JAPI_STRING_FIELD(vppBridgeDomainDetails, name)
Want Stats, register for stats updates.
Definition: vpe.api:604
sw_interface_details_t * sw_if_table
Definition: vppjni.h:175
#define hash_set(h, key, value)
Definition: hash.h:237
#define DEBUG_LOG(...)
Definition: vppjni.c:49
sll srl srl sll sra u16x4 i
Definition: vector_sse2.h:267
#define CLIB_UNUSED(x)
Definition: clib.h:79
ipv4_address_t * ipv4_addresses
Definition: vppjni.h:193
vxlan_tunnel_details_t * vxlan_tunnel_details
Definition: vppjni.h:198
pthread_key_t cleanup_rx_thread_key
Definition: vppjni.h:151
vjbd_main_t vjbd_main
Definition: vppjni.h:208
#define hash_unset(h, key)
Definition: hash.h:243
#define W
Definition: vppjni.h:283
a
Definition: bitmap.h:393
u8 version[32]
Definition: vppjni.h:186
Set flags on the interface.
Definition: vpe.api:127
Control ping from client to api server request.
Definition: vpe.api:1058
static jobject l2_fib_create_object(JNIEnv *env, bd_l2fib_oper_t *l2_fib)
Definition: vppjni.c:1161
int size
Definition: api.h:68
Reply for Want Stats request.
Definition: vpe.api:615
void vl_client_disconnect_from_vlib(void)
vppjni_main_t vppjni_main
Definition: vppjni.h:211
unix_shared_memory_queue_t * vl_input_queue
Definition: api.h:71
int my_client_index
Definition: api.h:148
static int jm_show_version(vppjni_main_t *jm)
Definition: vppjni.c:189
uword * bd_id_by_sw_if_index
#define NULL
Definition: clib.h:55
u8 interface_name[64]
Definition: vppjni.h:34
L2 bridge domain sw interface operational state response.
Definition: vpe.api:2603
static void vl_api_ip_address_details_t_handler(vl_api_ip_address_details_t *mp)
Definition: vppjni.c:1415
#define clib_error(format, args...)
Definition: error.h:62
static void vl_api_sw_interface_details_t_handler(vl_api_sw_interface_details_t *mp)
Definition: vppjni.c:810
#define vec_terminate_c_string(V)
(If necessary) NULL terminate a vector containing a c-string.
Definition: vec.h:932
add_epi add_epi sub
Definition: vector_sse2.h:217
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
Definition: vec.h:480
#define vec_add2(V, P, N)
Add N elements to end of vector V, return pointer to new elements in P.
Definition: vec.h:519
#define hash_set_mem(h, key, value)
Definition: hash.h:257
static const char * interface_name_from_sw_if_index(u32 sw_if_index)
Definition: vppjni.c:1042
static jintArray create_array_of_bd_ids(JNIEnv *env, jint bd_id)
Definition: vppjni.c:899
JNIEXPORT void JNICALL Java_org_openvpp_vppjapi_vppConn_clearInterfaceTable0(JNIEnv *env, jobject obj)
Definition: vppjni.c:608
L2 bridge domain request operational state details.
Definition: vpe.api:2571
static void vppjni_unlock(vppjni_main_t *jm)
Definition: vppjni.h:228
JNIEXPORT jintArray JNICALL Java_org_openvpp_vppjapi_vppConn_bridgeDomainDump0(JNIEnv *env, jobject obj, jint bd_id)
Definition: vppjni.c:942
#define MHEAP_FLAG_THREAD_SAFE
int vppjni_init(JNIEnv *env)
Definition: vppjni_env.c:51
clib_time_t clib_time
Definition: vppjni.h:159
u8 * heap
Definition: vppjni.h:201
trace_cfg_t * api_trace_cfg
Definition: api.h:121
#define vec_reset_length(v)
Reset vector length to zero NULL-pointer tolerant.
static int vppjni_sanity_check(vppjni_main_t *jm)
Definition: vppjni.h:240
#define foreach_vpe_api_msg
Definition: vppjni.c:1851
u8 * format_ip4_address(u8 *s, va_list *args)
Definition: vppjni.c:1944
api_main_t api_main
Definition: api.h:162
BIND_JAPI_BOOL_FIELD(vppBridgeDomainDetails, arpTerm)
u32 bd_id
Definition: vpe.api:2095
u32 saved_reply_count
Definition: vppjni.h:166
JNIEXPORT jint JNICALL Java_org_openvpp_vppjapi_vppConn_getRetval0(JNIEnv *env, jobject obj, jint context, jint release)
Definition: vppjni.c:432
L2 bridge domain operational state response.
Definition: vpe.api:2586
void vppjni_uninit(JNIEnv *env)
Definition: vppjni_env.c:94
always_inline void * clib_mem_get_per_cpu_heap(void)
Definition: mem.h:54
static void vl_api_l2_fib_table_entry_t_handler(vl_api_l2_fib_table_entry_t *mp)
Definition: vppjni.c:1244
sw_interface_stats_t * sw_if_stats_by_sw_if_index
Definition: vppjni.h:172
BIND_JAPI_OBJ_FIELD(vppBridgeDomainDetails, interfaces,"[Lorg/openvpp/vppjapi/vppBridgeDomainInterfaceDetails;")
JNIEXPORT jobject JNICALL Java_org_openvpp_vppjapi_vppConn_getInterfaceCounters0(JNIEnv *env, jobject obj, jint swIfIndex)
Definition: vppjni.c:546
int i32
Definition: types.h:81
uword * ping_hash
Definition: vppjni.h:156
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
always_inline uword mhash_elts(mhash_t *m)
Definition: mhash.h:129
uword * callback_hash
Definition: vppjni.h:155
packet_counters_t pkts
Definition: vppjni.h:116
#define clib_warning(format, args...)
Definition: error.h:59
unsigned long u64
Definition: types.h:89
static int sw_interface_dump(vppjni_main_t *jm)
Definition: vppjni.c:96
struct vl_shmem_hdr_ * shmem_hdr
Definition: api.h:125
static void vl_api_vxlan_tunnel_details_t_handler(vl_api_vxlan_tunnel_details_t *mp)
Definition: vppjni.c:1505
BIND_JAPI_BYTE_FIELD(vppBridgeDomainInterfaceDetails, splitHorizonGroup)
always_inline mheap_t * mheap_header(u8 *v)
static void vl_api_control_ping_reply_t_handler(vl_api_control_ping_reply_t *mp)
Definition: vppjni.c:1617
#define hash_create_string(elts, value_bytes)
Definition: hash.h:609
static void vl_api_vnet_interface_counters_t_handler(vl_api_vnet_interface_counters_t *mp)
Definition: vppjni.c:1689
#define M(T, t)
Definition: vppjni.h:260
static void vl_api_show_version_reply_t_handler(vl_api_show_version_reply_t *mp)
Definition: vppjni.c:1578
Dump l2 fib (aka bridge domain) table.
Definition: vpe.api:2107
l2fib_u64_mac_t mac_addr
static_always_inline void vjbd_main_init(vjbd_main_t *bdm)
#define hash_get(h, key)
Definition: hash.h:231
JNIEXPORT jstring JNICALL Java_org_openvpp_vppjapi_vppConn_interfaceNameFromSwIfIndex0(JNIEnv *env, jobject obj, jint swIfIndex)
Definition: vppjni.c:579
static void cleanup_rx_thread(void *arg)
Definition: vppjni.c:1559
u64 mac
Definition: vpe.api:2096
JNIEXPORT jobject JNICALL Java_org_openvpp_vppjapi_vppConn_getVppVersion0(JNIEnv *env, jobject obj)
Definition: vppjni.c:175
static void vppjni_lock(vppjni_main_t *jm, u32 tag)
Definition: vppjni.h:221
uword mhash_set_mem(mhash_t *h, void *key, uword *new_value, uword *old_value)
Definition: mhash.c:272
BIND_JAPI_INT_FIELD(vppBridgeDomainDetails, bdId)
JNIEXPORT jobjectArray JNICALL Java_org_openvpp_vppjapi_vppConn_swInterfaceDump0(JNIEnv *env, jobject obj, jbyte name_filter_valid, jbyteArray name_filter)
Definition: vppjni.c:622
JNIEXPORT void JNICALL Java_org_openvpp_vppjapi_vppConn_clientDisconnect(JNIEnv *env, jobject obj)
Definition: vppjni.c:384
u8 prefix_length
Definition: vppjni.h:98
u8 program_name[32]
Definition: vppjni.h:184
#define hash_free(h)
Definition: hash.h:269
JNIEnv * jenv
Definition: vppjni.h:153
volatile u32 result_ready
Definition: vppjni.h:146
static int ipAddressDump(JNIEnv *env, jobject obj, jstring interfaceName, jboolean isIPv6)
Definition: vppjni.c:1284
api_main_t * api_main
Definition: vppjni.h:205
static_always_inline u32 vjbd_id_from_name(vjbd_main_t *bdm, const u8 *bd_name)
#define S
Definition: vppjni.h:280
void clib_time_init(clib_time_t *c)
Definition: time.c:160
u8 * format_ip6_address(u8 *s, va_list *args)
Definition: vppjni.c:1889
volatile u32 context_id_received
Definition: vppjni.h:139
static int connect_to_vpe(char *name)
Definition: vppjni.c:1864
u8 bvi_mac
Definition: vpe.api:2100
static int name_sort_cmp(void *a1, void *a2)
Definition: vppjni.c:469
uword * sw_if_config_by_sw_if_index
Definition: vppjni.h:177
void * clib_mem_init(void *heap, uword size)
Definition: mem_mheap.c:65
static void vl_api_want_stats_reply_t_handler(vl_api_want_stats_reply_t *mp)
Definition: vppjni.c:1607
u8 sub_inner_vlan_id_any
Definition: vppjni.h:78
vjbd_oper_t * bd_oper
JNIEXPORT jint JNICALL Java_org_openvpp_vppjapi_vppConn_clientConnect(JNIEnv *env, jobject obj, jstring clientName)
Definition: vppjni.c:302
void vl_api_generic_reply_handler(vl_api_generic_reply_t *mp)
Definition: vppjni.c:395
bd_sw_if_oper_t * bd_sw_if_oper
u32 * sw_if_dump_if_indices
Definition: vppjni.h:181
void mhash_init(mhash_t *h, uword n_value_bytes, uword n_key_bytes)
Definition: mhash.c:169
always_inline void * clib_mem_alloc(uword size)
Definition: mem.h:109
static void bridge_domain_oper_free(void)
Definition: vppjni.c:927
#define vec_free(V)
Free vector&#39;s memory (no header).
Definition: vec.h:298
static_always_inline u32 vjbd_find_or_add_bd(vjbd_main_t *bdm, u8 *bd_name)
#define clib_memcpy(a, b, c)
Definition: string.h:63
volatile i32 retval
Definition: vppjni.h:147
#define ARRAY_LEN(x)
Definition: clib.h:59
static_always_inline u8 * vjbd_oper_name_from_id(vjbd_main_t *bdm, u32 bd_id)
#define vec_validate_init_c_string(V, S, L)
Make a vector containing a NULL terminated c-string.
Definition: vec.h:909
u32 sw_if_index
Definition: vpe.api:2097
#define hash_create(elts, value_bytes)
Definition: hash.h:615
JNIEXPORT jint JNICALL Java_org_openvpp_vppjapi_vppConn_bridgeDomainIdFromInterfaceName0(JNIEnv *env, jobject obj, jstring interfaceName)
Definition: vppjni.c:775
JavaVM * jvm
Definition: vppjni.h:154
l2 fib table entry structure
Definition: vpe.api:2093
#define ASSERT(truth)
if_counters_t rx
Definition: vppjni.h:122
unsigned int u32
Definition: types.h:88
JNIEXPORT jobject JNICALL Java_org_openvpp_vppjapi_vppConn_getBridgeDomainDetails0(JNIEnv *env, jobject obj, jint bdId)
Definition: vppjni.c:1056
static u32 vppjni_get_context_id(vppjni_main_t *jm)
Definition: vppjni.h:214
u64 octets
Definition: vppjni.h:115
JNIEXPORT jstring JNICALL Java_org_openvpp_vppjapi_vppConn_getInterfaceList0(JNIEnv *env, jobject obj, jstring name_filter)
Definition: vppjni.c:478
u8 * format(u8 *s, char *fmt,...)
Definition: format.c:405
void JNI_OnUnload(JavaVM *vm, void *reserved)
Definition: vppjni.c:1838
static int jm_stats_enable_disable(vppjni_main_t *jm, u8 enable)
Definition: vppjni.c:204
JNIEXPORT jobjectArray JNICALL Java_org_openvpp_vppjapi_vppConn_l2FibTableDump0(JNIEnv *env, jobject obj, jint bd_id)
Definition: vppjni.c:1185
JNIEXPORT jobjectArray JNICALL Java_org_openvpp_vppjapi_vppConn_ipv6AddressDump0(JNIEnv *env, jobject obj, jstring interfaceName)
Definition: vppjni.c:1375
Control ping from the client to the server response.
Definition: vpe.api:1069
u8 build_directory[256]
Definition: vppjni.h:185
uword * oper_bd_index_by_bd_id
show version
Definition: vpe.api:2012
BIND_JAPI_CLASS(vppBridgeDomainDetails,"()V")
#define MAC_ADDRESS_SIZE
static void vl_api_sw_interface_set_flags_t_handler(vl_api_sw_interface_set_flags_t *mp)
Definition: vppjni.c:894
void vl_client_add_api_signatures(vl_api_memclnt_create_t *mp)
Definition: vppjni.c:86
JNIEXPORT jint JNICALL Java_org_openvpp_vppjapi_vppConn_findOrAddBridgeDomainId0(JNIEnv *env, jobject obj, jstring bridgeDomain)
Definition: vppjni.c:732
u64 uword
Definition: types.h:112
mhash_t l2fib_index_by_mac
uword * sw_if_index_by_interface_name
Definition: vppjni.h:169
u8 * desc
Definition: vppjni.h:88
u8 static_mac
Definition: vpe.api:2098
unsigned short u16
Definition: types.h:57
u8 is_connected
Definition: vppjni.h:162
u8 ip[16]
Definition: vppjni.h:97
sw_interface_subif_t * sw_if_subif_table
Definition: vppjni.h:190
JNIEXPORT jint JNICALL Java_org_openvpp_vppjapi_vppConn_bridgeDomainIdFromName0(JNIEnv *env, jobject obj, jstring bridgeDomain)
Definition: vppjni.c:753
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
double f64
Definition: types.h:140
unsigned char u8
Definition: types.h:56
#define hash_foreach_pair(p, v, body)
Definition: hash.h:311
u8 prefix_length
Definition: vppjni.h:93
#define vec_sort_with_function(vec, f)
Sort a vector using the supplied element comparison function.
Definition: vec.h:898
u8 build_date[32]
Definition: vppjni.h:187
always_inline u64 l2fib_mac_to_u64(u8 *mac_address)
#define WNR
Definition: vppjni.h:296
unix_shared_memory_queue_t * vl_input_queue
Definition: vppjni.h:204
show version response
Definition: vpe.api:2024
Want stats counters structure.
Definition: vpe.api:627
#define clib_mem_unaligned(pointer, type)
Definition: types.h:153
#define hash_get_mem(h, key)
Definition: hash.h:251
if_counters_t tx
Definition: vppjni.h:123
JNIEXPORT jstring JNICALL Java_org_openvpp_vppjapi_vppConn_getInterfaceDescription0(JNIEnv *env, jobject obj, jstring ifName)
Definition: vppjni.c:270
JNIEXPORT jint JNICALL Java_org_openvpp_vppjapi_vppConn_swIfIndexFromName0(JNIEnv *env, jobject obj, jstring interfaceName)
Definition: vppjni.c:522
static jobjectArray sw_if_dump_get_interfaces()
#define vec_foreach(var, vec)
Vector iterator.
uword * reply_hash
Definition: vppjni.h:165
u16 as_u16[8]
Definition: ip6_packet.h:48
u8 collect_indices
Definition: vppjni.h:180
u8 filter_mac
Definition: vpe.api:2099
bd_l2fib_oper_t * l2fib_oper
Interface details structure (fix this)
Definition: vpe.api:69
#define vec_validate_init_empty(V, I, INIT)
Make sure vector is long enough for given index and initialize empty space (no header, unspecified alignment)
Definition: vec.h:443
ipv6_address_t * ipv6_addresses
Definition: vppjni.h:194
u8 * name
Definition: vppjni.h:27
static void vl_api_bridge_domain_sw_if_details_t_handler(vl_api_bridge_domain_sw_if_details_t *mp)
Definition: vppjni.c:1013
u8 sub_outer_vlan_id_any
Definition: vppjni.h:77
JNIEXPORT jobjectArray JNICALL Java_org_openvpp_vppjapi_vppConn_ipv4AddressDump0(JNIEnv *env, jobject obj, jstring interfaceName)
Definition: vppjni.c:1337
JNIEXPORT jobjectArray JNICALL Java_org_openvpp_vppjapi_vppConn_vxlanTunnelDump0(JNIEnv *env, jobject obj, jint swIfIndex)
Definition: vppjni.c:1435
JNIEXPORT jint JNICALL Java_org_openvpp_vppjapi_vppConn_setInterfaceDescription0(JNIEnv *env, jobject obj, jstring ifName, jstring ifDesc)
Definition: vppjni.c:227
u32 my_client_index
Definition: vppjni.h:206