LCOV - code coverage report
Current view: top level - plugins/l2tp - l2tp_test.c (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 0 134 0.0 %
Date: 2023-07-05 22:20:52 Functions: 0 7 0.0 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2020 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 <vat/vat.h>
      17             : #include <vlibapi/api.h>
      18             : #include <vlibmemory/api.h>
      19             : #include <vppinfra/error.h>
      20             : 
      21             : #include <vnet/ip/ip_format_fns.h>
      22             : #include <vnet/ip/ip.h>
      23             : #include <vnet/ethernet/ethernet_format_fns.h>
      24             : #include <l2tp/l2tp.h>
      25             : 
      26             : /* define message IDs */
      27             : #include <l2tp/l2tp.api_enum.h>
      28             : #include <l2tp/l2tp.api_types.h>
      29             : #include <vlibmemory/vlib.api_types.h>
      30             : 
      31             : typedef struct
      32             : {
      33             :   /* API message ID base */
      34             :   u16 msg_id_base;
      35             :   u32 ping_id;
      36             :   vat_main_t *vat_main;
      37             : } l2tp_test_main_t;
      38             : 
      39             : l2tp_test_main_t l2tp_test_main;
      40             : 
      41             : #define __plugin_msg_base l2tp_test_main.msg_id_base
      42             : #include <vlibapi/vat_helper_macros.h>
      43             : 
      44             : #define FINISH                                                                \
      45             :   vec_add1 (s, 0);                                                            \
      46             :   vlib_cli_output (handle, (char *) s);                                       \
      47             :   vec_free (s);                                                               \
      48             :   return handle;
      49             : 
      50           0 : static void vl_api_l2tpv3_create_tunnel_reply_t_handler
      51             :   (vl_api_l2tpv3_create_tunnel_reply_t * mp)
      52             : {
      53           0 :   vat_main_t *vam = &vat_main;
      54           0 :   i32 retval = ntohl (mp->retval);
      55           0 :   if (vam->async_mode)
      56             :     {
      57           0 :       vam->async_errors += (retval < 0);
      58             :     }
      59             :   else
      60             :     {
      61           0 :       vam->retval = retval;
      62           0 :       vam->sw_if_index = ntohl (mp->sw_if_index);
      63           0 :       vam->result_ready = 1;
      64             :     }
      65           0 : }
      66             : 
      67             : static int
      68           0 : api_l2tpv3_create_tunnel (vat_main_t * vam)
      69             : {
      70           0 :   unformat_input_t *i = vam->input;
      71             :   ip6_address_t client_address, our_address;
      72           0 :   int client_address_set = 0;
      73           0 :   int our_address_set = 0;
      74           0 :   u32 local_session_id = 0;
      75           0 :   u32 remote_session_id = 0;
      76           0 :   u64 local_cookie = 0;
      77           0 :   u64 remote_cookie = 0;
      78           0 :   u8 l2_sublayer_present = 0;
      79             :   vl_api_l2tpv3_create_tunnel_t *mp;
      80             :   int ret;
      81             : 
      82           0 :   while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
      83             :     {
      84           0 :       if (unformat (i, "client_address %U", unformat_ip6_address,
      85             :                     &client_address))
      86           0 :         client_address_set = 1;
      87           0 :       else if (unformat (i, "our_address %U", unformat_ip6_address,
      88             :                          &our_address))
      89           0 :         our_address_set = 1;
      90           0 :       else if (unformat (i, "local_session_id %d", &local_session_id))
      91             :         ;
      92           0 :       else if (unformat (i, "remote_session_id %d", &remote_session_id))
      93             :         ;
      94           0 :       else if (unformat (i, "local_cookie %lld", &local_cookie))
      95             :         ;
      96           0 :       else if (unformat (i, "remote_cookie %lld", &remote_cookie))
      97             :         ;
      98           0 :       else if (unformat (i, "l2-sublayer-present"))
      99           0 :         l2_sublayer_present = 1;
     100             :       else
     101           0 :         break;
     102             :     }
     103             : 
     104           0 :   if (client_address_set == 0)
     105             :     {
     106           0 :       errmsg ("client_address required");
     107           0 :       return -99;
     108             :     }
     109             : 
     110           0 :   if (our_address_set == 0)
     111             :     {
     112           0 :       errmsg ("our_address required");
     113           0 :       return -99;
     114             :     }
     115             : 
     116           0 :   M (L2TPV3_CREATE_TUNNEL, mp);
     117             : 
     118           0 :   clib_memcpy (mp->client_address.un.ip6, client_address.as_u8,
     119             :                sizeof (ip6_address_t));
     120             : 
     121           0 :   clib_memcpy (mp->our_address.un.ip6, our_address.as_u8,
     122             :                sizeof (ip6_address_t));
     123             : 
     124           0 :   mp->local_session_id = ntohl (local_session_id);
     125           0 :   mp->remote_session_id = ntohl (remote_session_id);
     126           0 :   mp->local_cookie = clib_host_to_net_u64 (local_cookie);
     127           0 :   mp->remote_cookie = clib_host_to_net_u64 (remote_cookie);
     128           0 :   mp->l2_sublayer_present = l2_sublayer_present;
     129             : 
     130           0 :   S (mp);
     131           0 :   W (ret);
     132           0 :   return ret;
     133             : }
     134             : 
     135             : static int
     136           0 : api_l2tpv3_set_tunnel_cookies (vat_main_t * vam)
     137             : {
     138           0 :   unformat_input_t *i = vam->input;
     139             :   u32 sw_if_index;
     140           0 :   u8 sw_if_index_set = 0;
     141           0 :   u64 new_local_cookie = 0;
     142           0 :   u64 new_remote_cookie = 0;
     143             :   vl_api_l2tpv3_set_tunnel_cookies_t *mp;
     144             :   int ret;
     145             : 
     146           0 :   while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
     147             :     {
     148           0 :       if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
     149           0 :         sw_if_index_set = 1;
     150           0 :       else if (unformat (i, "sw_if_index %d", &sw_if_index))
     151           0 :         sw_if_index_set = 1;
     152           0 :       else if (unformat (i, "new_local_cookie %lld", &new_local_cookie))
     153             :         ;
     154           0 :       else if (unformat (i, "new_remote_cookie %lld", &new_remote_cookie))
     155             :         ;
     156             :       else
     157           0 :         break;
     158             :     }
     159             : 
     160           0 :   if (sw_if_index_set == 0)
     161             :     {
     162           0 :       errmsg ("missing interface name or sw_if_index");
     163           0 :       return -99;
     164             :     }
     165             : 
     166           0 :   M (L2TPV3_SET_TUNNEL_COOKIES, mp);
     167             : 
     168           0 :   mp->sw_if_index = ntohl (sw_if_index);
     169           0 :   mp->new_local_cookie = clib_host_to_net_u64 (new_local_cookie);
     170           0 :   mp->new_remote_cookie = clib_host_to_net_u64 (new_remote_cookie);
     171             : 
     172           0 :   S (mp);
     173           0 :   W (ret);
     174           0 :   return ret;
     175             : }
     176             : 
     177             : static int
     178           0 : api_l2tpv3_interface_enable_disable (vat_main_t * vam)
     179             : {
     180           0 :   unformat_input_t *i = vam->input;
     181             :   vl_api_l2tpv3_interface_enable_disable_t *mp;
     182             :   u32 sw_if_index;
     183           0 :   u8 sw_if_index_set = 0;
     184           0 :   u8 enable_disable = 1;
     185             :   int ret;
     186             : 
     187           0 :   while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
     188             :     {
     189           0 :       if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
     190           0 :         sw_if_index_set = 1;
     191           0 :       else if (unformat (i, "sw_if_index %d", &sw_if_index))
     192           0 :         sw_if_index_set = 1;
     193           0 :       else if (unformat (i, "enable"))
     194           0 :         enable_disable = 1;
     195           0 :       else if (unformat (i, "disable"))
     196           0 :         enable_disable = 0;
     197             :       else
     198           0 :         break;
     199             :     }
     200             : 
     201           0 :   if (sw_if_index_set == 0)
     202             :     {
     203           0 :       errmsg ("missing interface name or sw_if_index");
     204           0 :       return -99;
     205             :     }
     206             : 
     207           0 :   M (L2TPV3_INTERFACE_ENABLE_DISABLE, mp);
     208             : 
     209           0 :   mp->sw_if_index = ntohl (sw_if_index);
     210           0 :   mp->enable_disable = enable_disable;
     211             : 
     212           0 :   S (mp);
     213           0 :   W (ret);
     214           0 :   return ret;
     215             : }
     216             : 
     217             : static int
     218           0 : api_l2tpv3_set_lookup_key (vat_main_t * vam)
     219             : {
     220           0 :   unformat_input_t *i = vam->input;
     221             :   vl_api_l2tpv3_set_lookup_key_t *mp;
     222           0 :   u8 key = ~0;
     223             :   int ret;
     224             : 
     225           0 :   while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
     226             :     {
     227           0 :       if (unformat (i, "lookup_v6_src"))
     228           0 :         key = L2T_LOOKUP_SRC_ADDRESS;
     229           0 :       else if (unformat (i, "lookup_v6_dst"))
     230           0 :         key = L2T_LOOKUP_DST_ADDRESS;
     231           0 :       else if (unformat (i, "lookup_session_id"))
     232           0 :         key = L2T_LOOKUP_SESSION_ID;
     233             :       else
     234           0 :         break;
     235             :     }
     236             : 
     237           0 :   if (key == (u8) ~ 0)
     238             :     {
     239           0 :       errmsg ("l2tp session lookup key unset");
     240           0 :       return -99;
     241             :     }
     242             : 
     243           0 :   M (L2TPV3_SET_LOOKUP_KEY, mp);
     244             : 
     245           0 :   mp->key = key;
     246             : 
     247           0 :   S (mp);
     248           0 :   W (ret);
     249           0 :   return ret;
     250             : }
     251             : 
     252           0 : static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler
     253             :   (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
     254             : {
     255           0 :   vat_main_t *vam = &vat_main;
     256             : 
     257           0 :   print (vam->ofp, "* %U (our) %U (client) (sw_if_index %d)",
     258             :          format_ip6_address, mp->our_address,
     259             :          format_ip6_address, mp->client_address,
     260             :          clib_net_to_host_u32 (mp->sw_if_index));
     261             : 
     262           0 :   print (vam->ofp,
     263             :          "   local cookies %016llx %016llx remote cookie %016llx",
     264             :          clib_net_to_host_u64 (mp->local_cookie[0]),
     265             :          clib_net_to_host_u64 (mp->local_cookie[1]),
     266             :          clib_net_to_host_u64 (mp->remote_cookie));
     267             : 
     268           0 :   print (vam->ofp, "   local session-id %d remote session-id %d",
     269             :          clib_net_to_host_u32 (mp->local_session_id),
     270             :          clib_net_to_host_u32 (mp->remote_session_id));
     271             : 
     272           0 :   print (vam->ofp, "   l2 specific sublayer %s\n",
     273           0 :          mp->l2_sublayer_present ? "preset" : "absent");
     274             : 
     275           0 : }
     276             : 
     277             : static int
     278           0 : api_sw_if_l2tpv3_tunnel_dump (vat_main_t * vam)
     279             : {
     280             :   vl_api_sw_if_l2tpv3_tunnel_dump_t *mp;
     281             :   vl_api_control_ping_t *mp_ping;
     282             :   int ret;
     283             : 
     284             :   /* Get list of l2tpv3-tunnel interfaces */
     285           0 :   M (SW_IF_L2TPV3_TUNNEL_DUMP, mp);
     286           0 :   S (mp);
     287             : 
     288             :   /* Use a control ping for synchronization */
     289           0 :   if (!l2tp_test_main.ping_id)
     290           0 :     l2tp_test_main.ping_id =
     291           0 :       vl_msg_api_get_msg_index ((u8 *) (VL_API_CONTROL_PING_CRC));
     292           0 :   mp_ping = vl_msg_api_alloc_as_if_client (sizeof (*mp_ping));
     293           0 :   mp_ping->_vl_msg_id = htons (l2tp_test_main.ping_id);
     294           0 :   mp_ping->client_index = vam->my_client_index;
     295             : 
     296           0 :   fformat (vam->ofp, "Sending ping id=%d\n", l2tp_test_main.ping_id);
     297             : 
     298           0 :   vam->result_ready = 0;
     299           0 :   S (mp_ping);
     300             : 
     301           0 :   W (ret);
     302           0 :   return ret;
     303             : }
     304             : 
     305             : #include <l2tp/l2tp.api_test.c>
     306             : 
     307             : /*
     308             :  * fd.io coding-style-patch-verification: ON
     309             :  *
     310             :  * Local Variables:
     311             :  * eval: (c-set-style "gnu")
     312             :  * End:
     313             :  */

Generated by: LCOV version 1.14