diff --git a/sys/dev/ice/ice_common_sysctls.h b/sys/dev/ice/ice_common_sysctls.h --- a/sys/dev/ice/ice_common_sysctls.h +++ b/sys/dev/ice/ice_common_sysctls.h @@ -79,7 +79,7 @@ * * @remark each PF has a separate sysctl which can override this value. */ -bool ice_enable_tx_lldp_filter = true; +bool ice_enable_tx_lldp_filter = false; /** * @var ice_enable_health_events diff --git a/sys/dev/ice/ice_lib.c b/sys/dev/ice/ice_lib.c --- a/sys/dev/ice/ice_lib.c +++ b/sys/dev/ice/ice_lib.c @@ -232,6 +232,7 @@ static int ice_sysctl_advertise_speed(SYSCTL_HANDLER_ARGS); static int ice_sysctl_rx_itr(SYSCTL_HANDLER_ARGS); static int ice_sysctl_tx_itr(SYSCTL_HANDLER_ARGS); +static int ice_sysctl_lldp_tx_filter(SYSCTL_HANDLER_ARGS); static int ice_sysctl_fw_lldp_agent(SYSCTL_HANDLER_ARGS); static int ice_sysctl_fw_cur_lldp_persist_status(SYSCTL_HANDLER_ARGS); static int ice_sysctl_fw_dflt_lldp_persist_status(SYSCTL_HANDLER_ARGS); @@ -3941,6 +3942,85 @@ return (false); } +#define ETHERTYPE_PAUSE_FRAMES 0x8808 +#define ETHERTYPE_LLDP_FRAMES 0x88cc + +#define ICE_SYSCTL_HELP_LLDP_TX_FILTER \ +"\nDisplay or change TX LLDP filter:" \ +"\n\t0 - disabled" \ +"\n\t1 - enabled" + +/** + * ice_sysctl_tx_lldp_filter - Display or change the TX LLDP filter + * @oidp: sysctl oid structure + * @arg1: pointer to private softc structure + * @arg2: unused + * @req: sysctl request pointer + * + * On read: Displays whether the TX LLDP filter is enabled + * On write: Persistently enables or disables the TX LLDP filter + */ +static int +ice_sysctl_lldp_tx_filter(SYSCTL_HANDLER_ARGS) +{ + struct ice_list_head ethertype_list; + struct ice_softc *sc = (struct ice_softc *)arg1; + struct ice_vsi *vsi = &sc->pf_vsi; + struct ice_hw *hw = &sc->hw; + device_t dev = sc->dev; + enum ice_status status; + bool lldp_filter; + int ret; + + UNREFERENCED_PARAMETER(arg2); + + if (ice_driver_is_detaching(sc)) + return (ESHUTDOWN); + + lldp_filter = sc->enable_tx_lldp_filter; + ret = sysctl_handle_bool(oidp, &lldp_filter, 0, req); + if ((ret) || (req->newptr == NULL)) + return (ret); + + if (sc->enable_tx_lldp_filter == lldp_filter) + return (0); + + INIT_LIST_HEAD(ðertype_list); + ret = ice_add_ethertype_to_list(vsi, ðertype_list, + ETHERTYPE_LLDP_FRAMES, + ICE_FLTR_TX, ICE_DROP_PACKET); + if (ret) + goto free_ethertype_list; + + if (lldp_filter) { + status = ice_add_eth_mac(hw, ðertype_list); + if (status && status != ICE_ERR_ALREADY_EXISTS) { + device_printf(dev, + "Failed to add Tx LLDP filter, err %s aq_err %s\n", + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + ret = (EIO); + } + } else { + status = ice_remove_eth_mac(hw, ðertype_list); + if (status == ICE_ERR_DOES_NOT_EXIST) + ; /* Don't complain if we try to remove a filter that doesn't exist */ + else if (status) { + device_printf(dev, + "Failed to remove Tx LLDP filter, err %s aq_err %s\n", + ice_status_str(status), + ice_aq_str(hw->adminq.sq_last_status)); + ret = (EIO); + } + } + if (ret == 0) + sc->enable_tx_lldp_filter = lldp_filter; + +free_ethertype_list: + ice_free_fltr_list(ðertype_list); + return (ret); +} + #define ICE_SYSCTL_HELP_FW_LLDP_AGENT \ "\nDisplay or change FW LLDP agent state:" \ "\n\t0 - disabled" \ @@ -4618,6 +4698,10 @@ OID_AUTO, "fw_lldp_agent", CTLTYPE_U8 | CTLFLAG_RWTUN, sc, 0, ice_sysctl_fw_lldp_agent, "CU", ICE_SYSCTL_HELP_FW_LLDP_AGENT); + SYSCTL_ADD_PROC(ctx, ctx_list, + OID_AUTO, "lldp_tx_filter", CTLTYPE_U8 | CTLFLAG_RWTUN, + sc, 0, ice_sysctl_lldp_tx_filter, "CU", ICE_SYSCTL_HELP_LLDP_TX_FILTER); + SYSCTL_ADD_PROC(ctx, ctx_list, OID_AUTO, "ets_min_rate", CTLTYPE_STRING | CTLFLAG_RW, sc, 0, ice_sysctl_ets_min_rate, "A", ICE_SYSCTL_HELP_ETS_MIN_RATE); @@ -9281,9 +9365,6 @@ return 0; } -#define ETHERTYPE_PAUSE_FRAMES 0x8808 -#define ETHERTYPE_LLDP_FRAMES 0x88cc - /** * ice_cfg_pf_ethertype_filters - Configure switch to drop ethertypes * @sc: the device private softc