diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 95181cc..2907cec 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -1599,7 +1599,7 @@ struct cfg80211_wowlan_trig_pkt_pattern { /** * struct cfg80211_wowlan_tcp - TCP connection parameters * - * @sock: (internal) socket for source port allocation (if needed) + * @sock: (internal) socket for source port allocation * @src: source IP address * @dst: destination IP address * @dst_mac: destination MAC address diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 30a5591..4c4542f 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -7109,7 +7109,7 @@ static int nl80211_parse_wowlan_tcp(struct cfg80211_registered_device *rdev, struct nl80211_wowlan_tcp_data_seq *seq = NULL; u32 size; u32 data_size, wake_size, tokens_size = 0, wake_mask_size; - int err; + int err, port; if (!rdev->wiphy.wowlan.tcp) return -EINVAL; @@ -7188,29 +7188,31 @@ static int nl80211_parse_wowlan_tcp(struct cfg80211_registered_device *rdev, cfg->dst = nla_get_be32(tb[NL80211_WOWLAN_TCP_DST_IPV4]); memcpy(cfg->dst_mac, nla_data(tb[NL80211_WOWLAN_TCP_DST_MAC]), ETH_ALEN); - if (tb[NL80211_WOWLAN_TCP_SRC_PORT]) { - cfg->src_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_SRC_PORT]); - } else { + if (tb[NL80211_WOWLAN_TCP_SRC_PORT]) + port = nla_get_u16(tb[NL80211_WOWLAN_TCP_SRC_PORT]); + else + port = 0; #ifdef CONFIG_INET - /* allocate a socket and port for it and use it */ - err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, - SOCK_STREAM, IPPROTO_TCP, - &cfg->sock, 1); - if (err) { - kfree(cfg); - return err; - } - if (inet_csk_get_port(cfg->sock->sk, 0)) { - sock_release(cfg->sock); - kfree(cfg); - return -ENOSPC; - } - cfg->src_port = inet_sk(cfg->sock->sk)->inet_num; + /* allocate a socket and port for it and use it */ + err = __sock_create(wiphy_net(&rdev->wiphy), PF_INET, SOCK_STREAM, + IPPROTO_TCP, &cfg->sock, 1); + if (err) { + kfree(cfg); + return err; + } + if (inet_csk_get_port(cfg->sock->sk, port)) { + sock_release(cfg->sock); + kfree(cfg); + return -ENOSPC; + } + cfg->src_port = inet_sk(cfg->sock->sk)->inet_num; #else + if (!port) { kfree(cfg); - return -EOPNOTSUPP; -#endif + return -EINVAL; } +#endif + cfg->dst_port = nla_get_u16(tb[NL80211_WOWLAN_TCP_DST_PORT]); cfg->payload_len = data_size; cfg->payload = (u8 *)cfg + sizeof(*cfg) + tokens_size;