lkml.org 
[lkml]   [2022]   [Aug]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.19 0821/1157] RDMA/irdma: Fix VLAN connection with wildcard address
    Date
    From: Mustafa Ismail <mustafa.ismail@intel.com>

    [ Upstream commit 82ab2b52654c43ba24a3f6603fec40874cc5a7e5 ]

    When an application listens on a wildcard address, and there are VLAN and
    non-VLAN IP addresses, iWARP connection establishemnt can fail if the listen
    node VLAN ID does not match.

    Fix this by checking the vlan_id only if not a wildcard listen node.

    Fixes: 146b9756f14c ("RDMA/irdma: Add connection manager")
    Link: https://lore.kernel.org/r/20220705230815.265-7-shiraz.saleem@intel.com
    Signed-off-by: Mustafa Ismail <mustafa.ismail@intel.com>
    Signed-off-by: Shiraz Saleem <shiraz.saleem@intel.com>
    Signed-off-by: Leon Romanovsky <leon@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/infiniband/hw/irdma/cm.c | 11 ++++++-----
    1 file changed, 6 insertions(+), 5 deletions(-)

    diff --git a/drivers/infiniband/hw/irdma/cm.c b/drivers/infiniband/hw/irdma/cm.c
    index 646fa8677490..7b086fe63a24 100644
    --- a/drivers/infiniband/hw/irdma/cm.c
    +++ b/drivers/infiniband/hw/irdma/cm.c
    @@ -1477,12 +1477,13 @@ irdma_find_listener(struct irdma_cm_core *cm_core, u32 *dst_addr, u16 dst_port,
    list_for_each_entry (listen_node, &cm_core->listen_list, list) {
    memcpy(listen_addr, listen_node->loc_addr, sizeof(listen_addr));
    listen_port = listen_node->loc_port;
    + if (listen_port != dst_port ||
    + !(listener_state & listen_node->listener_state))
    + continue;
    /* compare node pair, return node handle if a match */
    - if ((!memcmp(listen_addr, dst_addr, sizeof(listen_addr)) ||
    - !memcmp(listen_addr, ip_zero, sizeof(listen_addr))) &&
    - listen_port == dst_port &&
    - vlan_id == listen_node->vlan_id &&
    - (listener_state & listen_node->listener_state)) {
    + if (!memcmp(listen_addr, ip_zero, sizeof(listen_addr)) ||
    + (!memcmp(listen_addr, dst_addr, sizeof(listen_addr)) &&
    + vlan_id == listen_node->vlan_id)) {
    refcount_inc(&listen_node->refcnt);
    spin_unlock_irqrestore(&cm_core->listen_list_lock,
    flags);
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-08-16 02:24    [W:3.766 / U:0.336 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site