#include <stdarg.h>
#include <errno.h>
#include <getopt.h>
+#include <signal.h>
+#include <stdbool.h>
#include <rte_common.h>
#include <rte_vect.h>
#include <cmdline_parse.h>
#include <cmdline_parse_etheraddr.h>
+static volatile bool force_quit;
+
#define APP_LOOKUP_EXACT_MATCH 0
#define APP_LOOKUP_LPM 1
#define DO_RFC_1812_CHECKS
init_val = rte_jhash_1word(k->ip_dst, init_val);
init_val = rte_jhash_1word(*p, init_val);
#endif /* RTE_MACHINE_CPUFLAG_SSE4_2 */
- return (init_val);
+ return init_val;
}
static inline uint32_t
init_val = rte_jhash(k->ip_dst, sizeof(uint8_t) * IPV6_ADDR_LEN, init_val);
init_val = rte_jhash_1word(*p, init_val);
#endif /* RTE_MACHINE_CPUFLAG_SSE4_2 */
- return (init_val);
+ return init_val;
}
#define IPV4_L3FWD_NUM_ROUTES \
const void *key_array[8] = {&key[0], &key[1], &key[2], &key[3],
&key[4], &key[5], &key[6], &key[7]};
- rte_hash_lookup_multi(qconf->ipv6_lookup_struct, &key_array[0], 4, ret);
+ rte_hash_lookup_multi(qconf->ipv6_lookup_struct, &key_array[0], 8, ret);
dst_port[0] = (uint8_t) ((ret[0] < 0) ? portid:ipv6_l3fwd_out_if[ret[0]]);
dst_port[1] = (uint8_t) ((ret[1] < 0) ? portid:ipv6_l3fwd_out_if[ret[1]]);
dst_port[2] = (uint8_t) ((ret[2] < 0) ? portid:ipv6_l3fwd_out_if[ret[2]]);
dst_ipv4 = rte_be_to_cpu_32(dst_ipv4);
dp = get_dst_port(qconf, pkt, dst_ipv4, portid);
- te = _mm_load_si128((__m128i *)eth_hdr);
+ te = _mm_loadu_si128((__m128i *)eth_hdr);
ve = val_eth[dp];
dst_port[0] = dp;
rfc1812_process(ipv4_hdr, dst_port, pkt->packet_type);
te = _mm_blend_epi16(te, ve, MASK_ETH);
- _mm_store_si128((__m128i *)eth_hdr, te);
+ _mm_storeu_si128((__m128i *)eth_hdr, te);
}
/*
p[3] = rte_pktmbuf_mtod(pkt[3], __m128i *);
ve[0] = val_eth[dst_port[0]];
- te[0] = _mm_load_si128(p[0]);
+ te[0] = _mm_loadu_si128(p[0]);
ve[1] = val_eth[dst_port[1]];
- te[1] = _mm_load_si128(p[1]);
+ te[1] = _mm_loadu_si128(p[1]);
ve[2] = val_eth[dst_port[2]];
- te[2] = _mm_load_si128(p[2]);
+ te[2] = _mm_loadu_si128(p[2]);
ve[3] = val_eth[dst_port[3]];
- te[3] = _mm_load_si128(p[3]);
+ te[3] = _mm_loadu_si128(p[3]);
/* Update first 12 bytes, keep rest bytes intact. */
te[0] = _mm_blend_epi16(te[0], ve[0], MASK_ETH);
te[2] = _mm_blend_epi16(te[2], ve[2], MASK_ETH);
te[3] = _mm_blend_epi16(te[3], ve[3], MASK_ETH);
- _mm_store_si128(p[0], te[0]);
- _mm_store_si128(p[1], te[1]);
- _mm_store_si128(p[2], te[2]);
- _mm_store_si128(p[3], te[3]);
+ _mm_storeu_si128(p[0], te[0]);
+ _mm_storeu_si128(p[1], te[1]);
+ _mm_storeu_si128(p[2], te[2]);
+ _mm_storeu_si128(p[3], te[3]);
rfc1812_process((struct ipv4_hdr *)((struct ether_hdr *)p[0] + 1),
&dst_port[0], pkt[0]->packet_type);
portid, queueid);
}
- while (1) {
+ while (!force_quit) {
cur_tsc = rte_rdtsc();
}
}
+
+ return 0;
}
static int
}
if (!strncmp(lgopts[option_index].name, CMD_LINE_OPT_ETH_DEST,
- sizeof(CMD_LINE_OPT_CONFIG))) {
+ sizeof(CMD_LINE_OPT_ETH_DEST))) {
parse_eth_dest(optarg);
}
printf("\nChecking link status");
fflush(stdout);
for (count = 0; count <= MAX_CHECK_TIME; count++) {
+ if (force_quit)
+ return;
all_ports_up = 1;
for (portid = 0; portid < port_num; portid++) {
+ if (force_quit)
+ return;
if ((port_mask & (1 << portid)) == 0)
continue;
memset(&link, 0, sizeof(link));
}
}
+static void
+signal_handler(int signum)
+{
+ if (signum == SIGINT || signum == SIGTERM) {
+ printf("\n\nSignal %d received, preparing to exit...\n",
+ signum);
+ force_quit = true;
+ }
+}
+
int
main(int argc, char **argv)
{
argc -= ret;
argv += ret;
+ force_quit = false;
+ signal(SIGINT, signal_handler);
+ signal(SIGTERM, signal_handler);
+
/* pre-init dst MACs for all ports to 02:00:00:00:00:xx */
for (portid = 0; portid < RTE_MAX_ETHPORTS; portid++) {
dest_eth_addr[portid] = ETHER_LOCAL_ADMIN_ADDR + ((uint64_t)portid << 40);
check_all_ports_link_status((uint8_t)nb_ports, enabled_port_mask);
+ ret = 0;
/* launch per-lcore init on every lcore */
rte_eal_mp_remote_launch(main_loop, NULL, CALL_MASTER);
RTE_LCORE_FOREACH_SLAVE(lcore_id) {
- if (rte_eal_wait_lcore(lcore_id) < 0)
- return -1;
+ if (rte_eal_wait_lcore(lcore_id) < 0) {
+ ret = -1;
+ break;
+ }
}
- return 0;
+ /* stop ports */
+ for (portid = 0; portid < nb_ports; portid++) {
+ if ((enabled_port_mask & (1 << portid)) == 0)
+ continue;
+ printf("Closing port %d...", portid);
+ rte_eth_dev_stop(portid);
+ rte_eth_dev_close(portid);
+ printf(" Done\n");
+ }
+ printf("Bye...\n");
+
+ return ret;
}