Exemplo n.º 1
0
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));
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
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);