From patchwork Wed Sep 16 12:17:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 1365245 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.01.org (client-ip=198.145.21.10; helo=ml01.01.org; envelope-from=mptcp-bounces@lists.01.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=a5kZocWA; dkim-atps=neutral Received: from ml01.01.org (ml01.01.org [198.145.21.10]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4BrzgS3hbnz9sRK for ; Wed, 16 Sep 2020 22:19:47 +1000 (AEST) Received: from ml01.vlan13.01.org (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id D8432143FE16F; Wed, 16 Sep 2020 05:19:44 -0700 (PDT) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=2607:f8b0:4864:20::644; helo=mail-pl1-x644.google.com; envelope-from=geliangtang@gmail.com; receiver= Received: from mail-pl1-x644.google.com (mail-pl1-x644.google.com [IPv6:2607:f8b0:4864:20::644]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id C511014262A9C for ; Wed, 16 Sep 2020 05:19:42 -0700 (PDT) Received: by mail-pl1-x644.google.com with SMTP id y6so3093710plt.9 for ; Wed, 16 Sep 2020 05:19:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=ipxLP3dh4g04ihBlpmtjT1p59PL1mKl4J44SPDoO2ZE=; b=a5kZocWAndA7gj+JoQAVGtZw+EjMdm9FvId4nRjltazKJ4+aJJpVYVPZx6a7KtHkvy plYiL0TGZqxYoJz4VLVevlrN+7UYwjB4i2mKoQaE9DE/lZqi3xQ6AQZQ2N8BOKmghbej Mu9gtEUUXQVjUmSFJVTPhYxaNjcvwl1PaGuSSwxfwa9Ko8km5BGt7dunC+0ai/EGEVQO rWWEwkX+3c+oynXwtPVcrkeBoAy3JruPQX3tYrisJzXzBveG9wMHRgGG+8tWMKBO7uTx qFKJOdGU2T2jl7STTcQJuMorCr6TzRCifWrjkvxef2IbTuUQRzG95xp/Mg8ikW3Mc2VL 9WWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=ipxLP3dh4g04ihBlpmtjT1p59PL1mKl4J44SPDoO2ZE=; b=cUcYw3PV/Xbzk82onaahfcnLAN4gyc6B6ila7M8CZkaTl9FiLM77YqFohSAzAvwgoI SxCCZX16xOzi6AwkOis2D+GUw0mS7HK8VI3sFUB4FZrmeNqzAl8w+T4iJUg0JB3hqdMQ Y9GyRe6n9EYeEHZM+Tncw/K0P0b0yBIvWJIHLwIJrIpqHXIdw8DiC4MFLHlTw8i1pe6h gn85V/Bl8Aqi9ZD26T9iwaGfDWgnX6TleVp6JQn4xB86GHpoLZ04AQxiThnWhQnm8h7x N4LcxolksHMPEK8vuRC3OvtM+R19MmXFSVMjYxqtxgqGaAHDp3ofGMKwbv+f05bf6eQR 5Ivw== X-Gm-Message-State: AOAM533O5yHVY1kFvSvEMWSOzCThizA+1jYo6/GGb5JET1txOk6ukCOP EUtGM1KyIjKFcgPizl1ECzggqG4Z6/NhYQ== X-Google-Smtp-Source: ABdhPJzpk4PCFLg5cJFTcyF+KfRbJBf/reLb8t1J5t5wqU86lX3bshyxz+zdWZItx6qPMuSmo0coXw== X-Received: by 2002:a17:902:eb03:b029:d1:8c50:aafb with SMTP id l3-20020a170902eb03b02900d18c50aafbmr23921151plb.29.1600258781239; Wed, 16 Sep 2020 05:19:41 -0700 (PDT) Received: from localhost ([43.224.245.180]) by smtp.gmail.com with ESMTPSA id r3sm16719728pfh.88.2020.09.16.05.19.39 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Sep 2020 05:19:40 -0700 (PDT) From: Geliang Tang To: mptcp@lists.01.org Date: Wed, 16 Sep 2020 20:17:26 +0800 Message-Id: <25ffeeb7631ebe2285b2449b076d2a424523c721.1600258235.git.geliangtang@gmail.com> X-Mailer: git-send-email 2.17.1 Message-ID-Hash: RLIKOVN36DF7C7I7TBQGUFX62YWV3DGH X-Message-ID-Hash: RLIKOVN36DF7C7I7TBQGUFX62YWV3DGH X-MailFrom: geliangtang@gmail.com X-Mailman-Rule-Hits: member-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address CC: Geliang Tang X-Mailman-Version: 3.1.1 Precedence: list Subject: [MPTCP] [MPTCP][PATCH v3 mptcp-next] mptcp: retransmit ADD_ADDR when timeout List-Id: Discussions regarding MPTCP upstreaming Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 This patch implemented the retransmition of ADD_ADDR when no ADD_ADDR echo is received. It added a timer with the announced address. When timeout occurs, ADD_ADDR will be retransmitted. Suggested-by: Mat Martineau Suggested-by: Paolo Abeni Signed-off-by: Geliang Tang --- v3: - use timer. - drop bh_lock_sock. - move __sock_put at the end of mptcp_pm_add_timer. v2: - Use delayed_work instead of timer. - This patch depends on my another patch named 'Squash-to: "mptcp: remove addr and subflow in PM netlink"'. --- net/mptcp/options.c | 1 + net/mptcp/pm_netlink.c | 71 +++++++++++++++++++++++++++++++++++++----- net/mptcp/protocol.h | 1 + 3 files changed, 66 insertions(+), 7 deletions(-) diff --git a/net/mptcp/options.c b/net/mptcp/options.c index 171039cbe9c4..14a290fae767 100644 --- a/net/mptcp/options.c +++ b/net/mptcp/options.c @@ -893,6 +893,7 @@ void mptcp_incoming_options(struct sock *sk, struct sk_buff *skb, mptcp_pm_add_addr_received(msk, &addr); MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ADDADDR); } else { + mptcp_pm_del_add_timer(msk, &addr); MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ECHOADD); } mp_opt.add_addr = 0; diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 8780d618a05a..b06070d81b6c 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -28,6 +28,14 @@ struct mptcp_pm_addr_entry { struct rcu_head rcu; }; +struct mptcp_pm_add_entry { + struct list_head list; + struct mptcp_addr_info addr; + struct timer_list add_timer; + struct mptcp_sock *sock; + u8 retrans_times; +}; + struct pm_nl_pernet { /* protects pernet updates */ spinlock_t lock; @@ -41,6 +49,7 @@ struct pm_nl_pernet { }; #define MPTCP_PM_ADDR_MAX 8 +#define ADD_ADDR_RETRANS_MAX 3 static bool addresses_equal(const struct mptcp_addr_info *a, struct mptcp_addr_info *b, bool use_port) @@ -178,10 +187,49 @@ static void check_work_pending(struct mptcp_sock *msk) WRITE_ONCE(msk->pm.work_pending, false); } +static void mptcp_pm_add_timer(struct timer_list *timer) +{ + struct mptcp_pm_add_entry *entry = from_timer(entry, timer, add_timer); + struct mptcp_sock *msk = entry->sock; + struct sock *sk = (struct sock *)msk; + + pr_debug("msk=%p\n", msk); + + if (!msk) + return; + + spin_lock_bh(&msk->pm.lock); + + if (entry->addr.id > 0) { + pr_debug("retransmit ADD_ADDR id=%d\n", entry->addr.id); + mptcp_pm_announce_addr(msk, &entry->addr, false); + entry->retrans_times++; + } + + if (entry->retrans_times < ADD_ADDR_RETRANS_MAX) + sk_reset_timer(sk, timer, jiffies + TCP_RTO_MAX); + + spin_unlock_bh(&msk->pm.lock); + + __sock_put(sk); +} + +void mptcp_pm_del_add_timer(struct mptcp_sock *msk, struct mptcp_addr_info *addr) +{ + struct mptcp_pm_add_entry *entry; + + spin_lock_bh(&msk->pm.lock); + list_for_each_entry(entry, &msk->pm.anno_list, list) { + if (addresses_equal(&entry->addr, addr, false)) + sk_stop_timer((struct sock *)msk, &entry->add_timer); + } + spin_unlock_bh(&msk->pm.lock); +} + static bool lookup_anno_list_by_saddr(struct mptcp_sock *msk, struct mptcp_addr_info *addr) { - struct mptcp_pm_addr_entry *entry; + struct mptcp_pm_add_entry *entry; list_for_each_entry(entry, &msk->pm.anno_list, list) { if (addresses_equal(&entry->addr, addr, false)) @@ -194,28 +242,36 @@ static bool lookup_anno_list_by_saddr(struct mptcp_sock *msk, static bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk, struct mptcp_pm_addr_entry *entry) { - struct mptcp_pm_addr_entry *clone = NULL; + struct mptcp_pm_add_entry *add_entry = NULL; if (lookup_anno_list_by_saddr(msk, &entry->addr)) return false; - clone = kmemdup(entry, sizeof(*entry), GFP_ATOMIC); - if (!clone) + add_entry = kmalloc(sizeof(*add_entry), GFP_ATOMIC); + if (!add_entry) return false; - list_add(&clone->list, &msk->pm.anno_list); + list_add(&add_entry->list, &msk->pm.anno_list); + + add_entry->addr = entry->addr; + add_entry->sock = msk; + add_entry->retrans_times = 0; + + timer_setup(&add_entry->add_timer, mptcp_pm_add_timer, 0); + sk_reset_timer((struct sock *)msk, &add_entry->add_timer, jiffies + TCP_RTO_MAX); return true; } void mptcp_pm_free_anno_list(struct mptcp_sock *msk) { - struct mptcp_pm_addr_entry *entry, *tmp; + struct mptcp_pm_add_entry *entry, *tmp; pr_debug("msk=%p\n", msk); spin_lock_bh(&msk->pm.lock); list_for_each_entry_safe(entry, tmp, &msk->pm.anno_list, list) { + sk_stop_timer((struct sock *)msk, &entry->add_timer); list_del(&entry->list); kfree(entry); } @@ -654,10 +710,11 @@ __lookup_addr_by_id(struct pm_nl_pernet *pernet, unsigned int id) static bool remove_anno_list_by_saddr(struct mptcp_sock *msk, struct mptcp_addr_info *addr) { - struct mptcp_pm_addr_entry *entry, *tmp; + struct mptcp_pm_add_entry *entry, *tmp; list_for_each_entry_safe(entry, tmp, &msk->pm.anno_list, list) { if (addresses_equal(&entry->addr, addr, false)) { + sk_stop_timer((struct sock *)msk, &entry->add_timer); list_del(&entry->list); kfree(entry); return true; diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index db1e5de2fee7..031ae106746d 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -444,6 +444,7 @@ void mptcp_pm_add_addr_received(struct mptcp_sock *msk, const struct mptcp_addr_info *addr); void mptcp_pm_rm_addr_received(struct mptcp_sock *msk, u8 rm_id); void mptcp_pm_free_anno_list(struct mptcp_sock *msk); +void mptcp_pm_del_add_timer(struct mptcp_sock *msk, struct mptcp_addr_info *addr); int mptcp_pm_announce_addr(struct mptcp_sock *msk, const struct mptcp_addr_info *addr,