unsigned rte_kni_tx_burst(struct rte_kni *kni, struct rte_mbuf **mbufs, unsigned num) { unsigned ret = kni_fifo_put(kni->rx_q, (void **)mbufs, num); /* Get mbufs from free_q and then free them */ kni_free_mbufs(kni); return ret; }
unsigned rte_kni_tx_burst(struct rte_kni *kni, struct rte_mbuf **mbufs, unsigned num) { unsigned ret = kni_fifo_put(kni->rx_q, (void **)mbufs, num); #ifdef RTE_LIBRW_PIOT /* try allocating buffer only if the fifo is not full */ if (ret) #endif /* Get mbufs from free_q and then free them */ kni_free_mbufs(kni); return ret; }
unsigned rte_kni_tx_burst(struct rte_kni *kni, struct rte_mbuf **mbufs, unsigned num) { unsigned ret = kni_fifo_put(kni->rx_q, (void **)mbufs, num); /* Get mbufs from free_q and then free them */ kni_free_mbufs(kni); /* Handle the requests from kernel space */ kni_request_handler(kni); return ret; }
int rte_kni_handle_request(struct rte_kni *kni) { unsigned ret; struct rte_kni_request *req; if (kni == NULL) return -1; #ifdef RTE_LIBRW_PIOT /*If there is a case where the kni interface is unidirectional. then the free-q will never get freed. Hence calling it here*/ if (!kni_fifo_empty(kni->free_q)) kni_free_mbufs(kni); #endif /* Get request mbuf */ ret = kni_fifo_get(kni->req_q, (void **)&req, 1); if (ret != 1) return 0; /* It is OK of can not getting the request mbuf */ if (req != kni->sync_addr) { rte_panic("Wrong req pointer %p\n", req); } /* Analyze the request and call the relevant actions for it */ switch (req->req_id) { case RTE_KNI_REQ_CHANGE_MTU: /* Change MTU */ if (kni->ops.change_mtu) req->result = kni->ops.change_mtu(kni->ops.port_id, req->new_mtu); break; case RTE_KNI_REQ_CFG_NETWORK_IF: /* Set network interface up/down */ if (kni->ops.config_network_if) req->result = kni->ops.config_network_if(\ kni->ops.port_id, req->if_up); break; default: RTE_LOG(ERR, KNI, "Unknown request id %u\n", req->req_id); req->result = -EINVAL; break; } /* Construct response mbuf and put it back to resp_q */ ret = kni_fifo_put(kni->resp_q, (void **)&req, 1); if (ret != 1) { RTE_LOG(ERR, KNI, "Fail to put the muf back to resp_q\n"); return -1; /* It is an error of can't putting the mbuf back */ } return 0; }
unsigned rte_kni_tx_burst(struct rte_kni *kni, struct rte_mbuf **mbufs, unsigned num) { void *phy_mbufs[num]; unsigned int ret; unsigned int i; for (i = 0; i < num; i++) phy_mbufs[i] = va2pa(mbufs[i]); ret = kni_fifo_put(kni->rx_q, phy_mbufs, num); /* Get mbufs from free_q and then free them */ kni_free_mbufs(kni); return ret; }