diff options
author | Jakub Kicinski <kuba@kernel.org> | 2022-05-20 17:16:09 -0700 |
---|---|---|
committer | Jakub Kicinski <kuba@kernel.org> | 2022-05-20 17:16:09 -0700 |
commit | ed46b3e1272d6e5c79c8333a60115003035cfbd4 (patch) | |
tree | 6f367f105bd9a3d2a5f6ffca21bf52739580a12a | |
parent | fe5c5fc145edcf98a759b895f52b646730eeb7be (diff) | |
parent | fe29794c3585d039fefebaa2b5a4932a627ad4fd (diff) | |
download | linux-stable-ed46b3e1272d6e5c79c8333a60115003035cfbd4.tar.gz linux-stable-ed46b3e1272d6e5c79c8333a60115003035cfbd4.tar.bz2 linux-stable-ed46b3e1272d6e5c79c8333a60115003035cfbd4.zip |
Merge branch 'amt-fix-several-bugs-in-gateway-mode'
Taehee Yoo says:
====================
amt: fix several bugs in gateway mode
This patchset fixes bugs in amt module.
First patch fixes amt gateway mode's status stuck.
amt gateway and relay established so these two mode manage status.
But gateway stuck to change its own status if a relay doesn't send
responses.
Second patch fixes a memory leak.
amt gateway skips some handling of advertisement message.
So, a memory leak would occur.
====================
Link: https://lore.kernel.org/r/20220519031555.3192-1-ap420073@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-rw-r--r-- | drivers/net/amt.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/drivers/net/amt.c b/drivers/net/amt.c index 10455c9b9da0..de4ea518c793 100644 --- a/drivers/net/amt.c +++ b/drivers/net/amt.c @@ -943,7 +943,7 @@ static void amt_req_work(struct work_struct *work) if (amt->status < AMT_STATUS_RECEIVED_ADVERTISEMENT) goto out; - if (amt->req_cnt++ > AMT_MAX_REQ_COUNT) { + if (amt->req_cnt > AMT_MAX_REQ_COUNT) { netdev_dbg(amt->dev, "Gateway is not ready"); amt->qi = AMT_INIT_REQ_TIMEOUT; amt->ready4 = false; @@ -951,13 +951,15 @@ static void amt_req_work(struct work_struct *work) amt->remote_ip = 0; __amt_update_gw_status(amt, AMT_STATUS_INIT, false); amt->req_cnt = 0; + goto out; } spin_unlock_bh(&amt->lock); amt_send_request(amt, false); amt_send_request(amt, true); - amt_update_gw_status(amt, AMT_STATUS_SENT_REQUEST, true); spin_lock_bh(&amt->lock); + __amt_update_gw_status(amt, AMT_STATUS_SENT_REQUEST, true); + amt->req_cnt++; out: exp = min_t(u32, (1 * (1 << amt->req_cnt)), AMT_MAX_REQ_TIMEOUT); mod_delayed_work(amt_wq, &amt->req_wq, msecs_to_jiffies(exp * 1000)); @@ -2696,9 +2698,8 @@ static int amt_rcv(struct sock *sk, struct sk_buff *skb) err = true; goto drop; } - if (amt_advertisement_handler(amt, skb)) - amt->dev->stats.rx_dropped++; - goto out; + err = amt_advertisement_handler(amt, skb); + break; case AMT_MSG_MULTICAST_DATA: if (iph->saddr != amt->remote_ip) { netdev_dbg(amt->dev, "Invalid Relay IP\n"); |