pm_netlink.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* Multipath TCP
  3. *
  4. * Copyright (c) 2020, Red Hat, Inc.
  5. */
  6. #define pr_fmt(fmt) "MPTCP: " fmt
  7. #include "protocol.h"
  8. #include "mptcp_pm_gen.h"
  9. #define MPTCP_PM_CMD_GRP_OFFSET 0
  10. #define MPTCP_PM_EV_GRP_OFFSET 1
  11. static const struct genl_multicast_group mptcp_pm_mcgrps[] = {
  12. [MPTCP_PM_CMD_GRP_OFFSET] = { .name = MPTCP_PM_CMD_GRP_NAME, },
  13. [MPTCP_PM_EV_GRP_OFFSET] = { .name = MPTCP_PM_EV_GRP_NAME,
  14. .flags = GENL_MCAST_CAP_NET_ADMIN,
  15. },
  16. };
  17. static int mptcp_pm_family_to_addr(int family)
  18. {
  19. #if IS_ENABLED(CONFIG_MPTCP_IPV6)
  20. if (family == AF_INET6)
  21. return MPTCP_PM_ADDR_ATTR_ADDR6;
  22. #endif
  23. return MPTCP_PM_ADDR_ATTR_ADDR4;
  24. }
  25. static int mptcp_pm_parse_pm_addr_attr(struct nlattr *tb[],
  26. const struct nlattr *attr,
  27. struct genl_info *info,
  28. struct mptcp_addr_info *addr,
  29. bool require_family)
  30. {
  31. int err, addr_addr;
  32. if (!attr) {
  33. GENL_SET_ERR_MSG(info, "missing address info");
  34. return -EINVAL;
  35. }
  36. /* no validation needed - was already done via nested policy */
  37. err = nla_parse_nested_deprecated(tb, MPTCP_PM_ADDR_ATTR_MAX, attr,
  38. mptcp_pm_address_nl_policy, info->extack);
  39. if (err)
  40. return err;
  41. if (tb[MPTCP_PM_ADDR_ATTR_ID])
  42. addr->id = nla_get_u8(tb[MPTCP_PM_ADDR_ATTR_ID]);
  43. if (!tb[MPTCP_PM_ADDR_ATTR_FAMILY]) {
  44. if (!require_family)
  45. return 0;
  46. NL_SET_ERR_MSG_ATTR(info->extack, attr,
  47. "missing family");
  48. return -EINVAL;
  49. }
  50. addr->family = nla_get_u16(tb[MPTCP_PM_ADDR_ATTR_FAMILY]);
  51. if (addr->family != AF_INET
  52. #if IS_ENABLED(CONFIG_MPTCP_IPV6)
  53. && addr->family != AF_INET6
  54. #endif
  55. ) {
  56. NL_SET_ERR_MSG_ATTR(info->extack, attr,
  57. "unknown address family");
  58. return -EINVAL;
  59. }
  60. addr_addr = mptcp_pm_family_to_addr(addr->family);
  61. if (!tb[addr_addr]) {
  62. NL_SET_ERR_MSG_ATTR(info->extack, attr,
  63. "missing address data");
  64. return -EINVAL;
  65. }
  66. #if IS_ENABLED(CONFIG_MPTCP_IPV6)
  67. if (addr->family == AF_INET6)
  68. addr->addr6 = nla_get_in6_addr(tb[addr_addr]);
  69. else
  70. #endif
  71. addr->addr.s_addr = nla_get_in_addr(tb[addr_addr]);
  72. if (tb[MPTCP_PM_ADDR_ATTR_PORT])
  73. addr->port = htons(nla_get_u16(tb[MPTCP_PM_ADDR_ATTR_PORT]));
  74. return 0;
  75. }
  76. int mptcp_pm_parse_addr(struct nlattr *attr, struct genl_info *info,
  77. struct mptcp_addr_info *addr)
  78. {
  79. struct nlattr *tb[MPTCP_PM_ADDR_ATTR_MAX + 1];
  80. memset(addr, 0, sizeof(*addr));
  81. return mptcp_pm_parse_pm_addr_attr(tb, attr, info, addr, true);
  82. }
  83. int mptcp_pm_parse_entry(struct nlattr *attr, struct genl_info *info,
  84. bool require_family,
  85. struct mptcp_pm_addr_entry *entry)
  86. {
  87. struct nlattr *tb[MPTCP_PM_ADDR_ATTR_MAX + 1];
  88. int err;
  89. memset(entry, 0, sizeof(*entry));
  90. err = mptcp_pm_parse_pm_addr_attr(tb, attr, info, &entry->addr, require_family);
  91. if (err)
  92. return err;
  93. if (tb[MPTCP_PM_ADDR_ATTR_IF_IDX]) {
  94. s32 val = nla_get_s32(tb[MPTCP_PM_ADDR_ATTR_IF_IDX]);
  95. entry->ifindex = val;
  96. }
  97. if (tb[MPTCP_PM_ADDR_ATTR_FLAGS])
  98. entry->flags = nla_get_u32(tb[MPTCP_PM_ADDR_ATTR_FLAGS]) &
  99. MPTCP_PM_ADDR_FLAGS_MASK;
  100. if (tb[MPTCP_PM_ADDR_ATTR_PORT])
  101. entry->addr.port = htons(nla_get_u16(tb[MPTCP_PM_ADDR_ATTR_PORT]));
  102. return 0;
  103. }
  104. static int mptcp_nl_fill_addr(struct sk_buff *skb,
  105. struct mptcp_pm_addr_entry *entry)
  106. {
  107. struct mptcp_addr_info *addr = &entry->addr;
  108. struct nlattr *attr;
  109. attr = nla_nest_start(skb, MPTCP_PM_ATTR_ADDR);
  110. if (!attr)
  111. return -EMSGSIZE;
  112. if (nla_put_u16(skb, MPTCP_PM_ADDR_ATTR_FAMILY, addr->family))
  113. goto nla_put_failure;
  114. if (nla_put_u16(skb, MPTCP_PM_ADDR_ATTR_PORT, ntohs(addr->port)))
  115. goto nla_put_failure;
  116. if (nla_put_u8(skb, MPTCP_PM_ADDR_ATTR_ID, addr->id))
  117. goto nla_put_failure;
  118. if (nla_put_u32(skb, MPTCP_PM_ADDR_ATTR_FLAGS, entry->flags))
  119. goto nla_put_failure;
  120. if (entry->ifindex &&
  121. nla_put_s32(skb, MPTCP_PM_ADDR_ATTR_IF_IDX, entry->ifindex))
  122. goto nla_put_failure;
  123. if (addr->family == AF_INET &&
  124. nla_put_in_addr(skb, MPTCP_PM_ADDR_ATTR_ADDR4,
  125. addr->addr.s_addr))
  126. goto nla_put_failure;
  127. #if IS_ENABLED(CONFIG_MPTCP_IPV6)
  128. else if (addr->family == AF_INET6 &&
  129. nla_put_in6_addr(skb, MPTCP_PM_ADDR_ATTR_ADDR6, &addr->addr6))
  130. goto nla_put_failure;
  131. #endif
  132. nla_nest_end(skb, attr);
  133. return 0;
  134. nla_put_failure:
  135. nla_nest_cancel(skb, attr);
  136. return -EMSGSIZE;
  137. }
  138. static int mptcp_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
  139. struct genl_info *info)
  140. {
  141. if (info->attrs[MPTCP_PM_ATTR_TOKEN])
  142. return mptcp_userspace_pm_get_addr(id, addr, info);
  143. return mptcp_pm_nl_get_addr(id, addr, info);
  144. }
  145. int mptcp_pm_nl_get_addr_doit(struct sk_buff *skb, struct genl_info *info)
  146. {
  147. struct mptcp_pm_addr_entry addr;
  148. struct nlattr *attr;
  149. struct sk_buff *msg;
  150. void *reply;
  151. int ret;
  152. if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ENDPOINT_ADDR))
  153. return -EINVAL;
  154. attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR];
  155. ret = mptcp_pm_parse_entry(attr, info, false, &addr);
  156. if (ret < 0)
  157. return ret;
  158. msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  159. if (!msg)
  160. return -ENOMEM;
  161. reply = genlmsg_put_reply(msg, info, &mptcp_genl_family, 0,
  162. info->genlhdr->cmd);
  163. if (!reply) {
  164. GENL_SET_ERR_MSG(info, "not enough space in Netlink message");
  165. ret = -EMSGSIZE;
  166. goto fail;
  167. }
  168. ret = mptcp_pm_get_addr(addr.addr.id, &addr, info);
  169. if (ret) {
  170. NL_SET_ERR_MSG_ATTR(info->extack, attr, "address not found");
  171. goto fail;
  172. }
  173. ret = mptcp_nl_fill_addr(msg, &addr);
  174. if (ret)
  175. goto fail;
  176. genlmsg_end(msg, reply);
  177. ret = genlmsg_reply(msg, info);
  178. return ret;
  179. fail:
  180. nlmsg_free(msg);
  181. return ret;
  182. }
  183. int mptcp_pm_genl_fill_addr(struct sk_buff *msg,
  184. struct netlink_callback *cb,
  185. struct mptcp_pm_addr_entry *entry)
  186. {
  187. void *hdr;
  188. hdr = genlmsg_put(msg, NETLINK_CB(cb->skb).portid,
  189. cb->nlh->nlmsg_seq, &mptcp_genl_family,
  190. NLM_F_MULTI, MPTCP_PM_CMD_GET_ADDR);
  191. if (!hdr)
  192. return -EINVAL;
  193. if (mptcp_nl_fill_addr(msg, entry) < 0) {
  194. genlmsg_cancel(msg, hdr);
  195. return -EINVAL;
  196. }
  197. genlmsg_end(msg, hdr);
  198. return 0;
  199. }
  200. static int mptcp_pm_dump_addr(struct sk_buff *msg, struct netlink_callback *cb)
  201. {
  202. const struct genl_info *info = genl_info_dump(cb);
  203. if (info->attrs[MPTCP_PM_ATTR_TOKEN])
  204. return mptcp_userspace_pm_dump_addr(msg, cb);
  205. return mptcp_pm_nl_dump_addr(msg, cb);
  206. }
  207. int mptcp_pm_nl_get_addr_dumpit(struct sk_buff *msg,
  208. struct netlink_callback *cb)
  209. {
  210. return mptcp_pm_dump_addr(msg, cb);
  211. }
  212. static int mptcp_pm_set_flags(struct genl_info *info)
  213. {
  214. struct mptcp_pm_addr_entry loc = { .addr = { .family = AF_UNSPEC }, };
  215. struct nlattr *attr_loc;
  216. int ret = -EINVAL;
  217. if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR))
  218. return ret;
  219. attr_loc = info->attrs[MPTCP_PM_ATTR_ADDR];
  220. ret = mptcp_pm_parse_entry(attr_loc, info, false, &loc);
  221. if (ret < 0)
  222. return ret;
  223. if (info->attrs[MPTCP_PM_ATTR_TOKEN])
  224. return mptcp_userspace_pm_set_flags(&loc, info);
  225. return mptcp_pm_nl_set_flags(&loc, info);
  226. }
  227. int mptcp_pm_nl_set_flags_doit(struct sk_buff *skb, struct genl_info *info)
  228. {
  229. return mptcp_pm_set_flags(info);
  230. }
  231. static void mptcp_nl_mcast_send(struct net *net, struct sk_buff *nlskb, gfp_t gfp)
  232. {
  233. genlmsg_multicast_netns(&mptcp_genl_family, net,
  234. nlskb, 0, MPTCP_PM_EV_GRP_OFFSET, gfp);
  235. }
  236. bool mptcp_userspace_pm_active(const struct mptcp_sock *msk)
  237. {
  238. return genl_has_listeners(&mptcp_genl_family,
  239. sock_net((const struct sock *)msk),
  240. MPTCP_PM_EV_GRP_OFFSET);
  241. }
  242. static int mptcp_event_add_subflow(struct sk_buff *skb, const struct sock *ssk)
  243. {
  244. const struct inet_sock *issk = inet_sk(ssk);
  245. const struct mptcp_subflow_context *sf;
  246. if (nla_put_u16(skb, MPTCP_ATTR_FAMILY, ssk->sk_family))
  247. return -EMSGSIZE;
  248. switch (ssk->sk_family) {
  249. case AF_INET:
  250. if (nla_put_in_addr(skb, MPTCP_ATTR_SADDR4, issk->inet_saddr))
  251. return -EMSGSIZE;
  252. if (nla_put_in_addr(skb, MPTCP_ATTR_DADDR4, issk->inet_daddr))
  253. return -EMSGSIZE;
  254. break;
  255. #if IS_ENABLED(CONFIG_MPTCP_IPV6)
  256. case AF_INET6: {
  257. if (nla_put_in6_addr(skb, MPTCP_ATTR_SADDR6, &issk->pinet6->saddr))
  258. return -EMSGSIZE;
  259. if (nla_put_in6_addr(skb, MPTCP_ATTR_DADDR6, &ssk->sk_v6_daddr))
  260. return -EMSGSIZE;
  261. break;
  262. }
  263. #endif
  264. default:
  265. WARN_ON_ONCE(1);
  266. return -EMSGSIZE;
  267. }
  268. if (nla_put_be16(skb, MPTCP_ATTR_SPORT, issk->inet_sport))
  269. return -EMSGSIZE;
  270. if (nla_put_be16(skb, MPTCP_ATTR_DPORT, issk->inet_dport))
  271. return -EMSGSIZE;
  272. sf = mptcp_subflow_ctx(ssk);
  273. if (WARN_ON_ONCE(!sf))
  274. return -EINVAL;
  275. if (nla_put_u8(skb, MPTCP_ATTR_LOC_ID, subflow_get_local_id(sf)))
  276. return -EMSGSIZE;
  277. if (nla_put_u8(skb, MPTCP_ATTR_REM_ID, sf->remote_id))
  278. return -EMSGSIZE;
  279. return 0;
  280. }
  281. static int mptcp_event_put_token_and_ssk(struct sk_buff *skb,
  282. const struct mptcp_sock *msk,
  283. const struct sock *ssk)
  284. {
  285. const struct sock *sk = (const struct sock *)msk;
  286. const struct mptcp_subflow_context *sf;
  287. u8 sk_err;
  288. if (nla_put_u32(skb, MPTCP_ATTR_TOKEN, READ_ONCE(msk->token)))
  289. return -EMSGSIZE;
  290. if (mptcp_event_add_subflow(skb, ssk))
  291. return -EMSGSIZE;
  292. sf = mptcp_subflow_ctx(ssk);
  293. if (WARN_ON_ONCE(!sf))
  294. return -EINVAL;
  295. if (nla_put_u8(skb, MPTCP_ATTR_BACKUP, sf->backup))
  296. return -EMSGSIZE;
  297. if (ssk->sk_bound_dev_if &&
  298. nla_put_s32(skb, MPTCP_ATTR_IF_IDX, ssk->sk_bound_dev_if))
  299. return -EMSGSIZE;
  300. sk_err = READ_ONCE(ssk->sk_err);
  301. if (sk_err && sk->sk_state == TCP_ESTABLISHED &&
  302. nla_put_u8(skb, MPTCP_ATTR_ERROR, sk_err))
  303. return -EMSGSIZE;
  304. return 0;
  305. }
  306. static int mptcp_event_sub_established(struct sk_buff *skb,
  307. const struct mptcp_sock *msk,
  308. const struct sock *ssk)
  309. {
  310. return mptcp_event_put_token_and_ssk(skb, msk, ssk);
  311. }
  312. static int mptcp_event_sub_closed(struct sk_buff *skb,
  313. const struct mptcp_sock *msk,
  314. const struct sock *ssk)
  315. {
  316. const struct mptcp_subflow_context *sf;
  317. if (mptcp_event_put_token_and_ssk(skb, msk, ssk))
  318. return -EMSGSIZE;
  319. sf = mptcp_subflow_ctx(ssk);
  320. if (!sf->reset_seen)
  321. return 0;
  322. if (nla_put_u32(skb, MPTCP_ATTR_RESET_REASON, sf->reset_reason))
  323. return -EMSGSIZE;
  324. if (nla_put_u32(skb, MPTCP_ATTR_RESET_FLAGS, sf->reset_transient))
  325. return -EMSGSIZE;
  326. return 0;
  327. }
  328. static int mptcp_event_created(struct sk_buff *skb,
  329. const struct mptcp_sock *msk,
  330. const struct sock *ssk)
  331. {
  332. int err = nla_put_u32(skb, MPTCP_ATTR_TOKEN, READ_ONCE(msk->token));
  333. u16 flags = 0;
  334. if (err)
  335. return err;
  336. if (READ_ONCE(msk->pm.server_side)) {
  337. flags |= MPTCP_PM_EV_FLAG_SERVER_SIDE;
  338. /* Deprecated, and only set when it is the server side */
  339. if (nla_put_u8(skb, MPTCP_ATTR_SERVER_SIDE, 1))
  340. return -EMSGSIZE;
  341. }
  342. if (READ_ONCE(msk->pm.remote_deny_join_id0))
  343. flags |= MPTCP_PM_EV_FLAG_DENY_JOIN_ID0;
  344. if (flags && nla_put_u16(skb, MPTCP_ATTR_FLAGS, flags))
  345. return -EMSGSIZE;
  346. return mptcp_event_add_subflow(skb, ssk);
  347. }
  348. void mptcp_event_addr_removed(const struct mptcp_sock *msk, uint8_t id)
  349. {
  350. struct net *net = sock_net((const struct sock *)msk);
  351. struct nlmsghdr *nlh;
  352. struct sk_buff *skb;
  353. if (!genl_has_listeners(&mptcp_genl_family, net, MPTCP_PM_EV_GRP_OFFSET))
  354. return;
  355. skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
  356. if (!skb)
  357. return;
  358. nlh = genlmsg_put(skb, 0, 0, &mptcp_genl_family, 0, MPTCP_EVENT_REMOVED);
  359. if (!nlh)
  360. goto nla_put_failure;
  361. if (nla_put_u32(skb, MPTCP_ATTR_TOKEN, READ_ONCE(msk->token)))
  362. goto nla_put_failure;
  363. if (nla_put_u8(skb, MPTCP_ATTR_REM_ID, id))
  364. goto nla_put_failure;
  365. genlmsg_end(skb, nlh);
  366. mptcp_nl_mcast_send(net, skb, GFP_ATOMIC);
  367. return;
  368. nla_put_failure:
  369. nlmsg_free(skb);
  370. }
  371. void mptcp_event_addr_announced(const struct sock *ssk,
  372. const struct mptcp_addr_info *info)
  373. {
  374. struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
  375. struct mptcp_sock *msk = mptcp_sk(subflow->conn);
  376. struct net *net = sock_net(ssk);
  377. struct nlmsghdr *nlh;
  378. struct sk_buff *skb;
  379. if (!genl_has_listeners(&mptcp_genl_family, net, MPTCP_PM_EV_GRP_OFFSET))
  380. return;
  381. skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
  382. if (!skb)
  383. return;
  384. nlh = genlmsg_put(skb, 0, 0, &mptcp_genl_family, 0,
  385. MPTCP_EVENT_ANNOUNCED);
  386. if (!nlh)
  387. goto nla_put_failure;
  388. if (nla_put_u32(skb, MPTCP_ATTR_TOKEN, READ_ONCE(msk->token)))
  389. goto nla_put_failure;
  390. if (nla_put_u8(skb, MPTCP_ATTR_REM_ID, info->id))
  391. goto nla_put_failure;
  392. if (nla_put_be16(skb, MPTCP_ATTR_DPORT,
  393. info->port == 0 ?
  394. inet_sk(ssk)->inet_dport :
  395. info->port))
  396. goto nla_put_failure;
  397. switch (info->family) {
  398. case AF_INET:
  399. if (nla_put_in_addr(skb, MPTCP_ATTR_DADDR4, info->addr.s_addr))
  400. goto nla_put_failure;
  401. break;
  402. #if IS_ENABLED(CONFIG_MPTCP_IPV6)
  403. case AF_INET6:
  404. if (nla_put_in6_addr(skb, MPTCP_ATTR_DADDR6, &info->addr6))
  405. goto nla_put_failure;
  406. break;
  407. #endif
  408. default:
  409. WARN_ON_ONCE(1);
  410. goto nla_put_failure;
  411. }
  412. genlmsg_end(skb, nlh);
  413. mptcp_nl_mcast_send(net, skb, GFP_ATOMIC);
  414. return;
  415. nla_put_failure:
  416. nlmsg_free(skb);
  417. }
  418. void mptcp_event_pm_listener(const struct sock *ssk,
  419. enum mptcp_event_type event)
  420. {
  421. const struct inet_sock *issk = inet_sk(ssk);
  422. struct net *net = sock_net(ssk);
  423. struct nlmsghdr *nlh;
  424. struct sk_buff *skb;
  425. if (!genl_has_listeners(&mptcp_genl_family, net, MPTCP_PM_EV_GRP_OFFSET))
  426. return;
  427. skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  428. if (!skb)
  429. return;
  430. nlh = genlmsg_put(skb, 0, 0, &mptcp_genl_family, 0, event);
  431. if (!nlh)
  432. goto nla_put_failure;
  433. if (nla_put_u16(skb, MPTCP_ATTR_FAMILY, ssk->sk_family))
  434. goto nla_put_failure;
  435. if (nla_put_be16(skb, MPTCP_ATTR_SPORT, issk->inet_sport))
  436. goto nla_put_failure;
  437. switch (ssk->sk_family) {
  438. case AF_INET:
  439. if (nla_put_in_addr(skb, MPTCP_ATTR_SADDR4, issk->inet_saddr))
  440. goto nla_put_failure;
  441. break;
  442. #if IS_ENABLED(CONFIG_MPTCP_IPV6)
  443. case AF_INET6: {
  444. if (nla_put_in6_addr(skb, MPTCP_ATTR_SADDR6, &issk->pinet6->saddr))
  445. goto nla_put_failure;
  446. break;
  447. }
  448. #endif
  449. default:
  450. WARN_ON_ONCE(1);
  451. goto nla_put_failure;
  452. }
  453. genlmsg_end(skb, nlh);
  454. mptcp_nl_mcast_send(net, skb, GFP_KERNEL);
  455. return;
  456. nla_put_failure:
  457. nlmsg_free(skb);
  458. }
  459. void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk,
  460. const struct sock *ssk, gfp_t gfp)
  461. {
  462. struct net *net = sock_net((const struct sock *)msk);
  463. struct nlmsghdr *nlh;
  464. struct sk_buff *skb;
  465. if (!genl_has_listeners(&mptcp_genl_family, net, MPTCP_PM_EV_GRP_OFFSET))
  466. return;
  467. skb = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
  468. if (!skb)
  469. return;
  470. nlh = genlmsg_put(skb, 0, 0, &mptcp_genl_family, 0, type);
  471. if (!nlh)
  472. goto nla_put_failure;
  473. switch (type) {
  474. case MPTCP_EVENT_UNSPEC:
  475. WARN_ON_ONCE(1);
  476. break;
  477. case MPTCP_EVENT_CREATED:
  478. case MPTCP_EVENT_ESTABLISHED:
  479. if (mptcp_event_created(skb, msk, ssk) < 0)
  480. goto nla_put_failure;
  481. break;
  482. case MPTCP_EVENT_CLOSED:
  483. if (nla_put_u32(skb, MPTCP_ATTR_TOKEN, READ_ONCE(msk->token)) < 0)
  484. goto nla_put_failure;
  485. break;
  486. case MPTCP_EVENT_ANNOUNCED:
  487. case MPTCP_EVENT_REMOVED:
  488. /* call mptcp_event_addr_announced()/removed instead */
  489. WARN_ON_ONCE(1);
  490. break;
  491. case MPTCP_EVENT_SUB_ESTABLISHED:
  492. case MPTCP_EVENT_SUB_PRIORITY:
  493. if (mptcp_event_sub_established(skb, msk, ssk) < 0)
  494. goto nla_put_failure;
  495. break;
  496. case MPTCP_EVENT_SUB_CLOSED:
  497. if (mptcp_event_sub_closed(skb, msk, ssk) < 0)
  498. goto nla_put_failure;
  499. break;
  500. case MPTCP_EVENT_LISTENER_CREATED:
  501. case MPTCP_EVENT_LISTENER_CLOSED:
  502. break;
  503. }
  504. genlmsg_end(skb, nlh);
  505. mptcp_nl_mcast_send(net, skb, gfp);
  506. return;
  507. nla_put_failure:
  508. nlmsg_free(skb);
  509. }
  510. struct genl_family mptcp_genl_family __ro_after_init = {
  511. .name = MPTCP_PM_NAME,
  512. .version = MPTCP_PM_VER,
  513. .netnsok = true,
  514. .module = THIS_MODULE,
  515. .ops = mptcp_pm_nl_ops,
  516. .n_ops = ARRAY_SIZE(mptcp_pm_nl_ops),
  517. .resv_start_op = MPTCP_PM_CMD_SUBFLOW_DESTROY + 1,
  518. .mcgrps = mptcp_pm_mcgrps,
  519. .n_mcgrps = ARRAY_SIZE(mptcp_pm_mcgrps),
  520. };
  521. void __init mptcp_pm_nl_init(void)
  522. {
  523. if (genl_register_family(&mptcp_genl_family))
  524. panic("Failed to register MPTCP PM netlink family\n");
  525. }