mirror of https://github.com/F-Stack/f-stack.git
110 lines
2.8 KiB
C
110 lines
2.8 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright(c) 2022 Intel Corporation
|
|
*/
|
|
|
|
#ifndef L3FWD_ACL_SCALAR_H
|
|
#define L3FWD_ACL_SCALAR_H
|
|
|
|
#include "l3fwd.h"
|
|
#include "l3fwd_common.h"
|
|
|
|
static inline void
|
|
l3fwd_acl_prepare_one_packet(struct rte_mbuf **pkts_in, struct acl_search_t *acl,
|
|
int index)
|
|
{
|
|
struct rte_mbuf *pkt = pkts_in[index];
|
|
|
|
if (RTE_ETH_IS_IPV4_HDR(pkt->packet_type)) {
|
|
/* Fill acl structure */
|
|
acl->data_ipv4[acl->num_ipv4] = MBUF_IPV4_2PROTO(pkt);
|
|
acl->m_ipv4[(acl->num_ipv4)++] = pkt;
|
|
|
|
} else if (RTE_ETH_IS_IPV6_HDR(pkt->packet_type)) {
|
|
/* Fill acl structure */
|
|
acl->data_ipv6[acl->num_ipv6] = MBUF_IPV6_2PROTO(pkt);
|
|
acl->m_ipv6[(acl->num_ipv6)++] = pkt;
|
|
} else {
|
|
/* Unknown type, drop the packet */
|
|
rte_pktmbuf_free(pkt);
|
|
}
|
|
}
|
|
|
|
static inline void
|
|
l3fwd_acl_prepare_acl_parameter(struct rte_mbuf **pkts_in, struct acl_search_t *acl,
|
|
int nb_rx)
|
|
{
|
|
int i;
|
|
|
|
acl->num_ipv4 = 0;
|
|
acl->num_ipv6 = 0;
|
|
|
|
/* Prefetch first packets */
|
|
for (i = 0; i < PREFETCH_OFFSET && i < nb_rx; i++) {
|
|
rte_prefetch0(rte_pktmbuf_mtod(
|
|
pkts_in[i], void *));
|
|
}
|
|
|
|
for (i = 0; i < (nb_rx - PREFETCH_OFFSET); i++) {
|
|
rte_prefetch0(rte_pktmbuf_mtod(pkts_in[
|
|
i + PREFETCH_OFFSET], void *));
|
|
l3fwd_acl_prepare_one_packet(pkts_in, acl, i);
|
|
}
|
|
|
|
/* Process left packets */
|
|
for (; i < nb_rx; i++)
|
|
l3fwd_acl_prepare_one_packet(pkts_in, acl, i);
|
|
}
|
|
|
|
static inline void
|
|
send_packets_single(struct lcore_conf *qconf, struct rte_mbuf *pkts[], uint16_t hops[],
|
|
uint32_t nb_tx)
|
|
{
|
|
uint32_t j;
|
|
struct rte_ether_hdr *eth_hdr;
|
|
|
|
for (j = 0; j < nb_tx; j++) {
|
|
/* Run rfc1812 if packet is ipv4 and checks enabled. */
|
|
rfc1812_process((struct rte_ipv4_hdr *)(rte_pktmbuf_mtod(
|
|
pkts[j], struct rte_ether_hdr *) + 1),
|
|
&hops[j], pkts[j]->packet_type);
|
|
|
|
/* Set MAC addresses. */
|
|
eth_hdr = rte_pktmbuf_mtod(pkts[j], struct rte_ether_hdr *);
|
|
if (hops[j] != BAD_PORT) {
|
|
*(uint64_t *)ð_hdr->dst_addr = dest_eth_addr[hops[j]];
|
|
rte_ether_addr_copy(&ports_eth_addr[hops[j]],
|
|
ð_hdr->src_addr);
|
|
send_single_packet(qconf, pkts[j], hops[j]);
|
|
} else
|
|
rte_pktmbuf_free(pkts[j]);
|
|
}
|
|
}
|
|
|
|
static inline void
|
|
l3fwd_acl_send_packets(struct lcore_conf *qconf, struct rte_mbuf *pkts[], uint32_t res[],
|
|
uint32_t nb_tx)
|
|
{
|
|
uint32_t i;
|
|
uint16_t dst_port[nb_tx];
|
|
|
|
for (i = 0; i != nb_tx; i++) {
|
|
if (likely((res[i] & ACL_DENY_SIGNATURE) == 0 && res[i] != 0)) {
|
|
dst_port[i] = res[i] - FWD_PORT_SHIFT;
|
|
} else {
|
|
dst_port[i] = BAD_PORT;
|
|
#ifdef L3FWDACL_DEBUG
|
|
if ((res & ACL_DENY_SIGNATURE) != 0) {
|
|
if (RTE_ETH_IS_IPV4_HDR(pkts[i]->packet_type))
|
|
dump_acl4_rule(pkts[i], res[i]);
|
|
else if (RTE_ETH_IS_IPV6_HDR(pkt[i]->packet_type))
|
|
dump_acl6_rule(pkt[i], res[i]);
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
|
|
send_packets_single(qconf, pkts, dst_port, nb_tx);
|
|
}
|
|
|
|
#endif /* L3FWD_ACL_SCALAR_H */
|