static void vi_set_rm_free(efch_resource_t *rs) { struct efrm_vi_set *vi_set = efrm_vi_set_from_resource(rs->rs_base); efch_filter_list_free(rs->rs_base, &rs->vi_set.fl); /* Remove any sniff config we may have set up. */ if( rs->vi_set.sniff_flags & EFCH_RX_SNIFF ) efrm_port_sniff(rs->rs_base, 0, 0, efrm_vi_set_get_rss_context(vi_set)); if( rs->vi_set.sniff_flags & EFCH_TX_SNIFF ) efrm_tx_port_sniff(rs->rs_base, 0, efrm_vi_set_get_rss_context(vi_set)); }
int oo_hw_filter_set_thc(struct oo_hw_filter* oofilter, tcp_helper_cluster_t* thc, int protocol, unsigned daddr, int dport, unsigned hwport_mask) { struct efx_filter_spec spec; int hwport, base_vi_id, rc; ci_assert_equal(oofilter->trs, NULL); oofilter->thc = thc; for( hwport = 0; hwport < CI_CFG_MAX_REGISTER_INTERFACES; ++hwport ) if( hwport_mask & (1 << hwport) && thc->thc_vi_set[hwport] != NULL ) { base_vi_id = efrm_vi_set_get_base(thc->thc_vi_set[hwport]); efx_filter_init_rx(&spec, EFX_FILTER_PRI_REQUIRED, EFX_FILTER_FLAG_RX_SCATTER | EFX_FILTER_FLAG_RX_RSS, base_vi_id); spec.rss_context = efrm_vi_set_get_rss_context(thc->thc_vi_set[hwport]); #if EFX_DRIVERLINK_API_VERSION >= 15 { int stack_id = tcp_helper_cluster_vi_hw_stack_id(thc, hwport); ci_assert( stack_id >= 0 ); efx_filter_set_stack_id(&spec, stack_id); } #endif rc = efx_filter_set_ipv4_local(&spec, protocol, daddr, dport); ci_assert_equal(rc, 0); rc = efrm_filter_insert(get_client(hwport), &spec, false); if( rc < 0 ) { oo_hw_filter_clear(oofilter); return rc; } oofilter->filter_id[hwport] = rc; } return 0; }
static void vi_set_rm_dump(struct efrm_resource* ors, ci_resource_table_t *priv_opt, const char *line_prefix) { } static int vi_set_rm_rsops(efch_resource_t* rs, ci_resource_table_t* priv_opt, ci_resource_op_t* op, int* copy_out CI_BLOCKING_CTX_ARG(ci_blocking_ctx_t bc)) { unsigned flags = 0; struct efrm_vi_set *vi_set = efrm_vi_set_from_resource(rs->rs_base); int rss = efrm_vi_set_num_vis(vi_set) > 1; int rss_context = efrm_vi_set_get_rss_context(vi_set); int rc; switch(op->op) { case CI_RSOP_PT_SNIFF: rc = efrm_port_sniff(rs->rs_base, op->u.pt_sniff.enable, op->u.pt_sniff.promiscuous, rss_context); if( rc == 0 && op->u.pt_sniff.enable ) rs->vi_set.sniff_flags |= EFCH_RX_SNIFF; else if( rc == 0 && !op->u.pt_sniff.enable ) rs->vi_set.sniff_flags &= ~EFCH_RX_SNIFF; break; case CI_RSOP_TX_PT_SNIFF: { int enable = op->u.pt_sniff.enable & EFCH_TX_SNIFF_ENABLE; rc = efrm_tx_port_sniff(rs->rs_base, enable, rss_context);