Line data Source code
1 : /* 2 : *------------------------------------------------------------------ 3 : * Copyright (c) 2020 Cisco and/or its affiliates. 4 : * Licensed under the Apache License, Version 2.0 (the "License"); 5 : * you may not use this file except in compliance with the License. 6 : * You may obtain a copy of the License at: 7 : * 8 : * http://www.apache.org/licenses/LICENSE-2.0 9 : * 10 : * Unless required by applicable law or agreed to in writing, software 11 : * distributed under the License is distributed on an "AS IS" BASIS, 12 : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 : * See the License for the specific language governing permissions and 14 : * limitations under the License. 15 : *------------------------------------------------------------------ 16 : */ 17 : 18 : #include <vlib/vlib.h> 19 : #include <vnet/vnet.h> 20 : 21 : #include <af_xdp/af_xdp.h> 22 : 23 : #include <vlibapi/api.h> 24 : #include <vlibmemory/api.h> 25 : 26 : /* define message IDs */ 27 : #include <af_xdp/af_xdp.api_enum.h> 28 : #include <af_xdp/af_xdp.api_types.h> 29 : 30 : #define REPLY_MSG_ID_BASE (rm->msg_id_base) 31 : #include <vlibapi/api_helper_macros.h> 32 : 33 : static af_xdp_mode_t 34 0 : af_xdp_api_mode (vl_api_af_xdp_mode_t mode) 35 : { 36 0 : switch (mode) 37 : { 38 0 : case AF_XDP_API_MODE_AUTO: 39 0 : return AF_XDP_MODE_AUTO; 40 0 : case AF_XDP_API_MODE_COPY: 41 0 : return AF_XDP_MODE_COPY; 42 0 : case AF_XDP_API_MODE_ZERO_COPY: 43 0 : return AF_XDP_MODE_ZERO_COPY; 44 : } 45 0 : return AF_XDP_MODE_AUTO; 46 : } 47 : 48 : static af_xdp_create_flag_t 49 0 : af_xdp_api_flags (vl_api_af_xdp_flag_t flags) 50 : { 51 0 : af_xdp_create_flag_t cflags = 0; 52 : 53 0 : if (flags & AF_XDP_API_FLAGS_NO_SYSCALL_LOCK) 54 0 : cflags |= AF_XDP_CREATE_FLAGS_NO_SYSCALL_LOCK; 55 : 56 0 : return cflags; 57 : } 58 : 59 : static void 60 0 : vl_api_af_xdp_create_t_handler (vl_api_af_xdp_create_t * mp) 61 : { 62 0 : vlib_main_t *vm = vlib_get_main (); 63 0 : af_xdp_main_t *rm = &af_xdp_main; 64 : vl_api_af_xdp_create_reply_t *rmp; 65 : af_xdp_create_if_args_t args; 66 : int rv; 67 : 68 0 : clib_memset (&args, 0, sizeof (af_xdp_create_if_args_t)); 69 : 70 0 : args.linux_ifname = mp->host_if[0] ? (char *) mp->host_if : 0; 71 0 : args.name = mp->name[0] ? (char *) mp->name : 0; 72 0 : args.prog = mp->prog[0] ? (char *) mp->prog : 0; 73 0 : args.mode = af_xdp_api_mode (mp->mode); 74 0 : args.flags = af_xdp_api_flags (mp->flags); 75 0 : args.rxq_size = ntohs (mp->rxq_size); 76 0 : args.txq_size = ntohs (mp->txq_size); 77 0 : args.rxq_num = ntohs (mp->rxq_num); 78 : 79 0 : af_xdp_create_if (vm, &args); 80 0 : rv = args.rv; 81 : 82 0 : REPLY_MACRO2 (VL_API_AF_XDP_CREATE_REPLY, 83 : ({ rmp->sw_if_index = ntohl (args.sw_if_index); })); 84 : } 85 : 86 : static void 87 0 : vl_api_af_xdp_create_v2_t_handler (vl_api_af_xdp_create_v2_t *mp) 88 : { 89 0 : vlib_main_t *vm = vlib_get_main (); 90 0 : af_xdp_main_t *rm = &af_xdp_main; 91 : vl_api_af_xdp_create_v2_reply_t *rmp; 92 : af_xdp_create_if_args_t args; 93 : int rv; 94 : 95 0 : clib_memset (&args, 0, sizeof (af_xdp_create_if_args_t)); 96 : 97 0 : args.linux_ifname = mp->host_if[0] ? (char *) mp->host_if : 0; 98 0 : args.name = mp->name[0] ? (char *) mp->name : 0; 99 0 : args.prog = mp->prog[0] ? (char *) mp->prog : 0; 100 0 : args.netns = mp->namespace[0] ? (char *) mp->namespace : 0; 101 0 : args.mode = af_xdp_api_mode (mp->mode); 102 0 : args.flags = af_xdp_api_flags (mp->flags); 103 0 : args.rxq_size = ntohs (mp->rxq_size); 104 0 : args.txq_size = ntohs (mp->txq_size); 105 0 : args.rxq_num = ntohs (mp->rxq_num); 106 : 107 0 : af_xdp_create_if (vm, &args); 108 0 : rv = args.rv; 109 : 110 : /* clang-format off */ 111 0 : REPLY_MACRO2 (VL_API_AF_XDP_CREATE_V2_REPLY, 112 : ({ 113 : rmp->sw_if_index = ntohl (args.sw_if_index); 114 : })); 115 : /* clang-format on */ 116 : } 117 : 118 : static void 119 0 : vl_api_af_xdp_create_v3_t_handler (vl_api_af_xdp_create_v3_t *mp) 120 : { 121 0 : vlib_main_t *vm = vlib_get_main (); 122 0 : af_xdp_main_t *rm = &af_xdp_main; 123 : vl_api_af_xdp_create_v3_reply_t *rmp; 124 : af_xdp_create_if_args_t args; 125 : int rv; 126 : 127 0 : clib_memset (&args, 0, sizeof (af_xdp_create_if_args_t)); 128 : 129 0 : args.linux_ifname = mp->host_if[0] ? (char *) mp->host_if : 0; 130 0 : args.name = mp->name[0] ? (char *) mp->name : 0; 131 0 : args.prog = mp->prog[0] ? (char *) mp->prog : 0; 132 0 : args.netns = mp->netns[0] ? (char *) mp->netns : 0; 133 0 : args.mode = af_xdp_api_mode (mp->mode); 134 0 : args.flags = af_xdp_api_flags (mp->flags); 135 0 : args.rxq_size = mp->rxq_size; 136 0 : args.txq_size = mp->txq_size; 137 0 : args.rxq_num = mp->rxq_num; 138 : 139 0 : af_xdp_create_if (vm, &args); 140 0 : rv = args.rv; 141 : 142 : /* clang-format off */ 143 0 : REPLY_MACRO2_END (VL_API_AF_XDP_CREATE_V3_REPLY, 144 : ({ 145 : rmp->sw_if_index = args.sw_if_index; 146 : })); 147 : /* clang-format on */ 148 : } 149 : 150 : static void 151 0 : vl_api_af_xdp_delete_t_handler (vl_api_af_xdp_delete_t * mp) 152 : { 153 0 : vlib_main_t *vm = vlib_get_main (); 154 0 : vnet_main_t *vnm = vnet_get_main (); 155 0 : af_xdp_main_t *rm = &af_xdp_main; 156 : vl_api_af_xdp_delete_reply_t *rmp; 157 : af_xdp_device_t *rd; 158 : vnet_hw_interface_t *hw; 159 0 : int rv = 0; 160 : 161 : hw = 162 0 : vnet_get_sup_hw_interface_api_visible_or_null (vnm, 163 : htonl (mp->sw_if_index)); 164 0 : if (hw == NULL || af_xdp_device_class.index != hw->dev_class_index) 165 : { 166 0 : rv = VNET_API_ERROR_INVALID_INTERFACE; 167 0 : goto reply; 168 : } 169 : 170 0 : rd = pool_elt_at_index (rm->devices, hw->dev_instance); 171 : 172 0 : af_xdp_delete_if (vm, rd); 173 : 174 0 : reply: 175 0 : REPLY_MACRO (VL_API_AF_XDP_DELETE_REPLY); 176 : } 177 : 178 : /* set tup the API message handling tables */ 179 : #include <af_xdp/af_xdp.api.c> 180 : static clib_error_t * 181 559 : af_xdp_plugin_api_hookup (vlib_main_t * vm) 182 : { 183 559 : af_xdp_main_t *rm = &af_xdp_main; 184 : 185 : /* ask for a correctly-sized block of API message decode slots */ 186 559 : rm->msg_id_base = setup_message_id_table (); 187 559 : return 0; 188 : } 189 : 190 1119 : VLIB_API_INIT_FUNCTION (af_xdp_plugin_api_hookup); 191 : 192 : /* 193 : * fd.io coding-style-patch-verification: ON 194 : * 195 : * Local Variables: 196 : * eval: (c-set-style "gnu") 197 : * End: 198 : */