net/memif: fix init when already connected
authorJúlius Milan <jmilan.dev@gmail.com>
Wed, 19 Feb 2020 08:19:16 +0000 (09:19 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Wed, 18 Mar 2020 09:21:41 +0000 (10:21 +0100)
This patch fixes the situation when there is already connected pair of
memif interfaces and another slave tries to initiate the connection with
(already occupied) master. Expected behavior is that the second slave
is refused and gets disconnect message with reason: "Already connected",
while old connection remains functional.

Fixes: 09c7e63a71f9 ("net/memif: introduce memory interface PMD")
Cc: stable@dpdk.org
Signed-off-by: Július Milan <jmilan.dev@gmail.com>
Reviewed-by: Jakub Grajciar <jgrajcia@cisco.com>
drivers/net/memif/memif_socket.c

index 8ce2cc9..67794cb 100644 (file)
@@ -204,6 +204,13 @@ memif_msg_receive_init(struct memif_control_channel *cc, memif_msg_t *msg)
                pmd = dev->data->dev_private;
                if (((pmd->flags & ETH_MEMIF_FLAG_DISABLED) == 0) &&
                    (pmd->id == i->id) && (pmd->role == MEMIF_ROLE_MASTER)) {
+                       if (pmd->flags & (ETH_MEMIF_FLAG_CONNECTING |
+                                          ETH_MEMIF_FLAG_CONNECTED)) {
+                               memif_msg_enq_disconnect(cc,
+                                                        "Already connected", 0);
+                               return -1;
+                       }
+
                        /* assign control channel to device */
                        cc->dev = dev;
                        pmd->cc = cc;
@@ -215,12 +222,6 @@ memif_msg_receive_init(struct memif_control_channel *cc, memif_msg_t *msg)
                                return -1;
                        }
 
-                       if (pmd->flags & (ETH_MEMIF_FLAG_CONNECTING |
-                                          ETH_MEMIF_FLAG_CONNECTED)) {
-                               memif_msg_enq_disconnect(pmd->cc,
-                                                        "Already connected", 0);
-                               return -1;
-                       }
                        strlcpy(pmd->remote_name, (char *)i->name,
                                sizeof(pmd->remote_name));
 
@@ -772,6 +773,7 @@ memif_intr_handler(void *arg)
        ret = memif_msg_receive(cc);
        /* if driver failed to assign device */
        if (cc->dev == NULL) {
+               memif_msg_send_from_queue(cc);
                ret = rte_intr_callback_unregister_pending(&cc->intr_handle,
                                                           memif_intr_handler,
                                                           cc,