Skip to content

Commit f8c9dfb

Browse files
geliangtangkuba-moo
authored andcommitted
mptcp: add pm listener events
This patch adds two new MPTCP netlink event types for PM listening socket create and close, named MPTCP_EVENT_LISTENER_CREATED and MPTCP_EVENT_LISTENER_CLOSED. Add a new function mptcp_event_pm_listener() to push the new events with family, port and addr to userspace. Invoke mptcp_event_pm_listener() with MPTCP_EVENT_LISTENER_CREATED in mptcp_listen() and mptcp_pm_nl_create_listen_socket(), invoke it with MPTCP_EVENT_LISTENER_CLOSED in __mptcp_close_ssk(). Signed-off-by: Geliang Tang <[email protected]> Reviewed-by: Mat Martineau <[email protected]> Signed-off-by: Matthieu Baerts <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 5f17f8e commit f8c9dfb

File tree

4 files changed

+71
-0
lines changed

4 files changed

+71
-0
lines changed

include/uapi/linux/mptcp.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,12 @@ struct mptcp_info {
160160
* daddr4 | daddr6, sport, dport, backup, if_idx
161161
* [, error]
162162
* The priority of a subflow has changed. 'error' should not be set.
163+
*
164+
* MPTCP_EVENT_LISTENER_CREATED: family, sport, saddr4 | saddr6
165+
* A new PM listener is created.
166+
*
167+
* MPTCP_EVENT_LISTENER_CLOSED: family, sport, saddr4 | saddr6
168+
* A PM listener is closed.
163169
*/
164170
enum mptcp_event_type {
165171
MPTCP_EVENT_UNSPEC = 0,
@@ -174,6 +180,9 @@ enum mptcp_event_type {
174180
MPTCP_EVENT_SUB_CLOSED = 11,
175181

176182
MPTCP_EVENT_SUB_PRIORITY = 13,
183+
184+
MPTCP_EVENT_LISTENER_CREATED = 15,
185+
MPTCP_EVENT_LISTENER_CLOSED = 16,
177186
};
178187

179188
enum mptcp_event_attr {

net/mptcp/pm_netlink.c

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1029,6 +1029,8 @@ static int mptcp_pm_nl_create_listen_socket(struct sock *sk,
10291029
if (err)
10301030
return err;
10311031

1032+
mptcp_event_pm_listener(ssock->sk, MPTCP_EVENT_LISTENER_CREATED);
1033+
10321034
return 0;
10331035
}
10341036

@@ -2152,6 +2154,58 @@ void mptcp_event_addr_announced(const struct sock *ssk,
21522154
kfree_skb(skb);
21532155
}
21542156

2157+
void mptcp_event_pm_listener(const struct sock *ssk,
2158+
enum mptcp_event_type event)
2159+
{
2160+
const struct inet_sock *issk = inet_sk(ssk);
2161+
struct net *net = sock_net(ssk);
2162+
struct nlmsghdr *nlh;
2163+
struct sk_buff *skb;
2164+
2165+
if (!genl_has_listeners(&mptcp_genl_family, net, MPTCP_PM_EV_GRP_OFFSET))
2166+
return;
2167+
2168+
skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
2169+
if (!skb)
2170+
return;
2171+
2172+
nlh = genlmsg_put(skb, 0, 0, &mptcp_genl_family, 0, event);
2173+
if (!nlh)
2174+
goto nla_put_failure;
2175+
2176+
if (nla_put_u16(skb, MPTCP_ATTR_FAMILY, ssk->sk_family))
2177+
goto nla_put_failure;
2178+
2179+
if (nla_put_be16(skb, MPTCP_ATTR_SPORT, issk->inet_sport))
2180+
goto nla_put_failure;
2181+
2182+
switch (ssk->sk_family) {
2183+
case AF_INET:
2184+
if (nla_put_in_addr(skb, MPTCP_ATTR_SADDR4, issk->inet_saddr))
2185+
goto nla_put_failure;
2186+
break;
2187+
#if IS_ENABLED(CONFIG_MPTCP_IPV6)
2188+
case AF_INET6: {
2189+
const struct ipv6_pinfo *np = inet6_sk(ssk);
2190+
2191+
if (nla_put_in6_addr(skb, MPTCP_ATTR_SADDR6, &np->saddr))
2192+
goto nla_put_failure;
2193+
break;
2194+
}
2195+
#endif
2196+
default:
2197+
WARN_ON_ONCE(1);
2198+
goto nla_put_failure;
2199+
}
2200+
2201+
genlmsg_end(skb, nlh);
2202+
mptcp_nl_mcast_send(net, skb, GFP_KERNEL);
2203+
return;
2204+
2205+
nla_put_failure:
2206+
kfree_skb(skb);
2207+
}
2208+
21552209
void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk,
21562210
const struct sock *ssk, gfp_t gfp)
21572211
{
@@ -2197,6 +2251,9 @@ void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk,
21972251
if (mptcp_event_sub_closed(skb, msk, ssk) < 0)
21982252
goto nla_put_failure;
21992253
break;
2254+
case MPTCP_EVENT_LISTENER_CREATED:
2255+
case MPTCP_EVENT_LISTENER_CLOSED:
2256+
break;
22002257
}
22012258

22022259
genlmsg_end(skb, nlh);

net/mptcp/protocol.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2355,6 +2355,7 @@ static void __mptcp_close_ssk(struct sock *sk, struct sock *ssk,
23552355
tcp_set_state(ssk, TCP_CLOSE);
23562356
mptcp_subflow_queue_clean(ssk);
23572357
inet_csk_listen_stop(ssk);
2358+
mptcp_event_pm_listener(ssk, MPTCP_EVENT_LISTENER_CLOSED);
23582359
}
23592360
__tcp_close(ssk, 0);
23602361

@@ -3647,6 +3648,8 @@ static int mptcp_listen(struct socket *sock, int backlog)
36473648
if (!err)
36483649
mptcp_copy_inaddrs(sock->sk, ssock->sk);
36493650

3651+
mptcp_event_pm_listener(ssock->sk, MPTCP_EVENT_LISTENER_CREATED);
3652+
36503653
unlock:
36513654
release_sock(sock->sk);
36523655
return err;

net/mptcp/protocol.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -839,6 +839,8 @@ void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk,
839839
const struct sock *ssk, gfp_t gfp);
840840
void mptcp_event_addr_announced(const struct sock *ssk, const struct mptcp_addr_info *info);
841841
void mptcp_event_addr_removed(const struct mptcp_sock *msk, u8 id);
842+
void mptcp_event_pm_listener(const struct sock *ssk,
843+
enum mptcp_event_type event);
842844
bool mptcp_userspace_pm_active(const struct mptcp_sock *msk);
843845

844846
void mptcp_fastopen_gen_msk_ackseq(struct mptcp_sock *msk, struct mptcp_subflow_context *subflow,

0 commit comments

Comments
 (0)