Line data Source code
1 : /* 2 : * mss_clamp_api.c - TCP MSS clamping plug-in 3 : * 4 : * Copyright (c) <current-year> <your-organization> 5 : * Licensed under the Apache License, Version 2.0 (the "License"); 6 : * you may not use this file except in compliance with the License. 7 : * You may obtain a copy of the License at: 8 : * 9 : * http://www.apache.org/licenses/LICENSE-2.0 10 : * 11 : * Unless required by applicable law or agreed to in writing, software 12 : * distributed under the License is distributed on an "AS IS" BASIS, 13 : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 : * See the License for the specific language governing permissions and 15 : * limitations under the License. 16 : */ 17 : 18 : #include <vnet/vnet.h> 19 : #include <vnet/plugin/plugin.h> /* VLIB_PLUGIN_REGISTER */ 20 : #include <mss_clamp/mss_clamp.h> 21 : #include <mss_clamp/mss_clamp.api_enum.h> 22 : #include <mss_clamp/mss_clamp.api_types.h> 23 : #include <vlibapi/api.h> 24 : #include <vlibmemory/api.h> 25 : #include <vpp/app/version.h> /* VPP_BUILD_VER */ 26 : 27 : #define REPLY_MSG_ID_BASE cm->msg_id_base 28 : #include <vlibapi/api_helper_macros.h> 29 : 30 : /* API message handler */ 31 : static void 32 16 : vl_api_mss_clamp_enable_disable_t_handler ( 33 : vl_api_mss_clamp_enable_disable_t *mp) 34 : { 35 16 : mssc_main_t *cm = &mssc_main; 36 : vl_api_mss_clamp_enable_disable_reply_t *rmp; 37 : int rv; 38 : u32 sw_if_index; 39 : 40 16 : sw_if_index = ntohl (mp->sw_if_index); 41 : 42 16 : VALIDATE_SW_IF_INDEX (mp); 43 : 44 : rv = 45 16 : mssc_enable_disable (sw_if_index, mp->ipv4_direction, mp->ipv6_direction, 46 16 : ntohs (mp->ipv4_mss), ntohs (mp->ipv6_mss)); 47 : 48 16 : BAD_SW_IF_INDEX_LABEL; 49 16 : REPLY_MACRO (VL_API_MSS_CLAMP_ENABLE_DISABLE_REPLY); 50 : } 51 : 52 : static void 53 4 : send_mss_clamp_details (u32 sw_if_index, vl_api_registration_t *rp, 54 : u32 context) 55 : { 56 4 : mssc_main_t *cm = &mssc_main; 57 : vl_api_mss_clamp_details_t *rmp; 58 : u16 mss4, mss6; 59 : u8 dir4, dir6; 60 : int rv; 61 : 62 4 : mss4 = mss6 = 0; 63 4 : dir4 = dir6 = MSS_CLAMP_DIR_NONE; 64 4 : rv = mssc_get_mss (sw_if_index, &dir4, &dir6, &mss4, &mss6); 65 4 : if (rv == VNET_API_ERROR_FEATURE_DISABLED) 66 0 : return; 67 : 68 4 : REPLY_MACRO_DETAILS4 (VL_API_MSS_CLAMP_DETAILS, rp, context, ({ 69 : rmp->sw_if_index = htonl (sw_if_index); 70 : rmp->ipv4_mss = htons (mss4); 71 : rmp->ipv6_mss = htons (mss6); 72 : rmp->ipv4_direction = dir4; 73 : rmp->ipv6_direction = dir6; 74 : })); 75 : } 76 : 77 : static void 78 4 : vl_api_mss_clamp_get_t_handler (vl_api_mss_clamp_get_t *mp) 79 : { 80 4 : mssc_main_t *cm = &mssc_main; 81 : vl_api_mss_clamp_get_reply_t *rmp; 82 4 : int rv = 0; 83 4 : u32 sw_if_index = ntohl (mp->sw_if_index); 84 : vl_api_registration_t *reg; 85 : 86 4 : reg = vl_api_client_index_to_registration (mp->client_index); 87 4 : if (!reg) 88 0 : return; 89 : 90 4 : if (sw_if_index == ~0) 91 : { 92 0 : if (vec_len (cm->dir_enabled4) == 0) 93 : { 94 0 : REPLY_MACRO2 (VL_API_MSS_CLAMP_GET_REPLY, ({ rmp->cursor = ~0; })); 95 0 : return; 96 : } 97 : 98 0 : REPLY_AND_DETAILS_VEC_MACRO ( 99 : VL_API_MSS_CLAMP_GET_REPLY, cm->dir_enabled4, mp, rmp, rv, 100 : ({ send_mss_clamp_details (cursor, reg, mp->context); })); 101 : } 102 : else 103 : { 104 4 : VALIDATE_SW_IF_INDEX (mp); 105 4 : send_mss_clamp_details (sw_if_index, reg, mp->context); 106 : 107 4 : BAD_SW_IF_INDEX_LABEL; 108 4 : REPLY_MACRO2 (VL_API_MSS_CLAMP_GET_REPLY, ({ rmp->cursor = ~0; })); 109 : } 110 : } 111 : 112 : /* API definitions */ 113 : #include <vnet/format_fns.h> 114 : #include <mss_clamp/mss_clamp.api.c> 115 : 116 : /* Set up the API message handling tables */ 117 : static clib_error_t * 118 559 : mssc_api_hookup (vlib_main_t *vm) 119 : { 120 559 : mssc_main_t *cm = &mssc_main; 121 : 122 559 : cm->msg_id_base = setup_message_id_table (); 123 559 : return 0; 124 : } 125 : 126 1119 : VLIB_API_INIT_FUNCTION (mssc_api_hookup); 127 : 128 : VLIB_PLUGIN_REGISTER () = { 129 : .version = VPP_BUILD_VER, 130 : .description = "TCP MSS clamping plugin", 131 : }; 132 : 133 : /* 134 : * fd.io coding-style-patch-verification: ON 135 : * 136 : * Local Variables: 137 : * eval: (c-set-style "gnu") 138 : * End: 139 : */