app/crypto-perf: support lookaside IPsec
[dpdk.git] / examples / ipsec-secgw / ipsec-secgw.c
index 20d69ba..744bb61 100644 (file)
@@ -24,7 +24,6 @@
 #include <rte_log.h>
 #include <rte_eal.h>
 #include <rte_launch.h>
-#include <rte_atomic.h>
 #include <rte_cycles.h>
 #include <rte_prefetch.h>
 #include <rte_lcore.h>
@@ -184,7 +183,8 @@ static uint64_t frag_ttl_ns = MAX_FRAG_TTL_NS;
 /* application wide librte_ipsec/SA parameters */
 struct app_sa_prm app_sa_prm = {
                        .enable = 0,
-                       .cache_sz = SA_CACHE_SZ
+                       .cache_sz = SA_CACHE_SZ,
+                       .udp_encap = 0
                };
 static const char *cfgfile;
 
@@ -360,6 +360,9 @@ prepare_one_packet(struct rte_mbuf *pkt, struct ipsec_traffic *t)
        const struct rte_ether_hdr *eth;
        const struct rte_ipv4_hdr *iph4;
        const struct rte_ipv6_hdr *iph6;
+       const struct rte_udp_hdr *udp;
+       uint16_t ip4_hdr_len;
+       uint16_t nat_port;
 
        eth = rte_pktmbuf_mtod(pkt, const struct rte_ether_hdr *);
        if (eth->ether_type == rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4)) {
@@ -368,9 +371,28 @@ prepare_one_packet(struct rte_mbuf *pkt, struct ipsec_traffic *t)
                        RTE_ETHER_HDR_LEN);
                adjust_ipv4_pktlen(pkt, iph4, 0);
 
-               if (iph4->next_proto_id == IPPROTO_ESP)
+               switch (iph4->next_proto_id) {
+               case IPPROTO_ESP:
                        t->ipsec.pkts[(t->ipsec.num)++] = pkt;
-               else {
+                       break;
+               case IPPROTO_UDP:
+                       if (app_sa_prm.udp_encap == 1) {
+                               ip4_hdr_len = ((iph4->version_ihl &
+                                       RTE_IPV4_HDR_IHL_MASK) *
+                                       RTE_IPV4_IHL_MULTIPLIER);
+                               udp = rte_pktmbuf_mtod_offset(pkt,
+                                       struct rte_udp_hdr *, ip4_hdr_len);
+                               nat_port = rte_cpu_to_be_16(IPSEC_NAT_T_PORT);
+                               if (udp->src_port == nat_port ||
+                                       udp->dst_port == nat_port){
+                                       t->ipsec.pkts[(t->ipsec.num)++] = pkt;
+                                       pkt->packet_type |=
+                                               MBUF_PTYPE_TUNNEL_ESP_IN_UDP;
+                                       break;
+                               }
+                       }
+               /* Fall through */
+               default:
                        t->ip4.data[t->ip4.num] = &iph4->next_proto_id;
                        t->ip4.pkts[(t->ip4.num)++] = pkt;
                }
@@ -403,9 +425,25 @@ prepare_one_packet(struct rte_mbuf *pkt, struct ipsec_traffic *t)
                        return;
                }
 
-               if (next_proto == IPPROTO_ESP)
+               switch (next_proto) {
+               case IPPROTO_ESP:
                        t->ipsec.pkts[(t->ipsec.num)++] = pkt;
-               else {
+                       break;
+               case IPPROTO_UDP:
+                       if (app_sa_prm.udp_encap == 1) {
+                               udp = rte_pktmbuf_mtod_offset(pkt,
+                                       struct rte_udp_hdr *, l3len);
+                               nat_port = rte_cpu_to_be_16(IPSEC_NAT_T_PORT);
+                               if (udp->src_port == nat_port ||
+                                       udp->dst_port == nat_port){
+                                       t->ipsec.pkts[(t->ipsec.num)++] = pkt;
+                                       pkt->packet_type |=
+                                               MBUF_PTYPE_TUNNEL_ESP_IN_UDP;
+                                       break;
+                               }
+                       }
+               /* Fall through */
+               default:
                        t->ip6.data[t->ip6.num] = &iph6->proto;
                        t->ip6.pkts[(t->ip6.num)++] = pkt;
                }
@@ -506,9 +544,9 @@ prepare_tx_pkt(struct rte_mbuf *pkt, uint16_t port,
                ethhdr->ether_type = rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV6);
        }
 
-       memcpy(&ethhdr->s_addr, &ethaddr_tbl[port].src,
+       memcpy(&ethhdr->src_addr, &ethaddr_tbl[port].src,
                        sizeof(struct rte_ether_addr));
-       memcpy(&ethhdr->d_addr, &ethaddr_tbl[port].dst,
+       memcpy(&ethhdr->dst_addr, &ethaddr_tbl[port].dst,
                        sizeof(struct rte_ether_addr));
 }
 
@@ -809,16 +847,6 @@ process_pkts_inbound_nosp(struct ipsec_ctx *ipsec_ctx,
        struct rte_mbuf *m;
        uint32_t nb_pkts_in, i, idx;
 
-       /* Drop any IPv4 traffic from unprotected ports */
-       free_pkts(traffic->ip4.pkts, traffic->ip4.num);
-
-       traffic->ip4.num = 0;
-
-       /* Drop any IPv6 traffic from unprotected ports */
-       free_pkts(traffic->ip6.pkts, traffic->ip6.num);
-
-       traffic->ip6.num = 0;
-
        if (app_sa_prm.enable == 0) {
 
                nb_pkts_in = ipsec_inbound(ipsec_ctx, traffic->ipsec.pkts,
@@ -1456,6 +1484,8 @@ parse_portmask(const char *portmask)
        char *end = NULL;
        unsigned long pm;
 
+       errno = 0;
+
        /* parse hexadecimal string */
        pm = strtoul(portmask, &end, 16);
        if ((portmask[0] == '\0') || (end == NULL) || (*end != '\0'))
@@ -3037,6 +3067,9 @@ main(int32_t argc, char **argv)
                rte_eth_dev_close(portid);
                printf(" Done\n");
        }
+
+       /* clean up the EAL */
+       rte_eal_cleanup();
        printf("Bye...\n");
 
        return 0;