vxlan_mdb.c 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. #include <linux/if_bridge.h>
  3. #include <linux/in.h>
  4. #include <linux/list.h>
  5. #include <linux/netdevice.h>
  6. #include <linux/netlink.h>
  7. #include <linux/rhashtable.h>
  8. #include <linux/rhashtable-types.h>
  9. #include <linux/rtnetlink.h>
  10. #include <linux/skbuff.h>
  11. #include <linux/types.h>
  12. #include <net/netlink.h>
  13. #include <net/vxlan.h>
  14. #include "vxlan_private.h"
  15. struct vxlan_mdb_entry_key {
  16. union vxlan_addr src;
  17. union vxlan_addr dst;
  18. __be32 vni;
  19. };
  20. struct vxlan_mdb_entry {
  21. struct rhash_head rhnode;
  22. struct list_head remotes;
  23. struct vxlan_mdb_entry_key key;
  24. struct hlist_node mdb_node;
  25. struct rcu_head rcu;
  26. };
  27. #define VXLAN_MDB_REMOTE_F_BLOCKED BIT(0)
  28. struct vxlan_mdb_remote {
  29. struct list_head list;
  30. struct vxlan_rdst __rcu *rd;
  31. u8 flags;
  32. u8 filter_mode;
  33. u8 rt_protocol;
  34. struct hlist_head src_list;
  35. struct rcu_head rcu;
  36. };
  37. #define VXLAN_SGRP_F_DELETE BIT(0)
  38. struct vxlan_mdb_src_entry {
  39. struct hlist_node node;
  40. union vxlan_addr addr;
  41. u8 flags;
  42. };
  43. struct vxlan_mdb_dump_ctx {
  44. long reserved;
  45. long entry_idx;
  46. long remote_idx;
  47. };
  48. struct vxlan_mdb_config_src_entry {
  49. union vxlan_addr addr;
  50. struct list_head node;
  51. };
  52. struct vxlan_mdb_config {
  53. struct vxlan_dev *vxlan;
  54. struct vxlan_mdb_entry_key group;
  55. struct list_head src_list;
  56. union vxlan_addr remote_ip;
  57. u32 remote_ifindex;
  58. __be32 remote_vni;
  59. __be16 remote_port;
  60. u16 nlflags;
  61. u8 flags;
  62. u8 filter_mode;
  63. u8 rt_protocol;
  64. };
  65. struct vxlan_mdb_flush_desc {
  66. union vxlan_addr remote_ip;
  67. __be32 src_vni;
  68. __be32 remote_vni;
  69. __be16 remote_port;
  70. u8 rt_protocol;
  71. };
  72. static const struct rhashtable_params vxlan_mdb_rht_params = {
  73. .head_offset = offsetof(struct vxlan_mdb_entry, rhnode),
  74. .key_offset = offsetof(struct vxlan_mdb_entry, key),
  75. .key_len = sizeof(struct vxlan_mdb_entry_key),
  76. .automatic_shrinking = true,
  77. };
  78. static int __vxlan_mdb_add(const struct vxlan_mdb_config *cfg,
  79. struct netlink_ext_ack *extack);
  80. static int __vxlan_mdb_del(const struct vxlan_mdb_config *cfg,
  81. struct netlink_ext_ack *extack);
  82. static void vxlan_br_mdb_entry_fill(const struct vxlan_dev *vxlan,
  83. const struct vxlan_mdb_entry *mdb_entry,
  84. const struct vxlan_mdb_remote *remote,
  85. struct br_mdb_entry *e)
  86. {
  87. const union vxlan_addr *dst = &mdb_entry->key.dst;
  88. memset(e, 0, sizeof(*e));
  89. e->ifindex = vxlan->dev->ifindex;
  90. e->state = MDB_PERMANENT;
  91. if (remote->flags & VXLAN_MDB_REMOTE_F_BLOCKED)
  92. e->flags |= MDB_FLAGS_BLOCKED;
  93. switch (dst->sa.sa_family) {
  94. case AF_INET:
  95. e->addr.u.ip4 = dst->sin.sin_addr.s_addr;
  96. e->addr.proto = htons(ETH_P_IP);
  97. break;
  98. #if IS_ENABLED(CONFIG_IPV6)
  99. case AF_INET6:
  100. e->addr.u.ip6 = dst->sin6.sin6_addr;
  101. e->addr.proto = htons(ETH_P_IPV6);
  102. break;
  103. #endif
  104. }
  105. }
  106. static int vxlan_mdb_entry_info_fill_srcs(struct sk_buff *skb,
  107. const struct vxlan_mdb_remote *remote)
  108. {
  109. struct vxlan_mdb_src_entry *ent;
  110. struct nlattr *nest;
  111. if (hlist_empty(&remote->src_list))
  112. return 0;
  113. nest = nla_nest_start(skb, MDBA_MDB_EATTR_SRC_LIST);
  114. if (!nest)
  115. return -EMSGSIZE;
  116. hlist_for_each_entry(ent, &remote->src_list, node) {
  117. struct nlattr *nest_ent;
  118. nest_ent = nla_nest_start(skb, MDBA_MDB_SRCLIST_ENTRY);
  119. if (!nest_ent)
  120. goto out_cancel_err;
  121. if (vxlan_nla_put_addr(skb, MDBA_MDB_SRCATTR_ADDRESS,
  122. &ent->addr) ||
  123. nla_put_u32(skb, MDBA_MDB_SRCATTR_TIMER, 0))
  124. goto out_cancel_err;
  125. nla_nest_end(skb, nest_ent);
  126. }
  127. nla_nest_end(skb, nest);
  128. return 0;
  129. out_cancel_err:
  130. nla_nest_cancel(skb, nest);
  131. return -EMSGSIZE;
  132. }
  133. static int vxlan_mdb_entry_info_fill(const struct vxlan_dev *vxlan,
  134. struct sk_buff *skb,
  135. const struct vxlan_mdb_entry *mdb_entry,
  136. const struct vxlan_mdb_remote *remote)
  137. {
  138. struct vxlan_rdst *rd = rtnl_dereference(remote->rd);
  139. struct br_mdb_entry e;
  140. struct nlattr *nest;
  141. nest = nla_nest_start_noflag(skb, MDBA_MDB_ENTRY_INFO);
  142. if (!nest)
  143. return -EMSGSIZE;
  144. vxlan_br_mdb_entry_fill(vxlan, mdb_entry, remote, &e);
  145. if (nla_put_nohdr(skb, sizeof(e), &e) ||
  146. nla_put_u32(skb, MDBA_MDB_EATTR_TIMER, 0))
  147. goto nest_err;
  148. if (!vxlan_addr_any(&mdb_entry->key.src) &&
  149. vxlan_nla_put_addr(skb, MDBA_MDB_EATTR_SOURCE, &mdb_entry->key.src))
  150. goto nest_err;
  151. if (nla_put_u8(skb, MDBA_MDB_EATTR_RTPROT, remote->rt_protocol) ||
  152. nla_put_u8(skb, MDBA_MDB_EATTR_GROUP_MODE, remote->filter_mode) ||
  153. vxlan_mdb_entry_info_fill_srcs(skb, remote) ||
  154. vxlan_nla_put_addr(skb, MDBA_MDB_EATTR_DST, &rd->remote_ip))
  155. goto nest_err;
  156. if (rd->remote_port && rd->remote_port != vxlan->cfg.dst_port &&
  157. nla_put_u16(skb, MDBA_MDB_EATTR_DST_PORT,
  158. be16_to_cpu(rd->remote_port)))
  159. goto nest_err;
  160. if (rd->remote_vni != vxlan->default_dst.remote_vni &&
  161. nla_put_u32(skb, MDBA_MDB_EATTR_VNI, be32_to_cpu(rd->remote_vni)))
  162. goto nest_err;
  163. if (rd->remote_ifindex &&
  164. nla_put_u32(skb, MDBA_MDB_EATTR_IFINDEX, rd->remote_ifindex))
  165. goto nest_err;
  166. if ((vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA) &&
  167. mdb_entry->key.vni && nla_put_u32(skb, MDBA_MDB_EATTR_SRC_VNI,
  168. be32_to_cpu(mdb_entry->key.vni)))
  169. goto nest_err;
  170. nla_nest_end(skb, nest);
  171. return 0;
  172. nest_err:
  173. nla_nest_cancel(skb, nest);
  174. return -EMSGSIZE;
  175. }
  176. static int vxlan_mdb_entry_fill(const struct vxlan_dev *vxlan,
  177. struct sk_buff *skb,
  178. struct vxlan_mdb_dump_ctx *ctx,
  179. const struct vxlan_mdb_entry *mdb_entry)
  180. {
  181. int remote_idx = 0, s_remote_idx = ctx->remote_idx;
  182. struct vxlan_mdb_remote *remote;
  183. struct nlattr *nest;
  184. int err = 0;
  185. nest = nla_nest_start_noflag(skb, MDBA_MDB_ENTRY);
  186. if (!nest)
  187. return -EMSGSIZE;
  188. list_for_each_entry(remote, &mdb_entry->remotes, list) {
  189. if (remote_idx < s_remote_idx)
  190. goto skip;
  191. err = vxlan_mdb_entry_info_fill(vxlan, skb, mdb_entry, remote);
  192. if (err)
  193. break;
  194. skip:
  195. remote_idx++;
  196. }
  197. ctx->remote_idx = err ? remote_idx : 0;
  198. nla_nest_end(skb, nest);
  199. return err;
  200. }
  201. static int vxlan_mdb_fill(const struct vxlan_dev *vxlan, struct sk_buff *skb,
  202. struct vxlan_mdb_dump_ctx *ctx)
  203. {
  204. int entry_idx = 0, s_entry_idx = ctx->entry_idx;
  205. struct vxlan_mdb_entry *mdb_entry;
  206. struct nlattr *nest;
  207. int err = 0;
  208. nest = nla_nest_start_noflag(skb, MDBA_MDB);
  209. if (!nest)
  210. return -EMSGSIZE;
  211. hlist_for_each_entry(mdb_entry, &vxlan->mdb_list, mdb_node) {
  212. if (entry_idx < s_entry_idx)
  213. goto skip;
  214. err = vxlan_mdb_entry_fill(vxlan, skb, ctx, mdb_entry);
  215. if (err)
  216. break;
  217. skip:
  218. entry_idx++;
  219. }
  220. ctx->entry_idx = err ? entry_idx : 0;
  221. nla_nest_end(skb, nest);
  222. return err;
  223. }
  224. int vxlan_mdb_dump(struct net_device *dev, struct sk_buff *skb,
  225. struct netlink_callback *cb)
  226. {
  227. struct vxlan_mdb_dump_ctx *ctx = (void *)cb->ctx;
  228. struct vxlan_dev *vxlan = netdev_priv(dev);
  229. struct br_port_msg *bpm;
  230. struct nlmsghdr *nlh;
  231. int err;
  232. ASSERT_RTNL();
  233. NL_ASSERT_DUMP_CTX_FITS(struct vxlan_mdb_dump_ctx);
  234. nlh = nlmsg_put(skb, NETLINK_CB(cb->skb).portid,
  235. cb->nlh->nlmsg_seq, RTM_NEWMDB, sizeof(*bpm),
  236. NLM_F_MULTI);
  237. if (!nlh)
  238. return -EMSGSIZE;
  239. bpm = nlmsg_data(nlh);
  240. memset(bpm, 0, sizeof(*bpm));
  241. bpm->family = AF_BRIDGE;
  242. bpm->ifindex = dev->ifindex;
  243. err = vxlan_mdb_fill(vxlan, skb, ctx);
  244. nlmsg_end(skb, nlh);
  245. cb->seq = vxlan->mdb_seq;
  246. nl_dump_check_consistent(cb, nlh);
  247. return err;
  248. }
  249. static const struct nla_policy
  250. vxlan_mdbe_src_list_entry_pol[MDBE_SRCATTR_MAX + 1] = {
  251. [MDBE_SRCATTR_ADDRESS] = NLA_POLICY_RANGE(NLA_BINARY,
  252. sizeof(struct in_addr),
  253. sizeof(struct in6_addr)),
  254. };
  255. static const struct nla_policy
  256. vxlan_mdbe_src_list_pol[MDBE_SRC_LIST_MAX + 1] = {
  257. [MDBE_SRC_LIST_ENTRY] = NLA_POLICY_NESTED(vxlan_mdbe_src_list_entry_pol),
  258. };
  259. static const struct netlink_range_validation vni_range = {
  260. .max = VXLAN_N_VID - 1,
  261. };
  262. static const struct nla_policy vxlan_mdbe_attrs_pol[MDBE_ATTR_MAX + 1] = {
  263. [MDBE_ATTR_SOURCE] = NLA_POLICY_RANGE(NLA_BINARY,
  264. sizeof(struct in_addr),
  265. sizeof(struct in6_addr)),
  266. [MDBE_ATTR_GROUP_MODE] = NLA_POLICY_RANGE(NLA_U8, MCAST_EXCLUDE,
  267. MCAST_INCLUDE),
  268. [MDBE_ATTR_SRC_LIST] = NLA_POLICY_NESTED(vxlan_mdbe_src_list_pol),
  269. [MDBE_ATTR_RTPROT] = NLA_POLICY_MIN(NLA_U8, RTPROT_STATIC),
  270. [MDBE_ATTR_DST] = NLA_POLICY_RANGE(NLA_BINARY,
  271. sizeof(struct in_addr),
  272. sizeof(struct in6_addr)),
  273. [MDBE_ATTR_DST_PORT] = { .type = NLA_U16 },
  274. [MDBE_ATTR_VNI] = NLA_POLICY_FULL_RANGE(NLA_U32, &vni_range),
  275. [MDBE_ATTR_IFINDEX] = NLA_POLICY_MIN(NLA_S32, 1),
  276. [MDBE_ATTR_SRC_VNI] = NLA_POLICY_FULL_RANGE(NLA_U32, &vni_range),
  277. };
  278. static bool vxlan_mdb_is_valid_source(const struct nlattr *attr, __be16 proto,
  279. struct netlink_ext_ack *extack)
  280. {
  281. switch (proto) {
  282. case htons(ETH_P_IP):
  283. if (nla_len(attr) != sizeof(struct in_addr)) {
  284. NL_SET_ERR_MSG_MOD(extack, "IPv4 invalid source address length");
  285. return false;
  286. }
  287. if (ipv4_is_multicast(nla_get_in_addr(attr))) {
  288. NL_SET_ERR_MSG_MOD(extack, "IPv4 multicast source address is not allowed");
  289. return false;
  290. }
  291. break;
  292. #if IS_ENABLED(CONFIG_IPV6)
  293. case htons(ETH_P_IPV6): {
  294. struct in6_addr src;
  295. if (nla_len(attr) != sizeof(struct in6_addr)) {
  296. NL_SET_ERR_MSG_MOD(extack, "IPv6 invalid source address length");
  297. return false;
  298. }
  299. src = nla_get_in6_addr(attr);
  300. if (ipv6_addr_is_multicast(&src)) {
  301. NL_SET_ERR_MSG_MOD(extack, "IPv6 multicast source address is not allowed");
  302. return false;
  303. }
  304. break;
  305. }
  306. #endif
  307. default:
  308. NL_SET_ERR_MSG_MOD(extack, "Invalid protocol used with source address");
  309. return false;
  310. }
  311. return true;
  312. }
  313. static void vxlan_mdb_group_set(struct vxlan_mdb_entry_key *group,
  314. const struct br_mdb_entry *entry,
  315. const struct nlattr *source_attr)
  316. {
  317. switch (entry->addr.proto) {
  318. case htons(ETH_P_IP):
  319. group->dst.sa.sa_family = AF_INET;
  320. group->dst.sin.sin_addr.s_addr = entry->addr.u.ip4;
  321. break;
  322. #if IS_ENABLED(CONFIG_IPV6)
  323. case htons(ETH_P_IPV6):
  324. group->dst.sa.sa_family = AF_INET6;
  325. group->dst.sin6.sin6_addr = entry->addr.u.ip6;
  326. break;
  327. #endif
  328. }
  329. if (source_attr)
  330. vxlan_nla_get_addr(&group->src, source_attr);
  331. }
  332. static bool vxlan_mdb_is_star_g(const struct vxlan_mdb_entry_key *group)
  333. {
  334. return !vxlan_addr_any(&group->dst) && vxlan_addr_any(&group->src);
  335. }
  336. static bool vxlan_mdb_is_sg(const struct vxlan_mdb_entry_key *group)
  337. {
  338. return !vxlan_addr_any(&group->dst) && !vxlan_addr_any(&group->src);
  339. }
  340. static int vxlan_mdb_config_src_entry_init(struct vxlan_mdb_config *cfg,
  341. __be16 proto,
  342. const struct nlattr *src_entry,
  343. struct netlink_ext_ack *extack)
  344. {
  345. struct nlattr *tb[MDBE_SRCATTR_MAX + 1];
  346. struct vxlan_mdb_config_src_entry *src;
  347. int err;
  348. err = nla_parse_nested(tb, MDBE_SRCATTR_MAX, src_entry,
  349. vxlan_mdbe_src_list_entry_pol, extack);
  350. if (err)
  351. return err;
  352. if (NL_REQ_ATTR_CHECK(extack, src_entry, tb, MDBE_SRCATTR_ADDRESS))
  353. return -EINVAL;
  354. if (!vxlan_mdb_is_valid_source(tb[MDBE_SRCATTR_ADDRESS], proto,
  355. extack))
  356. return -EINVAL;
  357. src = kzalloc(sizeof(*src), GFP_KERNEL);
  358. if (!src)
  359. return -ENOMEM;
  360. err = vxlan_nla_get_addr(&src->addr, tb[MDBE_SRCATTR_ADDRESS]);
  361. if (err)
  362. goto err_free_src;
  363. list_add_tail(&src->node, &cfg->src_list);
  364. return 0;
  365. err_free_src:
  366. kfree(src);
  367. return err;
  368. }
  369. static void
  370. vxlan_mdb_config_src_entry_fini(struct vxlan_mdb_config_src_entry *src)
  371. {
  372. list_del(&src->node);
  373. kfree(src);
  374. }
  375. static int vxlan_mdb_config_src_list_init(struct vxlan_mdb_config *cfg,
  376. __be16 proto,
  377. const struct nlattr *src_list,
  378. struct netlink_ext_ack *extack)
  379. {
  380. struct vxlan_mdb_config_src_entry *src, *tmp;
  381. struct nlattr *src_entry;
  382. int rem, err;
  383. nla_for_each_nested(src_entry, src_list, rem) {
  384. err = vxlan_mdb_config_src_entry_init(cfg, proto, src_entry,
  385. extack);
  386. if (err)
  387. goto err_src_entry_init;
  388. }
  389. return 0;
  390. err_src_entry_init:
  391. list_for_each_entry_safe_reverse(src, tmp, &cfg->src_list, node)
  392. vxlan_mdb_config_src_entry_fini(src);
  393. return err;
  394. }
  395. static void vxlan_mdb_config_src_list_fini(struct vxlan_mdb_config *cfg)
  396. {
  397. struct vxlan_mdb_config_src_entry *src, *tmp;
  398. list_for_each_entry_safe_reverse(src, tmp, &cfg->src_list, node)
  399. vxlan_mdb_config_src_entry_fini(src);
  400. }
  401. static int vxlan_mdb_config_attrs_init(struct vxlan_mdb_config *cfg,
  402. const struct br_mdb_entry *entry,
  403. const struct nlattr *set_attrs,
  404. struct netlink_ext_ack *extack)
  405. {
  406. struct nlattr *mdbe_attrs[MDBE_ATTR_MAX + 1];
  407. int err;
  408. err = nla_parse_nested(mdbe_attrs, MDBE_ATTR_MAX, set_attrs,
  409. vxlan_mdbe_attrs_pol, extack);
  410. if (err)
  411. return err;
  412. if (NL_REQ_ATTR_CHECK(extack, set_attrs, mdbe_attrs, MDBE_ATTR_DST)) {
  413. NL_SET_ERR_MSG_MOD(extack, "Missing remote destination IP address");
  414. return -EINVAL;
  415. }
  416. if (mdbe_attrs[MDBE_ATTR_SOURCE] &&
  417. !vxlan_mdb_is_valid_source(mdbe_attrs[MDBE_ATTR_SOURCE],
  418. entry->addr.proto, extack))
  419. return -EINVAL;
  420. vxlan_mdb_group_set(&cfg->group, entry, mdbe_attrs[MDBE_ATTR_SOURCE]);
  421. /* rtnetlink code only validates that IPv4 group address is
  422. * multicast.
  423. */
  424. if (!vxlan_addr_is_multicast(&cfg->group.dst) &&
  425. !vxlan_addr_any(&cfg->group.dst)) {
  426. NL_SET_ERR_MSG_MOD(extack, "Group address is not multicast");
  427. return -EINVAL;
  428. }
  429. if (vxlan_addr_any(&cfg->group.dst) &&
  430. mdbe_attrs[MDBE_ATTR_SOURCE]) {
  431. NL_SET_ERR_MSG_MOD(extack, "Source cannot be specified for the all-zeros entry");
  432. return -EINVAL;
  433. }
  434. if (vxlan_mdb_is_sg(&cfg->group))
  435. cfg->filter_mode = MCAST_INCLUDE;
  436. if (mdbe_attrs[MDBE_ATTR_GROUP_MODE]) {
  437. if (!vxlan_mdb_is_star_g(&cfg->group)) {
  438. NL_SET_ERR_MSG_MOD(extack, "Filter mode can only be set for (*, G) entries");
  439. return -EINVAL;
  440. }
  441. cfg->filter_mode = nla_get_u8(mdbe_attrs[MDBE_ATTR_GROUP_MODE]);
  442. }
  443. if (mdbe_attrs[MDBE_ATTR_SRC_LIST]) {
  444. if (!vxlan_mdb_is_star_g(&cfg->group)) {
  445. NL_SET_ERR_MSG_MOD(extack, "Source list can only be set for (*, G) entries");
  446. return -EINVAL;
  447. }
  448. if (!mdbe_attrs[MDBE_ATTR_GROUP_MODE]) {
  449. NL_SET_ERR_MSG_MOD(extack, "Source list cannot be set without filter mode");
  450. return -EINVAL;
  451. }
  452. err = vxlan_mdb_config_src_list_init(cfg, entry->addr.proto,
  453. mdbe_attrs[MDBE_ATTR_SRC_LIST],
  454. extack);
  455. if (err)
  456. return err;
  457. }
  458. if (vxlan_mdb_is_star_g(&cfg->group) && list_empty(&cfg->src_list) &&
  459. cfg->filter_mode == MCAST_INCLUDE) {
  460. NL_SET_ERR_MSG_MOD(extack, "Cannot add (*, G) INCLUDE with an empty source list");
  461. return -EINVAL;
  462. }
  463. if (mdbe_attrs[MDBE_ATTR_RTPROT])
  464. cfg->rt_protocol = nla_get_u8(mdbe_attrs[MDBE_ATTR_RTPROT]);
  465. err = vxlan_nla_get_addr(&cfg->remote_ip, mdbe_attrs[MDBE_ATTR_DST]);
  466. if (err) {
  467. NL_SET_ERR_MSG_MOD(extack, "Invalid remote destination address");
  468. goto err_src_list_fini;
  469. }
  470. if (mdbe_attrs[MDBE_ATTR_DST_PORT])
  471. cfg->remote_port =
  472. cpu_to_be16(nla_get_u16(mdbe_attrs[MDBE_ATTR_DST_PORT]));
  473. if (mdbe_attrs[MDBE_ATTR_VNI])
  474. cfg->remote_vni =
  475. cpu_to_be32(nla_get_u32(mdbe_attrs[MDBE_ATTR_VNI]));
  476. if (mdbe_attrs[MDBE_ATTR_IFINDEX]) {
  477. cfg->remote_ifindex =
  478. nla_get_s32(mdbe_attrs[MDBE_ATTR_IFINDEX]);
  479. if (!__dev_get_by_index(cfg->vxlan->net, cfg->remote_ifindex)) {
  480. NL_SET_ERR_MSG_MOD(extack, "Outgoing interface not found");
  481. err = -EINVAL;
  482. goto err_src_list_fini;
  483. }
  484. }
  485. if (mdbe_attrs[MDBE_ATTR_SRC_VNI])
  486. cfg->group.vni =
  487. cpu_to_be32(nla_get_u32(mdbe_attrs[MDBE_ATTR_SRC_VNI]));
  488. return 0;
  489. err_src_list_fini:
  490. vxlan_mdb_config_src_list_fini(cfg);
  491. return err;
  492. }
  493. static int vxlan_mdb_config_init(struct vxlan_mdb_config *cfg,
  494. struct net_device *dev, struct nlattr *tb[],
  495. u16 nlmsg_flags,
  496. struct netlink_ext_ack *extack)
  497. {
  498. struct br_mdb_entry *entry = nla_data(tb[MDBA_SET_ENTRY]);
  499. struct vxlan_dev *vxlan = netdev_priv(dev);
  500. memset(cfg, 0, sizeof(*cfg));
  501. cfg->vxlan = vxlan;
  502. cfg->group.vni = vxlan->default_dst.remote_vni;
  503. INIT_LIST_HEAD(&cfg->src_list);
  504. cfg->nlflags = nlmsg_flags;
  505. cfg->filter_mode = MCAST_EXCLUDE;
  506. cfg->rt_protocol = RTPROT_STATIC;
  507. cfg->remote_vni = vxlan->default_dst.remote_vni;
  508. cfg->remote_port = vxlan->cfg.dst_port;
  509. if (entry->ifindex != dev->ifindex) {
  510. NL_SET_ERR_MSG_MOD(extack, "Port net device must be the VXLAN net device");
  511. return -EINVAL;
  512. }
  513. /* State is not part of the entry key and can be ignored on deletion
  514. * requests.
  515. */
  516. if ((nlmsg_flags & (NLM_F_CREATE | NLM_F_REPLACE)) &&
  517. entry->state != MDB_PERMANENT) {
  518. NL_SET_ERR_MSG_MOD(extack, "MDB entry must be permanent");
  519. return -EINVAL;
  520. }
  521. if (entry->flags) {
  522. NL_SET_ERR_MSG_MOD(extack, "Invalid MDB entry flags");
  523. return -EINVAL;
  524. }
  525. if (entry->vid) {
  526. NL_SET_ERR_MSG_MOD(extack, "VID must not be specified");
  527. return -EINVAL;
  528. }
  529. if (entry->addr.proto != htons(ETH_P_IP) &&
  530. entry->addr.proto != htons(ETH_P_IPV6)) {
  531. NL_SET_ERR_MSG_MOD(extack, "Group address must be an IPv4 / IPv6 address");
  532. return -EINVAL;
  533. }
  534. if (NL_REQ_ATTR_CHECK(extack, NULL, tb, MDBA_SET_ENTRY_ATTRS)) {
  535. NL_SET_ERR_MSG_MOD(extack, "Missing MDBA_SET_ENTRY_ATTRS attribute");
  536. return -EINVAL;
  537. }
  538. return vxlan_mdb_config_attrs_init(cfg, entry, tb[MDBA_SET_ENTRY_ATTRS],
  539. extack);
  540. }
  541. static void vxlan_mdb_config_fini(struct vxlan_mdb_config *cfg)
  542. {
  543. vxlan_mdb_config_src_list_fini(cfg);
  544. }
  545. static struct vxlan_mdb_entry *
  546. vxlan_mdb_entry_lookup(struct vxlan_dev *vxlan,
  547. const struct vxlan_mdb_entry_key *group)
  548. {
  549. return rhashtable_lookup_fast(&vxlan->mdb_tbl, group,
  550. vxlan_mdb_rht_params);
  551. }
  552. static struct vxlan_mdb_remote *
  553. vxlan_mdb_remote_lookup(const struct vxlan_mdb_entry *mdb_entry,
  554. const union vxlan_addr *addr)
  555. {
  556. struct vxlan_mdb_remote *remote;
  557. list_for_each_entry(remote, &mdb_entry->remotes, list) {
  558. struct vxlan_rdst *rd = rtnl_dereference(remote->rd);
  559. if (vxlan_addr_equal(addr, &rd->remote_ip))
  560. return remote;
  561. }
  562. return NULL;
  563. }
  564. static void vxlan_mdb_rdst_free(struct rcu_head *head)
  565. {
  566. struct vxlan_rdst *rd = container_of(head, struct vxlan_rdst, rcu);
  567. dst_cache_destroy(&rd->dst_cache);
  568. kfree(rd);
  569. }
  570. static int vxlan_mdb_remote_rdst_init(const struct vxlan_mdb_config *cfg,
  571. struct vxlan_mdb_remote *remote)
  572. {
  573. struct vxlan_rdst *rd;
  574. int err;
  575. rd = kzalloc(sizeof(*rd), GFP_KERNEL);
  576. if (!rd)
  577. return -ENOMEM;
  578. err = dst_cache_init(&rd->dst_cache, GFP_KERNEL);
  579. if (err)
  580. goto err_free_rdst;
  581. rd->remote_ip = cfg->remote_ip;
  582. rd->remote_port = cfg->remote_port;
  583. rd->remote_vni = cfg->remote_vni;
  584. rd->remote_ifindex = cfg->remote_ifindex;
  585. rcu_assign_pointer(remote->rd, rd);
  586. return 0;
  587. err_free_rdst:
  588. kfree(rd);
  589. return err;
  590. }
  591. static void vxlan_mdb_remote_rdst_fini(struct vxlan_rdst *rd)
  592. {
  593. call_rcu(&rd->rcu, vxlan_mdb_rdst_free);
  594. }
  595. static int vxlan_mdb_remote_init(const struct vxlan_mdb_config *cfg,
  596. struct vxlan_mdb_remote *remote)
  597. {
  598. int err;
  599. err = vxlan_mdb_remote_rdst_init(cfg, remote);
  600. if (err)
  601. return err;
  602. remote->flags = cfg->flags;
  603. remote->filter_mode = cfg->filter_mode;
  604. remote->rt_protocol = cfg->rt_protocol;
  605. INIT_HLIST_HEAD(&remote->src_list);
  606. return 0;
  607. }
  608. static void vxlan_mdb_remote_fini(struct vxlan_dev *vxlan,
  609. struct vxlan_mdb_remote *remote)
  610. {
  611. WARN_ON_ONCE(!hlist_empty(&remote->src_list));
  612. vxlan_mdb_remote_rdst_fini(rtnl_dereference(remote->rd));
  613. }
  614. static struct vxlan_mdb_src_entry *
  615. vxlan_mdb_remote_src_entry_lookup(const struct vxlan_mdb_remote *remote,
  616. const union vxlan_addr *addr)
  617. {
  618. struct vxlan_mdb_src_entry *ent;
  619. hlist_for_each_entry(ent, &remote->src_list, node) {
  620. if (vxlan_addr_equal(&ent->addr, addr))
  621. return ent;
  622. }
  623. return NULL;
  624. }
  625. static struct vxlan_mdb_src_entry *
  626. vxlan_mdb_remote_src_entry_add(struct vxlan_mdb_remote *remote,
  627. const union vxlan_addr *addr)
  628. {
  629. struct vxlan_mdb_src_entry *ent;
  630. ent = kzalloc(sizeof(*ent), GFP_KERNEL);
  631. if (!ent)
  632. return NULL;
  633. ent->addr = *addr;
  634. hlist_add_head(&ent->node, &remote->src_list);
  635. return ent;
  636. }
  637. static void
  638. vxlan_mdb_remote_src_entry_del(struct vxlan_mdb_src_entry *ent)
  639. {
  640. hlist_del(&ent->node);
  641. kfree(ent);
  642. }
  643. static int
  644. vxlan_mdb_remote_src_fwd_add(const struct vxlan_mdb_config *cfg,
  645. const union vxlan_addr *addr,
  646. struct netlink_ext_ack *extack)
  647. {
  648. struct vxlan_mdb_config sg_cfg;
  649. memset(&sg_cfg, 0, sizeof(sg_cfg));
  650. sg_cfg.vxlan = cfg->vxlan;
  651. sg_cfg.group.src = *addr;
  652. sg_cfg.group.dst = cfg->group.dst;
  653. sg_cfg.group.vni = cfg->group.vni;
  654. INIT_LIST_HEAD(&sg_cfg.src_list);
  655. sg_cfg.remote_ip = cfg->remote_ip;
  656. sg_cfg.remote_ifindex = cfg->remote_ifindex;
  657. sg_cfg.remote_vni = cfg->remote_vni;
  658. sg_cfg.remote_port = cfg->remote_port;
  659. sg_cfg.nlflags = cfg->nlflags;
  660. sg_cfg.filter_mode = MCAST_INCLUDE;
  661. if (cfg->filter_mode == MCAST_EXCLUDE)
  662. sg_cfg.flags = VXLAN_MDB_REMOTE_F_BLOCKED;
  663. sg_cfg.rt_protocol = cfg->rt_protocol;
  664. return __vxlan_mdb_add(&sg_cfg, extack);
  665. }
  666. static void
  667. vxlan_mdb_remote_src_fwd_del(struct vxlan_dev *vxlan,
  668. const struct vxlan_mdb_entry_key *group,
  669. const struct vxlan_mdb_remote *remote,
  670. const union vxlan_addr *addr)
  671. {
  672. struct vxlan_rdst *rd = rtnl_dereference(remote->rd);
  673. struct vxlan_mdb_config sg_cfg;
  674. memset(&sg_cfg, 0, sizeof(sg_cfg));
  675. sg_cfg.vxlan = vxlan;
  676. sg_cfg.group.src = *addr;
  677. sg_cfg.group.dst = group->dst;
  678. sg_cfg.group.vni = group->vni;
  679. INIT_LIST_HEAD(&sg_cfg.src_list);
  680. sg_cfg.remote_ip = rd->remote_ip;
  681. __vxlan_mdb_del(&sg_cfg, NULL);
  682. }
  683. static int
  684. vxlan_mdb_remote_src_add(const struct vxlan_mdb_config *cfg,
  685. struct vxlan_mdb_remote *remote,
  686. const struct vxlan_mdb_config_src_entry *src,
  687. struct netlink_ext_ack *extack)
  688. {
  689. struct vxlan_mdb_src_entry *ent;
  690. int err;
  691. ent = vxlan_mdb_remote_src_entry_lookup(remote, &src->addr);
  692. if (!ent) {
  693. ent = vxlan_mdb_remote_src_entry_add(remote, &src->addr);
  694. if (!ent)
  695. return -ENOMEM;
  696. } else if (!(cfg->nlflags & NLM_F_REPLACE)) {
  697. NL_SET_ERR_MSG_MOD(extack, "Source entry already exists");
  698. return -EEXIST;
  699. }
  700. err = vxlan_mdb_remote_src_fwd_add(cfg, &ent->addr, extack);
  701. if (err)
  702. goto err_src_del;
  703. /* Clear flags in case source entry was marked for deletion as part of
  704. * replace flow.
  705. */
  706. ent->flags = 0;
  707. return 0;
  708. err_src_del:
  709. vxlan_mdb_remote_src_entry_del(ent);
  710. return err;
  711. }
  712. static void vxlan_mdb_remote_src_del(struct vxlan_dev *vxlan,
  713. const struct vxlan_mdb_entry_key *group,
  714. const struct vxlan_mdb_remote *remote,
  715. struct vxlan_mdb_src_entry *ent)
  716. {
  717. vxlan_mdb_remote_src_fwd_del(vxlan, group, remote, &ent->addr);
  718. vxlan_mdb_remote_src_entry_del(ent);
  719. }
  720. static int vxlan_mdb_remote_srcs_add(const struct vxlan_mdb_config *cfg,
  721. struct vxlan_mdb_remote *remote,
  722. struct netlink_ext_ack *extack)
  723. {
  724. struct vxlan_mdb_config_src_entry *src;
  725. struct vxlan_mdb_src_entry *ent;
  726. struct hlist_node *tmp;
  727. int err;
  728. list_for_each_entry(src, &cfg->src_list, node) {
  729. err = vxlan_mdb_remote_src_add(cfg, remote, src, extack);
  730. if (err)
  731. goto err_src_del;
  732. }
  733. return 0;
  734. err_src_del:
  735. hlist_for_each_entry_safe(ent, tmp, &remote->src_list, node)
  736. vxlan_mdb_remote_src_del(cfg->vxlan, &cfg->group, remote, ent);
  737. return err;
  738. }
  739. static void vxlan_mdb_remote_srcs_del(struct vxlan_dev *vxlan,
  740. const struct vxlan_mdb_entry_key *group,
  741. struct vxlan_mdb_remote *remote)
  742. {
  743. struct vxlan_mdb_src_entry *ent;
  744. struct hlist_node *tmp;
  745. hlist_for_each_entry_safe(ent, tmp, &remote->src_list, node)
  746. vxlan_mdb_remote_src_del(vxlan, group, remote, ent);
  747. }
  748. static size_t
  749. vxlan_mdb_nlmsg_src_list_size(const struct vxlan_mdb_entry_key *group,
  750. const struct vxlan_mdb_remote *remote)
  751. {
  752. struct vxlan_mdb_src_entry *ent;
  753. size_t nlmsg_size;
  754. if (hlist_empty(&remote->src_list))
  755. return 0;
  756. /* MDBA_MDB_EATTR_SRC_LIST */
  757. nlmsg_size = nla_total_size(0);
  758. hlist_for_each_entry(ent, &remote->src_list, node) {
  759. /* MDBA_MDB_SRCLIST_ENTRY */
  760. nlmsg_size += nla_total_size(0) +
  761. /* MDBA_MDB_SRCATTR_ADDRESS */
  762. nla_total_size(vxlan_addr_size(&group->dst)) +
  763. /* MDBA_MDB_SRCATTR_TIMER */
  764. nla_total_size(sizeof(u8));
  765. }
  766. return nlmsg_size;
  767. }
  768. static size_t
  769. vxlan_mdb_nlmsg_remote_size(const struct vxlan_dev *vxlan,
  770. const struct vxlan_mdb_entry *mdb_entry,
  771. const struct vxlan_mdb_remote *remote)
  772. {
  773. const struct vxlan_mdb_entry_key *group = &mdb_entry->key;
  774. struct vxlan_rdst *rd = rtnl_dereference(remote->rd);
  775. size_t nlmsg_size;
  776. /* MDBA_MDB_ENTRY_INFO */
  777. nlmsg_size = nla_total_size(sizeof(struct br_mdb_entry)) +
  778. /* MDBA_MDB_EATTR_TIMER */
  779. nla_total_size(sizeof(u32));
  780. /* MDBA_MDB_EATTR_SOURCE */
  781. if (vxlan_mdb_is_sg(group))
  782. nlmsg_size += nla_total_size(vxlan_addr_size(&group->dst));
  783. /* MDBA_MDB_EATTR_RTPROT */
  784. nlmsg_size += nla_total_size(sizeof(u8));
  785. /* MDBA_MDB_EATTR_SRC_LIST */
  786. nlmsg_size += vxlan_mdb_nlmsg_src_list_size(group, remote);
  787. /* MDBA_MDB_EATTR_GROUP_MODE */
  788. nlmsg_size += nla_total_size(sizeof(u8));
  789. /* MDBA_MDB_EATTR_DST */
  790. nlmsg_size += nla_total_size(vxlan_addr_size(&rd->remote_ip));
  791. /* MDBA_MDB_EATTR_DST_PORT */
  792. if (rd->remote_port && rd->remote_port != vxlan->cfg.dst_port)
  793. nlmsg_size += nla_total_size(sizeof(u16));
  794. /* MDBA_MDB_EATTR_VNI */
  795. if (rd->remote_vni != vxlan->default_dst.remote_vni)
  796. nlmsg_size += nla_total_size(sizeof(u32));
  797. /* MDBA_MDB_EATTR_IFINDEX */
  798. if (rd->remote_ifindex)
  799. nlmsg_size += nla_total_size(sizeof(u32));
  800. /* MDBA_MDB_EATTR_SRC_VNI */
  801. if ((vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA) && group->vni)
  802. nlmsg_size += nla_total_size(sizeof(u32));
  803. return nlmsg_size;
  804. }
  805. static size_t vxlan_mdb_nlmsg_size(const struct vxlan_dev *vxlan,
  806. const struct vxlan_mdb_entry *mdb_entry,
  807. const struct vxlan_mdb_remote *remote)
  808. {
  809. return NLMSG_ALIGN(sizeof(struct br_port_msg)) +
  810. /* MDBA_MDB */
  811. nla_total_size(0) +
  812. /* MDBA_MDB_ENTRY */
  813. nla_total_size(0) +
  814. /* Remote entry */
  815. vxlan_mdb_nlmsg_remote_size(vxlan, mdb_entry, remote);
  816. }
  817. static int vxlan_mdb_nlmsg_fill(const struct vxlan_dev *vxlan,
  818. struct sk_buff *skb,
  819. const struct vxlan_mdb_entry *mdb_entry,
  820. const struct vxlan_mdb_remote *remote,
  821. int type)
  822. {
  823. struct nlattr *mdb_nest, *mdb_entry_nest;
  824. struct br_port_msg *bpm;
  825. struct nlmsghdr *nlh;
  826. nlh = nlmsg_put(skb, 0, 0, type, sizeof(*bpm), 0);
  827. if (!nlh)
  828. return -EMSGSIZE;
  829. bpm = nlmsg_data(nlh);
  830. memset(bpm, 0, sizeof(*bpm));
  831. bpm->family = AF_BRIDGE;
  832. bpm->ifindex = vxlan->dev->ifindex;
  833. mdb_nest = nla_nest_start_noflag(skb, MDBA_MDB);
  834. if (!mdb_nest)
  835. goto cancel;
  836. mdb_entry_nest = nla_nest_start_noflag(skb, MDBA_MDB_ENTRY);
  837. if (!mdb_entry_nest)
  838. goto cancel;
  839. if (vxlan_mdb_entry_info_fill(vxlan, skb, mdb_entry, remote))
  840. goto cancel;
  841. nla_nest_end(skb, mdb_entry_nest);
  842. nla_nest_end(skb, mdb_nest);
  843. nlmsg_end(skb, nlh);
  844. return 0;
  845. cancel:
  846. nlmsg_cancel(skb, nlh);
  847. return -EMSGSIZE;
  848. }
  849. static void vxlan_mdb_remote_notify(const struct vxlan_dev *vxlan,
  850. const struct vxlan_mdb_entry *mdb_entry,
  851. const struct vxlan_mdb_remote *remote,
  852. int type)
  853. {
  854. struct net *net = dev_net(vxlan->dev);
  855. struct sk_buff *skb;
  856. int err = -ENOBUFS;
  857. skb = nlmsg_new(vxlan_mdb_nlmsg_size(vxlan, mdb_entry, remote),
  858. GFP_KERNEL);
  859. if (!skb)
  860. goto errout;
  861. err = vxlan_mdb_nlmsg_fill(vxlan, skb, mdb_entry, remote, type);
  862. if (err) {
  863. kfree_skb(skb);
  864. goto errout;
  865. }
  866. rtnl_notify(skb, net, 0, RTNLGRP_MDB, NULL, GFP_KERNEL);
  867. return;
  868. errout:
  869. rtnl_set_sk_err(net, RTNLGRP_MDB, err);
  870. }
  871. static int
  872. vxlan_mdb_remote_srcs_replace(const struct vxlan_mdb_config *cfg,
  873. const struct vxlan_mdb_entry *mdb_entry,
  874. struct vxlan_mdb_remote *remote,
  875. struct netlink_ext_ack *extack)
  876. {
  877. struct vxlan_dev *vxlan = cfg->vxlan;
  878. struct vxlan_mdb_src_entry *ent;
  879. struct hlist_node *tmp;
  880. int err;
  881. hlist_for_each_entry(ent, &remote->src_list, node)
  882. ent->flags |= VXLAN_SGRP_F_DELETE;
  883. err = vxlan_mdb_remote_srcs_add(cfg, remote, extack);
  884. if (err)
  885. goto err_clear_delete;
  886. hlist_for_each_entry_safe(ent, tmp, &remote->src_list, node) {
  887. if (ent->flags & VXLAN_SGRP_F_DELETE)
  888. vxlan_mdb_remote_src_del(vxlan, &mdb_entry->key, remote,
  889. ent);
  890. }
  891. return 0;
  892. err_clear_delete:
  893. hlist_for_each_entry(ent, &remote->src_list, node)
  894. ent->flags &= ~VXLAN_SGRP_F_DELETE;
  895. return err;
  896. }
  897. static int vxlan_mdb_remote_replace(const struct vxlan_mdb_config *cfg,
  898. const struct vxlan_mdb_entry *mdb_entry,
  899. struct vxlan_mdb_remote *remote,
  900. struct netlink_ext_ack *extack)
  901. {
  902. struct vxlan_rdst *new_rd, *old_rd = rtnl_dereference(remote->rd);
  903. struct vxlan_dev *vxlan = cfg->vxlan;
  904. int err;
  905. err = vxlan_mdb_remote_rdst_init(cfg, remote);
  906. if (err)
  907. return err;
  908. new_rd = rtnl_dereference(remote->rd);
  909. err = vxlan_mdb_remote_srcs_replace(cfg, mdb_entry, remote, extack);
  910. if (err)
  911. goto err_rdst_reset;
  912. WRITE_ONCE(remote->flags, cfg->flags);
  913. WRITE_ONCE(remote->filter_mode, cfg->filter_mode);
  914. remote->rt_protocol = cfg->rt_protocol;
  915. vxlan_mdb_remote_notify(vxlan, mdb_entry, remote, RTM_NEWMDB);
  916. vxlan_mdb_remote_rdst_fini(old_rd);
  917. return 0;
  918. err_rdst_reset:
  919. rcu_assign_pointer(remote->rd, old_rd);
  920. vxlan_mdb_remote_rdst_fini(new_rd);
  921. return err;
  922. }
  923. static int vxlan_mdb_remote_add(const struct vxlan_mdb_config *cfg,
  924. struct vxlan_mdb_entry *mdb_entry,
  925. struct netlink_ext_ack *extack)
  926. {
  927. struct vxlan_mdb_remote *remote;
  928. int err;
  929. remote = vxlan_mdb_remote_lookup(mdb_entry, &cfg->remote_ip);
  930. if (remote) {
  931. if (!(cfg->nlflags & NLM_F_REPLACE)) {
  932. NL_SET_ERR_MSG_MOD(extack, "Replace not specified and MDB remote entry already exists");
  933. return -EEXIST;
  934. }
  935. return vxlan_mdb_remote_replace(cfg, mdb_entry, remote, extack);
  936. }
  937. if (!(cfg->nlflags & NLM_F_CREATE)) {
  938. NL_SET_ERR_MSG_MOD(extack, "Create not specified and entry does not exist");
  939. return -ENOENT;
  940. }
  941. remote = kzalloc(sizeof(*remote), GFP_KERNEL);
  942. if (!remote)
  943. return -ENOMEM;
  944. err = vxlan_mdb_remote_init(cfg, remote);
  945. if (err) {
  946. NL_SET_ERR_MSG_MOD(extack, "Failed to initialize remote MDB entry");
  947. goto err_free_remote;
  948. }
  949. err = vxlan_mdb_remote_srcs_add(cfg, remote, extack);
  950. if (err)
  951. goto err_remote_fini;
  952. list_add_rcu(&remote->list, &mdb_entry->remotes);
  953. vxlan_mdb_remote_notify(cfg->vxlan, mdb_entry, remote, RTM_NEWMDB);
  954. return 0;
  955. err_remote_fini:
  956. vxlan_mdb_remote_fini(cfg->vxlan, remote);
  957. err_free_remote:
  958. kfree(remote);
  959. return err;
  960. }
  961. static void vxlan_mdb_remote_del(struct vxlan_dev *vxlan,
  962. struct vxlan_mdb_entry *mdb_entry,
  963. struct vxlan_mdb_remote *remote)
  964. {
  965. vxlan_mdb_remote_notify(vxlan, mdb_entry, remote, RTM_DELMDB);
  966. list_del_rcu(&remote->list);
  967. vxlan_mdb_remote_srcs_del(vxlan, &mdb_entry->key, remote);
  968. vxlan_mdb_remote_fini(vxlan, remote);
  969. kfree_rcu(remote, rcu);
  970. }
  971. static struct vxlan_mdb_entry *
  972. vxlan_mdb_entry_get(struct vxlan_dev *vxlan,
  973. const struct vxlan_mdb_entry_key *group)
  974. {
  975. struct vxlan_mdb_entry *mdb_entry;
  976. int err;
  977. mdb_entry = vxlan_mdb_entry_lookup(vxlan, group);
  978. if (mdb_entry)
  979. return mdb_entry;
  980. mdb_entry = kzalloc(sizeof(*mdb_entry), GFP_KERNEL);
  981. if (!mdb_entry)
  982. return ERR_PTR(-ENOMEM);
  983. INIT_LIST_HEAD(&mdb_entry->remotes);
  984. memcpy(&mdb_entry->key, group, sizeof(mdb_entry->key));
  985. hlist_add_head(&mdb_entry->mdb_node, &vxlan->mdb_list);
  986. err = rhashtable_lookup_insert_fast(&vxlan->mdb_tbl,
  987. &mdb_entry->rhnode,
  988. vxlan_mdb_rht_params);
  989. if (err)
  990. goto err_free_entry;
  991. if (hlist_is_singular_node(&mdb_entry->mdb_node, &vxlan->mdb_list))
  992. vxlan->cfg.flags |= VXLAN_F_MDB;
  993. return mdb_entry;
  994. err_free_entry:
  995. hlist_del(&mdb_entry->mdb_node);
  996. kfree(mdb_entry);
  997. return ERR_PTR(err);
  998. }
  999. static void vxlan_mdb_entry_put(struct vxlan_dev *vxlan,
  1000. struct vxlan_mdb_entry *mdb_entry)
  1001. {
  1002. if (!list_empty(&mdb_entry->remotes))
  1003. return;
  1004. if (hlist_is_singular_node(&mdb_entry->mdb_node, &vxlan->mdb_list))
  1005. vxlan->cfg.flags &= ~VXLAN_F_MDB;
  1006. rhashtable_remove_fast(&vxlan->mdb_tbl, &mdb_entry->rhnode,
  1007. vxlan_mdb_rht_params);
  1008. hlist_del(&mdb_entry->mdb_node);
  1009. kfree_rcu(mdb_entry, rcu);
  1010. }
  1011. static int __vxlan_mdb_add(const struct vxlan_mdb_config *cfg,
  1012. struct netlink_ext_ack *extack)
  1013. {
  1014. struct vxlan_dev *vxlan = cfg->vxlan;
  1015. struct vxlan_mdb_entry *mdb_entry;
  1016. int err;
  1017. mdb_entry = vxlan_mdb_entry_get(vxlan, &cfg->group);
  1018. if (IS_ERR(mdb_entry))
  1019. return PTR_ERR(mdb_entry);
  1020. err = vxlan_mdb_remote_add(cfg, mdb_entry, extack);
  1021. if (err)
  1022. goto err_entry_put;
  1023. vxlan->mdb_seq++;
  1024. return 0;
  1025. err_entry_put:
  1026. vxlan_mdb_entry_put(vxlan, mdb_entry);
  1027. return err;
  1028. }
  1029. static int __vxlan_mdb_del(const struct vxlan_mdb_config *cfg,
  1030. struct netlink_ext_ack *extack)
  1031. {
  1032. struct vxlan_dev *vxlan = cfg->vxlan;
  1033. struct vxlan_mdb_entry *mdb_entry;
  1034. struct vxlan_mdb_remote *remote;
  1035. mdb_entry = vxlan_mdb_entry_lookup(vxlan, &cfg->group);
  1036. if (!mdb_entry) {
  1037. NL_SET_ERR_MSG_MOD(extack, "Did not find MDB entry");
  1038. return -ENOENT;
  1039. }
  1040. remote = vxlan_mdb_remote_lookup(mdb_entry, &cfg->remote_ip);
  1041. if (!remote) {
  1042. NL_SET_ERR_MSG_MOD(extack, "Did not find MDB remote entry");
  1043. return -ENOENT;
  1044. }
  1045. vxlan_mdb_remote_del(vxlan, mdb_entry, remote);
  1046. vxlan_mdb_entry_put(vxlan, mdb_entry);
  1047. vxlan->mdb_seq++;
  1048. return 0;
  1049. }
  1050. int vxlan_mdb_add(struct net_device *dev, struct nlattr *tb[], u16 nlmsg_flags,
  1051. struct netlink_ext_ack *extack)
  1052. {
  1053. struct vxlan_mdb_config cfg;
  1054. int err;
  1055. ASSERT_RTNL();
  1056. err = vxlan_mdb_config_init(&cfg, dev, tb, nlmsg_flags, extack);
  1057. if (err)
  1058. return err;
  1059. err = __vxlan_mdb_add(&cfg, extack);
  1060. vxlan_mdb_config_fini(&cfg);
  1061. return err;
  1062. }
  1063. int vxlan_mdb_del(struct net_device *dev, struct nlattr *tb[],
  1064. struct netlink_ext_ack *extack)
  1065. {
  1066. struct vxlan_mdb_config cfg;
  1067. int err;
  1068. ASSERT_RTNL();
  1069. err = vxlan_mdb_config_init(&cfg, dev, tb, 0, extack);
  1070. if (err)
  1071. return err;
  1072. err = __vxlan_mdb_del(&cfg, extack);
  1073. vxlan_mdb_config_fini(&cfg);
  1074. return err;
  1075. }
  1076. static const struct nla_policy
  1077. vxlan_mdbe_attrs_del_bulk_pol[MDBE_ATTR_MAX + 1] = {
  1078. [MDBE_ATTR_RTPROT] = NLA_POLICY_MIN(NLA_U8, RTPROT_STATIC),
  1079. [MDBE_ATTR_DST] = NLA_POLICY_RANGE(NLA_BINARY,
  1080. sizeof(struct in_addr),
  1081. sizeof(struct in6_addr)),
  1082. [MDBE_ATTR_DST_PORT] = { .type = NLA_U16 },
  1083. [MDBE_ATTR_VNI] = NLA_POLICY_FULL_RANGE(NLA_U32, &vni_range),
  1084. [MDBE_ATTR_SRC_VNI] = NLA_POLICY_FULL_RANGE(NLA_U32, &vni_range),
  1085. [MDBE_ATTR_STATE_MASK] = NLA_POLICY_MASK(NLA_U8, MDB_PERMANENT),
  1086. };
  1087. static int vxlan_mdb_flush_desc_init(struct vxlan_dev *vxlan,
  1088. struct vxlan_mdb_flush_desc *desc,
  1089. struct nlattr *tb[],
  1090. struct netlink_ext_ack *extack)
  1091. {
  1092. struct br_mdb_entry *entry = nla_data(tb[MDBA_SET_ENTRY]);
  1093. struct nlattr *mdbe_attrs[MDBE_ATTR_MAX + 1];
  1094. int err;
  1095. if (entry->ifindex && entry->ifindex != vxlan->dev->ifindex) {
  1096. NL_SET_ERR_MSG_MOD(extack, "Invalid port net device");
  1097. return -EINVAL;
  1098. }
  1099. if (entry->vid) {
  1100. NL_SET_ERR_MSG_MOD(extack, "VID must not be specified");
  1101. return -EINVAL;
  1102. }
  1103. if (!tb[MDBA_SET_ENTRY_ATTRS])
  1104. return 0;
  1105. err = nla_parse_nested(mdbe_attrs, MDBE_ATTR_MAX,
  1106. tb[MDBA_SET_ENTRY_ATTRS],
  1107. vxlan_mdbe_attrs_del_bulk_pol, extack);
  1108. if (err)
  1109. return err;
  1110. if (mdbe_attrs[MDBE_ATTR_STATE_MASK]) {
  1111. u8 state_mask = nla_get_u8(mdbe_attrs[MDBE_ATTR_STATE_MASK]);
  1112. if ((state_mask & MDB_PERMANENT) && !(entry->state & MDB_PERMANENT)) {
  1113. NL_SET_ERR_MSG_MOD(extack, "Only permanent MDB entries are supported");
  1114. return -EINVAL;
  1115. }
  1116. }
  1117. if (mdbe_attrs[MDBE_ATTR_RTPROT])
  1118. desc->rt_protocol = nla_get_u8(mdbe_attrs[MDBE_ATTR_RTPROT]);
  1119. if (mdbe_attrs[MDBE_ATTR_DST])
  1120. vxlan_nla_get_addr(&desc->remote_ip, mdbe_attrs[MDBE_ATTR_DST]);
  1121. if (mdbe_attrs[MDBE_ATTR_DST_PORT])
  1122. desc->remote_port =
  1123. cpu_to_be16(nla_get_u16(mdbe_attrs[MDBE_ATTR_DST_PORT]));
  1124. if (mdbe_attrs[MDBE_ATTR_VNI])
  1125. desc->remote_vni =
  1126. cpu_to_be32(nla_get_u32(mdbe_attrs[MDBE_ATTR_VNI]));
  1127. if (mdbe_attrs[MDBE_ATTR_SRC_VNI])
  1128. desc->src_vni =
  1129. cpu_to_be32(nla_get_u32(mdbe_attrs[MDBE_ATTR_SRC_VNI]));
  1130. return 0;
  1131. }
  1132. static void vxlan_mdb_remotes_flush(struct vxlan_dev *vxlan,
  1133. struct vxlan_mdb_entry *mdb_entry,
  1134. const struct vxlan_mdb_flush_desc *desc)
  1135. {
  1136. struct vxlan_mdb_remote *remote, *tmp;
  1137. list_for_each_entry_safe(remote, tmp, &mdb_entry->remotes, list) {
  1138. struct vxlan_rdst *rd = rtnl_dereference(remote->rd);
  1139. __be32 remote_vni;
  1140. if (desc->remote_ip.sa.sa_family &&
  1141. !vxlan_addr_equal(&desc->remote_ip, &rd->remote_ip))
  1142. continue;
  1143. /* Encapsulation is performed with source VNI if remote VNI
  1144. * is not set.
  1145. */
  1146. remote_vni = rd->remote_vni ? : mdb_entry->key.vni;
  1147. if (desc->remote_vni && desc->remote_vni != remote_vni)
  1148. continue;
  1149. if (desc->remote_port && desc->remote_port != rd->remote_port)
  1150. continue;
  1151. if (desc->rt_protocol &&
  1152. desc->rt_protocol != remote->rt_protocol)
  1153. continue;
  1154. vxlan_mdb_remote_del(vxlan, mdb_entry, remote);
  1155. }
  1156. }
  1157. static void vxlan_mdb_flush(struct vxlan_dev *vxlan,
  1158. const struct vxlan_mdb_flush_desc *desc)
  1159. {
  1160. struct vxlan_mdb_entry *mdb_entry;
  1161. struct hlist_node *tmp;
  1162. /* The removal of an entry cannot trigger the removal of another entry
  1163. * since entries are always added to the head of the list.
  1164. */
  1165. hlist_for_each_entry_safe(mdb_entry, tmp, &vxlan->mdb_list, mdb_node) {
  1166. if (desc->src_vni && desc->src_vni != mdb_entry->key.vni)
  1167. continue;
  1168. vxlan_mdb_remotes_flush(vxlan, mdb_entry, desc);
  1169. /* Entry will only be removed if its remotes list is empty. */
  1170. vxlan_mdb_entry_put(vxlan, mdb_entry);
  1171. }
  1172. }
  1173. int vxlan_mdb_del_bulk(struct net_device *dev, struct nlattr *tb[],
  1174. struct netlink_ext_ack *extack)
  1175. {
  1176. struct vxlan_dev *vxlan = netdev_priv(dev);
  1177. struct vxlan_mdb_flush_desc desc = {};
  1178. int err;
  1179. ASSERT_RTNL();
  1180. err = vxlan_mdb_flush_desc_init(vxlan, &desc, tb, extack);
  1181. if (err)
  1182. return err;
  1183. vxlan_mdb_flush(vxlan, &desc);
  1184. return 0;
  1185. }
  1186. static const struct nla_policy vxlan_mdbe_attrs_get_pol[MDBE_ATTR_MAX + 1] = {
  1187. [MDBE_ATTR_SOURCE] = NLA_POLICY_RANGE(NLA_BINARY,
  1188. sizeof(struct in_addr),
  1189. sizeof(struct in6_addr)),
  1190. [MDBE_ATTR_SRC_VNI] = NLA_POLICY_FULL_RANGE(NLA_U32, &vni_range),
  1191. };
  1192. static int vxlan_mdb_get_parse(struct net_device *dev, struct nlattr *tb[],
  1193. struct vxlan_mdb_entry_key *group,
  1194. struct netlink_ext_ack *extack)
  1195. {
  1196. struct br_mdb_entry *entry = nla_data(tb[MDBA_GET_ENTRY]);
  1197. struct nlattr *mdbe_attrs[MDBE_ATTR_MAX + 1];
  1198. struct vxlan_dev *vxlan = netdev_priv(dev);
  1199. int err;
  1200. memset(group, 0, sizeof(*group));
  1201. group->vni = vxlan->default_dst.remote_vni;
  1202. if (!tb[MDBA_GET_ENTRY_ATTRS]) {
  1203. vxlan_mdb_group_set(group, entry, NULL);
  1204. return 0;
  1205. }
  1206. err = nla_parse_nested(mdbe_attrs, MDBE_ATTR_MAX,
  1207. tb[MDBA_GET_ENTRY_ATTRS],
  1208. vxlan_mdbe_attrs_get_pol, extack);
  1209. if (err)
  1210. return err;
  1211. if (mdbe_attrs[MDBE_ATTR_SOURCE] &&
  1212. !vxlan_mdb_is_valid_source(mdbe_attrs[MDBE_ATTR_SOURCE],
  1213. entry->addr.proto, extack))
  1214. return -EINVAL;
  1215. vxlan_mdb_group_set(group, entry, mdbe_attrs[MDBE_ATTR_SOURCE]);
  1216. if (mdbe_attrs[MDBE_ATTR_SRC_VNI])
  1217. group->vni =
  1218. cpu_to_be32(nla_get_u32(mdbe_attrs[MDBE_ATTR_SRC_VNI]));
  1219. return 0;
  1220. }
  1221. static struct sk_buff *
  1222. vxlan_mdb_get_reply_alloc(const struct vxlan_dev *vxlan,
  1223. const struct vxlan_mdb_entry *mdb_entry)
  1224. {
  1225. struct vxlan_mdb_remote *remote;
  1226. size_t nlmsg_size;
  1227. nlmsg_size = NLMSG_ALIGN(sizeof(struct br_port_msg)) +
  1228. /* MDBA_MDB */
  1229. nla_total_size(0) +
  1230. /* MDBA_MDB_ENTRY */
  1231. nla_total_size(0);
  1232. list_for_each_entry(remote, &mdb_entry->remotes, list)
  1233. nlmsg_size += vxlan_mdb_nlmsg_remote_size(vxlan, mdb_entry,
  1234. remote);
  1235. return nlmsg_new(nlmsg_size, GFP_KERNEL);
  1236. }
  1237. static int
  1238. vxlan_mdb_get_reply_fill(const struct vxlan_dev *vxlan,
  1239. struct sk_buff *skb,
  1240. const struct vxlan_mdb_entry *mdb_entry,
  1241. u32 portid, u32 seq)
  1242. {
  1243. struct nlattr *mdb_nest, *mdb_entry_nest;
  1244. struct vxlan_mdb_remote *remote;
  1245. struct br_port_msg *bpm;
  1246. struct nlmsghdr *nlh;
  1247. int err;
  1248. nlh = nlmsg_put(skb, portid, seq, RTM_NEWMDB, sizeof(*bpm), 0);
  1249. if (!nlh)
  1250. return -EMSGSIZE;
  1251. bpm = nlmsg_data(nlh);
  1252. memset(bpm, 0, sizeof(*bpm));
  1253. bpm->family = AF_BRIDGE;
  1254. bpm->ifindex = vxlan->dev->ifindex;
  1255. mdb_nest = nla_nest_start_noflag(skb, MDBA_MDB);
  1256. if (!mdb_nest) {
  1257. err = -EMSGSIZE;
  1258. goto cancel;
  1259. }
  1260. mdb_entry_nest = nla_nest_start_noflag(skb, MDBA_MDB_ENTRY);
  1261. if (!mdb_entry_nest) {
  1262. err = -EMSGSIZE;
  1263. goto cancel;
  1264. }
  1265. list_for_each_entry(remote, &mdb_entry->remotes, list) {
  1266. err = vxlan_mdb_entry_info_fill(vxlan, skb, mdb_entry, remote);
  1267. if (err)
  1268. goto cancel;
  1269. }
  1270. nla_nest_end(skb, mdb_entry_nest);
  1271. nla_nest_end(skb, mdb_nest);
  1272. nlmsg_end(skb, nlh);
  1273. return 0;
  1274. cancel:
  1275. nlmsg_cancel(skb, nlh);
  1276. return err;
  1277. }
  1278. int vxlan_mdb_get(struct net_device *dev, struct nlattr *tb[], u32 portid,
  1279. u32 seq, struct netlink_ext_ack *extack)
  1280. {
  1281. struct vxlan_dev *vxlan = netdev_priv(dev);
  1282. struct vxlan_mdb_entry *mdb_entry;
  1283. struct vxlan_mdb_entry_key group;
  1284. struct sk_buff *skb;
  1285. int err;
  1286. ASSERT_RTNL();
  1287. err = vxlan_mdb_get_parse(dev, tb, &group, extack);
  1288. if (err)
  1289. return err;
  1290. mdb_entry = vxlan_mdb_entry_lookup(vxlan, &group);
  1291. if (!mdb_entry) {
  1292. NL_SET_ERR_MSG_MOD(extack, "MDB entry not found");
  1293. return -ENOENT;
  1294. }
  1295. skb = vxlan_mdb_get_reply_alloc(vxlan, mdb_entry);
  1296. if (!skb)
  1297. return -ENOMEM;
  1298. err = vxlan_mdb_get_reply_fill(vxlan, skb, mdb_entry, portid, seq);
  1299. if (err) {
  1300. NL_SET_ERR_MSG_MOD(extack, "Failed to fill MDB get reply");
  1301. goto free;
  1302. }
  1303. return rtnl_unicast(skb, dev_net(dev), portid);
  1304. free:
  1305. kfree_skb(skb);
  1306. return err;
  1307. }
  1308. struct vxlan_mdb_entry *vxlan_mdb_entry_skb_get(struct vxlan_dev *vxlan,
  1309. struct sk_buff *skb,
  1310. __be32 src_vni)
  1311. {
  1312. struct vxlan_mdb_entry *mdb_entry;
  1313. struct vxlan_mdb_entry_key group;
  1314. if (!is_multicast_ether_addr(eth_hdr(skb)->h_dest) ||
  1315. is_broadcast_ether_addr(eth_hdr(skb)->h_dest))
  1316. return NULL;
  1317. /* When not in collect metadata mode, 'src_vni' is zero, but MDB
  1318. * entries are stored with the VNI of the VXLAN device.
  1319. */
  1320. if (!(vxlan->cfg.flags & VXLAN_F_COLLECT_METADATA))
  1321. src_vni = vxlan->default_dst.remote_vni;
  1322. memset(&group, 0, sizeof(group));
  1323. group.vni = src_vni;
  1324. switch (skb->protocol) {
  1325. case htons(ETH_P_IP):
  1326. if (!pskb_may_pull(skb, sizeof(struct iphdr)))
  1327. return NULL;
  1328. group.dst.sa.sa_family = AF_INET;
  1329. group.dst.sin.sin_addr.s_addr = ip_hdr(skb)->daddr;
  1330. group.src.sa.sa_family = AF_INET;
  1331. group.src.sin.sin_addr.s_addr = ip_hdr(skb)->saddr;
  1332. break;
  1333. #if IS_ENABLED(CONFIG_IPV6)
  1334. case htons(ETH_P_IPV6):
  1335. if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
  1336. return NULL;
  1337. group.dst.sa.sa_family = AF_INET6;
  1338. group.dst.sin6.sin6_addr = ipv6_hdr(skb)->daddr;
  1339. group.src.sa.sa_family = AF_INET6;
  1340. group.src.sin6.sin6_addr = ipv6_hdr(skb)->saddr;
  1341. break;
  1342. #endif
  1343. default:
  1344. return NULL;
  1345. }
  1346. mdb_entry = vxlan_mdb_entry_lookup(vxlan, &group);
  1347. if (mdb_entry)
  1348. return mdb_entry;
  1349. memset(&group.src, 0, sizeof(group.src));
  1350. mdb_entry = vxlan_mdb_entry_lookup(vxlan, &group);
  1351. if (mdb_entry)
  1352. return mdb_entry;
  1353. /* No (S, G) or (*, G) found. Look up the all-zeros entry, but only if
  1354. * the destination IP address is not link-local multicast since we want
  1355. * to transmit such traffic together with broadcast and unknown unicast
  1356. * traffic.
  1357. */
  1358. switch (skb->protocol) {
  1359. case htons(ETH_P_IP):
  1360. if (ipv4_is_local_multicast(group.dst.sin.sin_addr.s_addr))
  1361. return NULL;
  1362. group.dst.sin.sin_addr.s_addr = 0;
  1363. break;
  1364. #if IS_ENABLED(CONFIG_IPV6)
  1365. case htons(ETH_P_IPV6):
  1366. if (ipv6_addr_type(&group.dst.sin6.sin6_addr) &
  1367. IPV6_ADDR_LINKLOCAL)
  1368. return NULL;
  1369. memset(&group.dst.sin6.sin6_addr, 0,
  1370. sizeof(group.dst.sin6.sin6_addr));
  1371. break;
  1372. #endif
  1373. default:
  1374. return NULL;
  1375. }
  1376. return vxlan_mdb_entry_lookup(vxlan, &group);
  1377. }
  1378. netdev_tx_t vxlan_mdb_xmit(struct vxlan_dev *vxlan,
  1379. const struct vxlan_mdb_entry *mdb_entry,
  1380. struct sk_buff *skb)
  1381. {
  1382. struct vxlan_mdb_remote *remote, *fremote = NULL;
  1383. __be32 src_vni = mdb_entry->key.vni;
  1384. list_for_each_entry_rcu(remote, &mdb_entry->remotes, list) {
  1385. struct sk_buff *skb1;
  1386. if ((vxlan_mdb_is_star_g(&mdb_entry->key) &&
  1387. READ_ONCE(remote->filter_mode) == MCAST_INCLUDE) ||
  1388. (READ_ONCE(remote->flags) & VXLAN_MDB_REMOTE_F_BLOCKED))
  1389. continue;
  1390. if (!fremote) {
  1391. fremote = remote;
  1392. continue;
  1393. }
  1394. skb1 = skb_clone(skb, GFP_ATOMIC);
  1395. if (skb1)
  1396. vxlan_xmit_one(skb1, vxlan->dev, src_vni,
  1397. rcu_dereference(remote->rd), false);
  1398. }
  1399. if (fremote)
  1400. vxlan_xmit_one(skb, vxlan->dev, src_vni,
  1401. rcu_dereference(fremote->rd), false);
  1402. else
  1403. kfree_skb_reason(skb, SKB_DROP_REASON_NO_TX_TARGET);
  1404. return NETDEV_TX_OK;
  1405. }
  1406. static void vxlan_mdb_check_empty(void *ptr, void *arg)
  1407. {
  1408. WARN_ON_ONCE(1);
  1409. }
  1410. int vxlan_mdb_init(struct vxlan_dev *vxlan)
  1411. {
  1412. int err;
  1413. err = rhashtable_init(&vxlan->mdb_tbl, &vxlan_mdb_rht_params);
  1414. if (err)
  1415. return err;
  1416. INIT_HLIST_HEAD(&vxlan->mdb_list);
  1417. return 0;
  1418. }
  1419. void vxlan_mdb_fini(struct vxlan_dev *vxlan)
  1420. {
  1421. struct vxlan_mdb_flush_desc desc = {};
  1422. vxlan_mdb_flush(vxlan, &desc);
  1423. WARN_ON_ONCE(vxlan->cfg.flags & VXLAN_F_MDB);
  1424. rhashtable_free_and_destroy(&vxlan->mdb_tbl, vxlan_mdb_check_empty,
  1425. NULL);
  1426. }