Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/sfxge/common/ef10_filter.c
Show First 20 Lines • Show All 139 Lines • ▼ Show 20 Lines | #define MATCH_MASK(match) (EFX_MASK32(match) << EFX_LOW_BIT(match)) | ||||
EFX_STATIC_ASSERT(EFX_FILTER_MATCH_ETHER_TYPE == | EFX_STATIC_ASSERT(EFX_FILTER_MATCH_ETHER_TYPE == | ||||
MATCH_MASK(MC_CMD_FILTER_OP_EXT_IN_MATCH_ETHER_TYPE)); | MATCH_MASK(MC_CMD_FILTER_OP_EXT_IN_MATCH_ETHER_TYPE)); | ||||
EFX_STATIC_ASSERT(EFX_FILTER_MATCH_INNER_VID == | EFX_STATIC_ASSERT(EFX_FILTER_MATCH_INNER_VID == | ||||
MATCH_MASK(MC_CMD_FILTER_OP_EXT_IN_MATCH_INNER_VLAN)); | MATCH_MASK(MC_CMD_FILTER_OP_EXT_IN_MATCH_INNER_VLAN)); | ||||
EFX_STATIC_ASSERT(EFX_FILTER_MATCH_OUTER_VID == | EFX_STATIC_ASSERT(EFX_FILTER_MATCH_OUTER_VID == | ||||
MATCH_MASK(MC_CMD_FILTER_OP_EXT_IN_MATCH_OUTER_VLAN)); | MATCH_MASK(MC_CMD_FILTER_OP_EXT_IN_MATCH_OUTER_VLAN)); | ||||
EFX_STATIC_ASSERT(EFX_FILTER_MATCH_IP_PROTO == | EFX_STATIC_ASSERT(EFX_FILTER_MATCH_IP_PROTO == | ||||
MATCH_MASK(MC_CMD_FILTER_OP_EXT_IN_MATCH_IP_PROTO)); | MATCH_MASK(MC_CMD_FILTER_OP_EXT_IN_MATCH_IP_PROTO)); | ||||
EFX_STATIC_ASSERT(EFX_FILTER_MATCH_IFRM_UNKNOWN_MCAST_DST == | |||||
MATCH_MASK(MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_UNKNOWN_MCAST_DST)); | |||||
EFX_STATIC_ASSERT(EFX_FILTER_MATCH_IFRM_UNKNOWN_UCAST_DST == | |||||
MATCH_MASK(MC_CMD_FILTER_OP_EXT_IN_MATCH_IFRM_UNKNOWN_UCAST_DST)); | |||||
EFX_STATIC_ASSERT(EFX_FILTER_MATCH_UNKNOWN_MCAST_DST == | EFX_STATIC_ASSERT(EFX_FILTER_MATCH_UNKNOWN_MCAST_DST == | ||||
MATCH_MASK(MC_CMD_FILTER_OP_EXT_IN_MATCH_UNKNOWN_MCAST_DST)); | MATCH_MASK(MC_CMD_FILTER_OP_EXT_IN_MATCH_UNKNOWN_MCAST_DST)); | ||||
EFX_STATIC_ASSERT((uint32_t)EFX_FILTER_MATCH_UNKNOWN_UCAST_DST == | EFX_STATIC_ASSERT((uint32_t)EFX_FILTER_MATCH_UNKNOWN_UCAST_DST == | ||||
MATCH_MASK(MC_CMD_FILTER_OP_EXT_IN_MATCH_UNKNOWN_UCAST_DST)); | MATCH_MASK(MC_CMD_FILTER_OP_EXT_IN_MATCH_UNKNOWN_UCAST_DST)); | ||||
#undef MATCH_MASK | #undef MATCH_MASK | ||||
EFSYS_KMEM_ALLOC(enp->en_esip, sizeof (ef10_filter_table_t), eftp); | EFSYS_KMEM_ALLOC(enp->en_esip, sizeof (ef10_filter_table_t), eftp); | ||||
▲ Show 20 Lines • Show All 113 Lines • ▼ Show 20 Lines | EFX_STATIC_ASSERT(sizeof (spec->efs_loc_host) == | ||||
MC_CMD_FILTER_OP_EXT_IN_DST_IP_LEN); | MC_CMD_FILTER_OP_EXT_IN_DST_IP_LEN); | ||||
memcpy(MCDI_IN2(req, uint8_t, FILTER_OP_EXT_IN_SRC_IP), | memcpy(MCDI_IN2(req, uint8_t, FILTER_OP_EXT_IN_SRC_IP), | ||||
&spec->efs_rem_host.eo_byte[0], | &spec->efs_rem_host.eo_byte[0], | ||||
MC_CMD_FILTER_OP_EXT_IN_SRC_IP_LEN); | MC_CMD_FILTER_OP_EXT_IN_SRC_IP_LEN); | ||||
memcpy(MCDI_IN2(req, uint8_t, FILTER_OP_EXT_IN_DST_IP), | memcpy(MCDI_IN2(req, uint8_t, FILTER_OP_EXT_IN_DST_IP), | ||||
&spec->efs_loc_host.eo_byte[0], | &spec->efs_loc_host.eo_byte[0], | ||||
MC_CMD_FILTER_OP_EXT_IN_DST_IP_LEN); | MC_CMD_FILTER_OP_EXT_IN_DST_IP_LEN); | ||||
/* | |||||
* On Medford, filters for encapsulated packets match based on | |||||
* the ether type and IP protocol in the outer frame. In | |||||
* addition we need to fill in the VNI or VSID type field. | |||||
*/ | |||||
switch (spec->efs_encap_type) { | |||||
case EFX_TUNNEL_PROTOCOL_NONE: | |||||
break; | |||||
case EFX_TUNNEL_PROTOCOL_VXLAN: | |||||
case EFX_TUNNEL_PROTOCOL_GENEVE: | |||||
MCDI_IN_POPULATE_DWORD_1(req, | |||||
FILTER_OP_EXT_IN_VNI_OR_VSID, | |||||
FILTER_OP_EXT_IN_VNI_TYPE, | |||||
spec->efs_encap_type == EFX_TUNNEL_PROTOCOL_VXLAN ? | |||||
MC_CMD_FILTER_OP_EXT_IN_VNI_TYPE_VXLAN : | |||||
MC_CMD_FILTER_OP_EXT_IN_VNI_TYPE_GENEVE); | |||||
break; | |||||
case EFX_TUNNEL_PROTOCOL_NVGRE: | |||||
MCDI_IN_POPULATE_DWORD_1(req, | |||||
FILTER_OP_EXT_IN_VNI_OR_VSID, | |||||
FILTER_OP_EXT_IN_VSID_TYPE, | |||||
MC_CMD_FILTER_OP_EXT_IN_VSID_TYPE_NVGRE); | |||||
break; | |||||
default: | |||||
EFSYS_ASSERT(0); | |||||
rc = EINVAL; | |||||
goto fail2; | |||||
} | } | ||||
} | |||||
efx_mcdi_execute(enp, &req); | efx_mcdi_execute(enp, &req); | ||||
if (req.emr_rc != 0) { | if (req.emr_rc != 0) { | ||||
rc = req.emr_rc; | rc = req.emr_rc; | ||||
goto fail2; | goto fail3; | ||||
} | } | ||||
if (req.emr_out_length_used < MC_CMD_FILTER_OP_EXT_OUT_LEN) { | if (req.emr_out_length_used < MC_CMD_FILTER_OP_EXT_OUT_LEN) { | ||||
rc = EMSGSIZE; | rc = EMSGSIZE; | ||||
goto fail3; | goto fail4; | ||||
} | } | ||||
handle->efh_lo = MCDI_OUT_DWORD(req, FILTER_OP_EXT_OUT_HANDLE_LO); | handle->efh_lo = MCDI_OUT_DWORD(req, FILTER_OP_EXT_OUT_HANDLE_LO); | ||||
handle->efh_hi = MCDI_OUT_DWORD(req, FILTER_OP_EXT_OUT_HANDLE_HI); | handle->efh_hi = MCDI_OUT_DWORD(req, FILTER_OP_EXT_OUT_HANDLE_HI); | ||||
return (0); | return (0); | ||||
fail4: | |||||
EFSYS_PROBE(fail4); | |||||
fail3: | fail3: | ||||
EFSYS_PROBE(fail3); | EFSYS_PROBE(fail3); | ||||
fail2: | fail2: | ||||
EFSYS_PROBE(fail2); | EFSYS_PROBE(fail2); | ||||
fail1: | fail1: | ||||
EFSYS_PROBE1(fail1, efx_rc_t, rc); | EFSYS_PROBE1(fail1, efx_rc_t, rc); | ||||
return (rc); | return (rc); | ||||
▲ Show 20 Lines • Show All 83 Lines • ▼ Show 20 Lines | if (left->efs_loc_port != right->efs_loc_port) | ||||
return (B_FALSE); | return (B_FALSE); | ||||
if (left->efs_inner_vid != right->efs_inner_vid) | if (left->efs_inner_vid != right->efs_inner_vid) | ||||
return (B_FALSE); | return (B_FALSE); | ||||
if (left->efs_outer_vid != right->efs_outer_vid) | if (left->efs_outer_vid != right->efs_outer_vid) | ||||
return (B_FALSE); | return (B_FALSE); | ||||
if (left->efs_ether_type != right->efs_ether_type) | if (left->efs_ether_type != right->efs_ether_type) | ||||
return (B_FALSE); | return (B_FALSE); | ||||
if (left->efs_ip_proto != right->efs_ip_proto) | if (left->efs_ip_proto != right->efs_ip_proto) | ||||
return (B_FALSE); | |||||
if (left->efs_encap_type != right->efs_encap_type) | |||||
return (B_FALSE); | return (B_FALSE); | ||||
return (B_TRUE); | return (B_TRUE); | ||||
} | } | ||||
static __checkReturn boolean_t | static __checkReturn boolean_t | ||||
ef10_filter_same_dest( | ef10_filter_same_dest( | ||||
▲ Show 20 Lines • Show All 1,102 Lines • Show Last 20 Lines |