static int get_ts_correction(ef_driver_handle vi_dh, int res_id, int* rx_ts_correction) { ci_resource_op_t op; int rc; op.op = CI_RSOP_VI_GET_RX_TS_CORRECTION; op.id = efch_make_resource_id(res_id); rc = ci_resource_op(vi_dh, &op); *rx_ts_correction = op.u.vi_rx_ts_correction.out_rx_ts_correction; return rc; }
unsigned ef_vi_mtu(ef_vi* vi, ef_driver_handle fd) { ci_resource_op_t op; int rc; op.op = CI_RSOP_VI_GET_MTU; op.id = efch_make_resource_id(vi->vi_resource_id); rc = ci_resource_op(fd, &op); if( rc < 0 ) LOGV(ef_log("%s: ci_resource_op %d", __FUNCTION__, rc)); return op.u.vi_get_mtu.out_mtu; }
int ef_vi_get_mac(ef_vi* vi, ef_driver_handle dh, void* mac_out) { ci_resource_op_t op; int rc; op.op = CI_RSOP_VI_GET_MAC; op.id = efch_make_resource_id(vi->vi_resource_id); rc = ci_resource_op(dh, &op); if( rc < 0 ) LOGV(ef_log("%s: ci_resource_op %d", __FUNCTION__, rc)); memcpy(mac_out, op.u.vi_get_mac.out_mac, 6); return rc; }
int ef_eventq_put(unsigned evq_id, ef_driver_handle fd, unsigned ev) { ci_resource_op_t op; int64_t ev64; EF_VI_BUG_ON((ev & EFVI_FALCON_EVENT_SW_DATA_MASK) != ev); ev64 = ev; op.op = CI_RSOP_EVENTQ_PUT; op.id = efch_make_resource_id(evq_id); op.u.evq_put.ev = cpu_to_le64(ev64); return ci_resource_op(fd, &op); }
int ef_vi_flush(ef_vi* ep, ef_driver_handle fd) { ci_resource_op_t op; int rc; op.op = CI_RSOP_PT_ENDPOINT_FLUSH; op.id = efch_make_resource_id(ep->vi_resource_id); rc = ci_resource_op(fd, &op); if( rc < 0 ) { LOGV(ef_log("ef_vi_flush: ci_resource_op %d", rc)); return rc; } return 0; }
int ef_vi_pace(ef_vi* ep, ef_driver_handle fd, int val) { ci_resource_op_t op; int rc; op.op = CI_RSOP_PT_ENDPOINT_PACE; op.id = efch_make_resource_id(ep->vi_resource_id); op.u.pt.pace = val; rc = ci_resource_op(fd, &op); if( rc < 0 ) { LOGV(ef_log("ef_vi_pace: ci_resource_op %d", rc)); return rc; } return 0; }
static int ef_filter_del(ef_driver_handle dh, int resource_id, ef_filter_cookie *filter_cookie) { ci_resource_op_t op; if( filter_cookie->filter_type == EF_FILTER_PORT_SNIFF ) { op.op = CI_RSOP_PT_SNIFF; op.id = efch_make_resource_id(resource_id); op.u.pt_sniff.enable = 0; } if( filter_cookie->filter_type == EF_FILTER_TX_PORT_SNIFF ) { op.op = CI_RSOP_TX_PT_SNIFF; op.id = efch_make_resource_id(resource_id); op.u.tx_pt_sniff.enable = 0; } else { op.op = CI_RSOP_FILTER_DEL; op.id = efch_make_resource_id(resource_id); op.u.filter_del.filter_id = filter_cookie->filter_id; } return ci_resource_op(dh, &op); }
static int ef_filter_add(ef_driver_handle dh, int resource_id, const ef_filter_spec *fs, ef_filter_cookie *filter_cookie_out) { ci_resource_op_t op; int rc; op.id = efch_make_resource_id(resource_id); op.u.filter_add.flags = ( (fs->flags & EF_FILTER_FLAG_REPLACE) ? CI_RSOP_FILTER_ADD_FLAG_REPLACE : 0 ) | ( (fs->flags & EF_FILTER_FLAG_MCAST_LOOP_RECEIVE) ? CI_RSOP_FILTER_ADD_FLAG_MCAST_LOOP_RECEIVE : 0); switch (fs->type) { case EF_FILTER_IP4 | EF_FILTER_VLAN: op.op = CI_RSOP_FILTER_ADD_IP4_VLAN; op.u.filter_add.ip4.protocol = fs->data[0]; op.u.filter_add.ip4.host_be32 = fs->data[1]; op.u.filter_add.ip4.port_be16 = fs->data[2]; op.u.filter_add.ip4.rhost_be32 = fs->data[3]; op.u.filter_add.ip4.rport_be16 = fs->data[4]; op.u.filter_add.mac.vlan_id = fs->data[5]; break; case EF_FILTER_IP4: op.op = CI_RSOP_FILTER_ADD_IP4; op.u.filter_add.ip4.protocol = fs->data[0]; op.u.filter_add.ip4.host_be32 = fs->data[1]; op.u.filter_add.ip4.port_be16 = fs->data[2]; op.u.filter_add.ip4.rhost_be32 = fs->data[3]; op.u.filter_add.ip4.rport_be16 = fs->data[4]; break; case EF_FILTER_MAC: op.op = CI_RSOP_FILTER_ADD_MAC; op.u.filter_add.mac.vlan_id = fs->data[0]; memcpy(op.u.filter_add.mac.mac, &fs->data[1], 6); break; case EF_FILTER_ALL_UNICAST: op.op = CI_RSOP_FILTER_ADD_ALL_UNICAST; break; case EF_FILTER_ALL_MULTICAST: op.op = CI_RSOP_FILTER_ADD_ALL_MULTICAST; break; case EF_FILTER_MISMATCH_UNICAST | EF_FILTER_VLAN: op.op = CI_RSOP_FILTER_ADD_MISMATCH_UNICAST_VLAN; op.u.filter_add.mac.vlan_id = fs->data[5]; break; case EF_FILTER_MISMATCH_UNICAST: op.op = CI_RSOP_FILTER_ADD_MISMATCH_UNICAST; break; case EF_FILTER_MISMATCH_MULTICAST | EF_FILTER_VLAN: op.op = CI_RSOP_FILTER_ADD_MISMATCH_MULTICAST_VLAN; op.u.filter_add.mac.vlan_id = fs->data[5]; break; case EF_FILTER_MISMATCH_MULTICAST: op.op = CI_RSOP_FILTER_ADD_MISMATCH_MULTICAST; break; case EF_FILTER_PORT_SNIFF: op.op = CI_RSOP_PT_SNIFF; op.u.pt_sniff.enable = 1; op.u.pt_sniff.promiscuous = fs->data[0]; break; case EF_FILTER_TX_PORT_SNIFF: op.op = CI_RSOP_TX_PT_SNIFF; op.u.tx_pt_sniff.enable = 1; break; case EF_FILTER_BLOCK_KERNEL: op.op = CI_RSOP_FILTER_ADD_BLOCK_KERNEL; break; case EF_FILTER_BLOCK_KERNEL_UNICAST: op.op = CI_RSOP_FILTER_ADD_BLOCK_KERNEL_UNICAST; break; case EF_FILTER_BLOCK_KERNEL_MULTICAST: op.op = CI_RSOP_FILTER_ADD_BLOCK_KERNEL_MULTICAST; break; default: return -EINVAL; } rc = ci_resource_op(dh, &op); if( rc == 0 && filter_cookie_out != NULL ) { /* SNIFF does not return an ID. The * filter_id field is ignored when removing, * but let's set it to something that will not be * confused with a real ID */ if( fs->type == EF_FILTER_PORT_SNIFF || fs->type == EF_FILTER_TX_PORT_SNIFF ) filter_cookie_out->filter_id = -1; else filter_cookie_out->filter_id = op.u.filter_add.out_filter_id; filter_cookie_out->filter_type = fs->type; } return rc; }