examples/kni: fix crash during MTU set
[dpdk.git] / examples / kni / main.c
index 1069fd0..80dd035 100644 (file)
@@ -176,9 +176,13 @@ signal_handler(int signum)
                return;
        }
 
-       /* When we receive a RTMIN or SIGINT signal, stop kni processing */
-       if (signum == SIGRTMIN || signum == SIGINT){
-               printf("\nSIGRTMIN/SIGINT received. KNI processing stopping.\n");
+       /*
+        * When we receive a RTMIN or SIGINT or SIGTERM signal,
+        * stop kni processing
+        */
+       if (signum == SIGRTMIN || signum == SIGINT || signum == SIGTERM) {
+               printf("\nSIGRTMIN/SIGINT/SIGTERM received. "
+                       "KNI processing stopping.\n");
                rte_atomic32_inc(&kni_stop);
                return;
         }
@@ -654,6 +658,7 @@ check_all_ports_link_status(uint32_t port_mask)
        uint16_t portid;
        uint8_t count, all_ports_up, print_flag = 0;
        struct rte_eth_link link;
+       int ret;
 
        printf("\nChecking link status\n");
        fflush(stdout);
@@ -663,7 +668,14 @@ check_all_ports_link_status(uint32_t port_mask)
                        if ((port_mask & (1 << portid)) == 0)
                                continue;
                        memset(&link, 0, sizeof(link));
-                       rte_eth_link_get_nowait(portid, &link);
+                       ret = rte_eth_link_get_nowait(portid, &link);
+                       if (ret < 0) {
+                               all_ports_up = 0;
+                               if (print_flag == 1)
+                                       printf("Port %u link get failed: %s\n",
+                                               portid, rte_strerror(-ret));
+                               continue;
+                       }
                        /* print link status if flag set */
                        if (print_flag == 1) {
                                if (link.link_status)
@@ -671,7 +683,7 @@ check_all_ports_link_status(uint32_t port_mask)
                                        "Port%d Link Up - speed %uMbps - %s\n",
                                                portid, link.link_speed,
                                (link.link_duplex == ETH_LINK_FULL_DUPLEX) ?
-                                       ("full-duplex") : ("half-duplex\n"));
+                                       ("full-duplex") : ("half-duplex"));
                                else
                                        printf("Port %d Link Down\n", portid);
                                continue;
@@ -731,6 +743,7 @@ monitor_all_ports_link_status(void *arg)
        struct kni_port_params **p = kni_port_params_array;
        int prev;
        (void) arg;
+       int ret;
 
        while (monitor_links) {
                rte_delay_ms(500);
@@ -738,7 +751,13 @@ monitor_all_ports_link_status(void *arg)
                        if ((ports_mask & (1 << portid)) == 0)
                                continue;
                        memset(&link, 0, sizeof(link));
-                       rte_eth_link_get_nowait(portid, &link);
+                       ret = rte_eth_link_get_nowait(portid, &link);
+                       if (ret < 0) {
+                               RTE_LOG(ERR, APP,
+                                       "Get link failed (port %u): %s\n",
+                                       portid, rte_strerror(-ret));
+                               continue;
+                       }
                        for (i = 0; i < p[portid]->nb_kni; i++) {
                                prev = rte_kni_update_link(p[portid]->kni[i],
                                                link.link_status);
@@ -749,15 +768,16 @@ monitor_all_ports_link_status(void *arg)
        return NULL;
 }
 
-/* Callback for request of changing MTU */
 static int
-kni_change_mtu(uint16_t port_id, unsigned int new_mtu)
+kni_change_mtu_(uint16_t port_id, unsigned int new_mtu)
 {
        int ret;
        uint16_t nb_rxd = NB_RXD;
+       uint16_t nb_txd = NB_TXD;
        struct rte_eth_conf conf;
        struct rte_eth_dev_info dev_info;
        struct rte_eth_rxconf rxq_conf;
+       struct rte_eth_txconf txq_conf;
 
        if (!rte_eth_dev_is_valid_port(port_id)) {
                RTE_LOG(ERR, APP, "Invalid port id %d\n", port_id);
@@ -785,7 +805,7 @@ kni_change_mtu(uint16_t port_id, unsigned int new_mtu)
                return ret;
        }
 
-       ret = rte_eth_dev_adjust_nb_rx_tx_desc(port_id, &nb_rxd, NULL);
+       ret = rte_eth_dev_adjust_nb_rx_tx_desc(port_id, &nb_rxd, &nb_txd);
        if (ret < 0)
                rte_exit(EXIT_FAILURE, "Could not adjust number of descriptors "
                                "for port%u (%d)\n", (unsigned int)port_id,
@@ -810,6 +830,16 @@ kni_change_mtu(uint16_t port_id, unsigned int new_mtu)
                return ret;
        }
 
+       txq_conf = dev_info.default_txconf;
+       txq_conf.offloads = conf.txmode.offloads;
+       ret = rte_eth_tx_queue_setup(port_id, 0, nb_txd,
+               rte_eth_dev_socket_id(port_id), &txq_conf);
+       if (ret < 0) {
+               RTE_LOG(ERR, APP, "Fail to setup Tx queue of port %d\n",
+                               port_id);
+               return ret;
+       }
+
        /* Restart specific port */
        ret = rte_eth_dev_start(port_id);
        if (ret < 0) {
@@ -820,6 +850,19 @@ kni_change_mtu(uint16_t port_id, unsigned int new_mtu)
        return 0;
 }
 
+/* Callback for request of changing MTU */
+static int
+kni_change_mtu(uint16_t port_id, unsigned int new_mtu)
+{
+       int ret;
+
+       rte_atomic32_inc(&kni_pause);
+       ret =  kni_change_mtu_(port_id, new_mtu);
+       rte_atomic32_dec(&kni_pause);
+
+       return ret;
+}
+
 /* Callback for request of configuring network interface up/down */
 static int
 kni_config_network_interface(uint16_t port_id, uint8_t if_up)
@@ -925,11 +968,18 @@ kni_alloc(uint16_t port_id)
                                        port_id, strerror(-ret));
 
                        /* Get the interface default mac address */
-                       rte_eth_macaddr_get(port_id,
+                       ret = rte_eth_macaddr_get(port_id,
                                (struct rte_ether_addr *)&conf.mac_addr);
+                       if (ret != 0)
+                               rte_exit(EXIT_FAILURE,
+                                       "Failed to get MAC address (port %u): %s\n",
+                                       port_id, rte_strerror(-ret));
 
                        rte_eth_dev_get_mtu(port_id, &conf.mtu);
 
+                       conf.min_mtu = dev_info.min_mtu;
+                       conf.max_mtu = dev_info.max_mtu;
+
                        memset(&ops, 0, sizeof(ops));
                        ops.port_id = port_id;
                        ops.change_mtu = kni_change_mtu;
@@ -984,6 +1034,7 @@ main(int argc, char** argv)
        signal(SIGUSR2, signal_handler);
        signal(SIGRTMIN, signal_handler);
        signal(SIGINT, signal_handler);
+       signal(SIGTERM, signal_handler);
 
        /* Initialise EAL */
        ret = rte_eal_init(argc, argv);