aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/lacp/lacp_test.c
blob: 3a5e63516936b6b248721fa7b889e643be211f37 (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
/*
 * lacp VAT support
 *
 * Copyright (c) 2017 Cisco and/or its affiliates.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <inttypes.h>

#include <vat/vat.h>
#include <vlibapi/api.h>
#include <vlibmemory/api.h>

#include <vppinfra/error.h>
#include <lacp/node.h>

#define __plugin_msg_base lacp_test_main.msg_id_base
#include <vlibapi/vat_helper_macros.h>

/* declare message IDs */
#include <vnet/format_fns.h>
#include <lacp/lacp.api_enum.h>
#include <lacp/lacp.api_types.h>
#include <vpp/api/vpe.api_types.h>

typedef struct
{
  /* API message ID base */
  u16 msg_id_base;
  u32 ping_id;
  vat_main_t *vat_main;
} lacp_test_main_t;

lacp_test_main_t lacp_test_main;

/* lacp-dump API */
static void vl_api_sw_interface_lacp_details_t_handler
  (vl_api_sw_interface_lacp_details_t * mp)
{
  vat_main_t *vam = &vat_main;

  fformat (vam->ofp,
	   "%-25s %-12d %-16s %3x %3x %3x %3x %3x %3x %3x %3x "
	   "%4x %3x %3x %3x %3x %3x %3x %3x\n",
	   mp->interface_name, ntohl (mp->sw_if_index),
	   mp->bond_interface_name,
	   lacp_bit_test (mp->actor_state, 7),
	   lacp_bit_test (mp->actor_state, 6),
	   lacp_bit_test (mp->actor_state, 5),
	   lacp_bit_test (mp->actor_state, 4),
	   lacp_bit_test (mp->actor_state, 3),
	   lacp_bit_test (mp->actor_state, 2),
	   lacp_bit_test (mp->actor_state, 1),
	   lacp_bit_test (mp->actor_state, 0),
	   lacp_bit_test (mp->partner_state, 7),
	   lacp_bit_test (mp->partner_state, 6),
	   lacp_bit_test (mp->partner_state, 5),
	   lacp_bit_test (mp->partner_state, 4),
	   lacp_bit_test (mp->partner_state, 3),
	   lacp_bit_test (mp->partner_state, 2),
	   lacp_bit_test (mp->partner_state, 1),
	   lacp_bit_test (mp->partner_state, 0));
  fformat (vam->ofp,
	   "  LAG ID: [(%04x,%02x-%02x-%02x-%02x-%02x-%02x,%04x,%04x,%04x), "
	   "(%04x,%02x-%02x-%02x-%02x-%02x-%02x,%04x,%04x,%04x)]\n",
	   ntohs (mp->actor_system_priority), mp->actor_system[0],
	   mp->actor_system[1], mp->actor_system[2], mp->actor_system[3],
	   mp->actor_system[4], mp->actor_system[5], ntohs (mp->actor_key),
	   ntohs (mp->actor_port_priority), ntohs (mp->actor_port_number),
	   ntohs (mp->partner_system_priority), mp->partner_system[0],
	   mp->partner_system[1], mp->partner_system[2],
	   mp->partner_system[3], mp->partner_system[4],
	   mp->partner_system[5], ntohs (mp->partner_key),
	   ntohs (mp->partner_port_priority),
	   ntohs (mp->partner_port_number));
  fformat (vam->ofp,
	   "  RX-state: %U, TX-state: %U, MUX-state: %U, PTX-state: %U\n",
	   format_rx_sm_state, ntohl (mp->rx_state), format_tx_sm_state,
	   ntohl (mp->tx_state), format_mux_sm_state, ntohl (mp->mux_state),
	   format_ptx_sm_state, ntohl (mp->ptx_state));
}

static int
api_sw_interface_lacp_dump (vat_main_t * vam)
{
  lacp_test_main_t *lm = &lacp_test_main;
  vl_api_sw_interface_lacp_dump_t *mp;
  vl_api_control_ping_t *mp_ping;
  int ret;

  if (vam->json_output)
    {
      clib_warning ("JSON output not supported for sw_interface_lacp_dump");
      return -99;
    }

  fformat (vam->ofp, "%-55s %-32s %-32s\n", " ", "actor state",
	   "partner state");
  fformat (vam->ofp, "%-25s %-12s %-16s %-31s  %-31s\n", "interface name",
	   "sw_if_index", "bond interface", "exp/def/dis/col/syn/agg/tim/act",
	   "exp/def/dis/col/syn/agg/tim/act");

  /* Get list of lacp interfaces */
  M (SW_INTERFACE_LACP_DUMP, mp);
  S (mp);

  /* Use a control ping for synchronization */
  if (!lm->ping_id)
    lm->ping_id = vl_msg_api_get_msg_index ((u8 *) (VL_API_CONTROL_PING_CRC));
  mp_ping = vl_msg_api_alloc_as_if_client (sizeof (*mp_ping));
  mp_ping->_vl_msg_id = htons (lm->ping_id);
  mp_ping->client_index = vam->my_client_index;

  fformat (vam->ofp, "Sending ping id=%d\n", lm->ping_id);

  vam->result_ready = 0;
  S (mp_ping);

  W (ret);
  return ret;
}

#include <lacp/lacp.api_test.c>

/*
 * fd.io coding-style-patch-verification: ON
 *
 * Local Variables:
 * eval: (c-set-style "gnu")
 * End:
 */
nfigs # mkdir -p -m755 %{buildroot}%{_sysconfdir}/vpp mkdir -p -m755 %{buildroot}%{_sysconfdir}/sysctl.d install -p -m 644 %{_vpp_build_dir}/../extras/rpm/vpp.service %{buildroot}%{_unitdir} install -p -m 644 %{_vpp_build_dir}/../src/vpp/conf/startup.conf %{buildroot}%{_sysconfdir}/vpp/startup.conf install -p -m 644 %{_vpp_build_dir}/../src/vpp/conf/80-vpp.conf %{buildroot}%{_sysconfdir}/sysctl.d # # libraries # mkdir -p -m755 %{buildroot}%{_libdir} mkdir -p -m755 %{buildroot}%{_sysconfdir}/bash_completion.d mkdir -p -m755 %{buildroot}%{_datadir}/vpp for file in $(find %{_vpp_install_dir}/*/lib* -type f -name '*.so.*.*.*' -print ) do install -p -m 755 $file %{buildroot}%{_libdir} done for file in $(cd %{buildroot}%{_libdir} && find . -type f -print | sed -e 's/^\.\///') do # make lib symlinks ( cd %{buildroot}%{_libdir} && ln -fs $file $(echo $file | sed -e 's/\(\.so\.[0-9]\+\).*/\1/') ) ( cd %{buildroot}%{_libdir} && ln -fs $file $(echo $file | sed -e 's/\(\.so\)\.[0-9]\+.*/\1/') ) done for file in $(find %{_vpp_install_dir}/vpp/share/vpp/api -type f -name '*.api.json' -print ) do install -p -m 644 $file %{buildroot}%{_datadir}/vpp/api done # Lua bindings mkdir -p -m755 %{buildroot}%{_datadir}/doc/vpp/examples/lua/examples/cli mkdir -p -m755 %{buildroot}%{_datadir}/doc/vpp/examples/lua/examples/lute for file in $(cd %{_vpp_install_dir}/../../src/vpp-api/lua && git ls-files .) do install -p -m 644 %{_vpp_install_dir}/../../src/vpp-api/lua/$file \ %{buildroot}%{_datadir}/doc/vpp/examples/lua/$file done # Java bindings mkdir -p -m755 %{buildroot}%{_datadir}/java for file in $(find %{_vpp_install_dir}/japi/share/java -type f -name '*.jar' -print ) do install -p -m 644 $file %{buildroot}%{_datadir}/java done # Python bindings cd %{_vpp_build_dir}/../src/vpp-api/python && %{py2_install} mkdir -p -m755 %{buildroot}%{python_sitelib}/vpp_papi for file in $(find %{_vpp_install_dir}/*/lib/python2.7/site-packages/ -type f -print | grep -v pyc | grep -v pyo) do install -p -m755 $file %{buildroot}%{python_sitelib}/vpp_papi/ done chmod -x %{buildroot}%{python_sitelib}/vpp_papi/*.txt # # devel # for dir in $(find %{_vpp_install_dir}/*/include/ -maxdepth 0 -type d -print | grep -v dpdk) do for subdir in $(cd ${dir} && find . -type d -print) do mkdir -p -m755 %{buildroot}%{_includedir}/${subdir} done for file in $(cd ${dir} && find . -type f -print) do install -p -m 644 $dir/$file %{buildroot}%{_includedir}/$file done done mkdir -p -m755 %{buildroot}%{python_sitelib}/jvppgen install -p -m755 %{_vpp_build_dir}/../extras/japi/java/jvpp/gen/jvpp_gen.py %{buildroot}%{_prefix}/bin for i in $(ls %{_vpp_build_dir}/../extras/japi/java/jvpp/gen/jvppgen/*.py); do install -p -m755 ${i} %{buildroot}%{python_sitelib}/jvppgen done; # sample plugin mkdir -p -m755 %{buildroot}%{_datadir}/doc/vpp/examples/sample-plugin/sample for file in $(cd %{_vpp_install_dir}/../../sample-plugin && find -type f -print) do install -p -m 644 %{_vpp_install_dir}/../../sample-plugin/$file \ %{buildroot}%{_datadir}/doc/vpp/examples/sample-plugin/$file done # # vpp-plugins # mkdir -p -m755 %{buildroot}%{_libdir}/vpp_plugins mkdir -p -m755 %{buildroot}%{_libdir}/vpp_api_test_plugins for file in $(cd %{_vpp_plugins_lib_dir}/vpp_plugins && find -type f -print) do install -p -m 644 %{_vpp_plugins_lib_dir}/vpp_plugins/$file \ %{buildroot}/%{_libdir}/vpp_plugins/$file done for file in $(cd %{_vpp_plugins_lib_dir}/vpp_api_test_plugins && find -type f -print) do install -p -m 644 %{_vpp_plugins_lib_dir}/vpp_api_test_plugins/$file \ %{buildroot}/%{_libdir}/vpp_api_test_plugins/$file done for file in $(find %{_vpp_install_dir}/plugins -type f -name '*.api.json' -print ) do install -p -m 644 $file %{buildroot}%{_datadir}/vpp/api done # # remove RPATH from ELF binaries # %{_vpp_build_dir}/scripts/remove-rpath %{buildroot} export NO_BRP_CHECK_RPATH=true %post %service_add_post vpp.service %post -n %{lname} -p /sbin/ldconfig %preun %service_del_preun vpp.service %postun %service_del_postun vpp.service %postun -n %{lname} -p /sbin/ldconfig %files %{_unitdir}/vpp.service %{_bindir}/vpp* %{_bindir}/svm* %{_bindir}/elftool %dir %{_sysconfdir}/vpp %config %{_sysconfdir}/sysctl.d/80-vpp.conf %config %{_sysconfdir}/vpp/startup.conf %license LICENSE %files -n %{lname} %exclude %{_libdir}/vpp_plugins %exclude %{_libdir}/vpp_api_test_plugins %{_libdir}/*.so.* %files api-lua %{_datadir}/doc/vpp/examples/lua %files api-java %{_datadir}/java/* %files api-python %dir %{python_sitelib}/vpp_papi* %{python_sitelib}/vpp_papi* %files devel %dir %{python_sitelib}/jvppgen %{python_sitelib}/jvppgen/* %dir %{_datadir}/doc/vpp %dir %{_datadir}/doc/vpp/examples %{_libdir}/*.so %{_bindir}/jvpp_gen.py %{_includedir}/* %{_datadir}/doc/vpp/examples/sample-plugin %dir %{_datadir}/vpp %dir %{_datadir}/vpp/api %{_datadir}/vpp/api/* %files plugins %dir %{_libdir}/vpp_plugins %dir %{_libdir}/vpp_api_test_plugins %{_libdir}/vpp_plugins/*.so* %{_libdir}/vpp_api_test_plugins/*.so* %changelog