1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright (c) 2007-2009 Patrick McHardy <kaber@trash.net> 4 * 5 * Development of this code funded by Astaro AG (http://www.astaro.com/) 6 */ 7 8 #include <linux/module.h> 9 #include <linux/init.h> 10 #include <linux/list.h> 11 #include <linux/skbuff.h> 12 #include <linux/netlink.h> 13 #include <linux/vmalloc.h> 14 #include <linux/rhashtable.h> 15 #include <linux/audit.h> 16 #include <linux/netfilter.h> 17 #include <linux/netfilter/nfnetlink.h> 18 #include <linux/netfilter/nf_tables.h> 19 #include <net/netfilter/nf_flow_table.h> 20 #include <net/netfilter/nf_tables_core.h> 21 #include <net/netfilter/nf_tables.h> 22 #include <net/netfilter/nf_tables_offload.h> 23 #include <net/net_namespace.h> 24 #include <net/sock.h> 25 26 #define NFT_MODULE_AUTOLOAD_LIMIT (MODULE_NAME_LEN - sizeof("nft-expr-255-")) 27 28 unsigned int nf_tables_net_id __read_mostly; 29 30 static LIST_HEAD(nf_tables_expressions); 31 static LIST_HEAD(nf_tables_objects); 32 static LIST_HEAD(nf_tables_flowtables); 33 static LIST_HEAD(nf_tables_destroy_list); 34 static DEFINE_SPINLOCK(nf_tables_destroy_list_lock); 35 36 enum { 37 NFT_VALIDATE_SKIP = 0, 38 NFT_VALIDATE_NEED, 39 NFT_VALIDATE_DO, 40 }; 41 42 static struct rhltable nft_objname_ht; 43 44 static u32 nft_chain_hash(const void *data, u32 len, u32 seed); 45 static u32 nft_chain_hash_obj(const void *data, u32 len, u32 seed); 46 static int nft_chain_hash_cmp(struct rhashtable_compare_arg *, const void *); 47 48 static u32 nft_objname_hash(const void *data, u32 len, u32 seed); 49 static u32 nft_objname_hash_obj(const void *data, u32 len, u32 seed); 50 static int nft_objname_hash_cmp(struct rhashtable_compare_arg *, const void *); 51 52 static const struct rhashtable_params nft_chain_ht_params = { 53 .head_offset = offsetof(struct nft_chain, rhlhead), 54 .key_offset = offsetof(struct nft_chain, name), 55 .hashfn = nft_chain_hash, 56 .obj_hashfn = nft_chain_hash_obj, 57 .obj_cmpfn = nft_chain_hash_cmp, 58 .automatic_shrinking = true, 59 }; 60 61 static const struct rhashtable_params nft_objname_ht_params = { 62 .head_offset = offsetof(struct nft_object, rhlhead), 63 .key_offset = offsetof(struct nft_object, key), 64 .hashfn = nft_objname_hash, 65 .obj_hashfn = nft_objname_hash_obj, 66 .obj_cmpfn = nft_objname_hash_cmp, 67 .automatic_shrinking = true, 68 }; 69 70 struct nft_audit_data { 71 struct nft_table *table; 72 int entries; 73 int op; 74 struct list_head list; 75 }; 76 77 static const u8 nft2audit_op[NFT_MSG_MAX] = { // enum nf_tables_msg_types 78 [NFT_MSG_NEWTABLE] = AUDIT_NFT_OP_TABLE_REGISTER, 79 [NFT_MSG_GETTABLE] = AUDIT_NFT_OP_INVALID, 80 [NFT_MSG_DELTABLE] = AUDIT_NFT_OP_TABLE_UNREGISTER, 81 [NFT_MSG_NEWCHAIN] = AUDIT_NFT_OP_CHAIN_REGISTER, 82 [NFT_MSG_GETCHAIN] = AUDIT_NFT_OP_INVALID, 83 [NFT_MSG_DELCHAIN] = AUDIT_NFT_OP_CHAIN_UNREGISTER, 84 [NFT_MSG_NEWRULE] = AUDIT_NFT_OP_RULE_REGISTER, 85 [NFT_MSG_GETRULE] = AUDIT_NFT_OP_INVALID, 86 [NFT_MSG_DELRULE] = AUDIT_NFT_OP_RULE_UNREGISTER, 87 [NFT_MSG_NEWSET] = AUDIT_NFT_OP_SET_REGISTER, 88 [NFT_MSG_GETSET] = AUDIT_NFT_OP_INVALID, 89 [NFT_MSG_DELSET] = AUDIT_NFT_OP_SET_UNREGISTER, 90 [NFT_MSG_NEWSETELEM] = AUDIT_NFT_OP_SETELEM_REGISTER, 91 [NFT_MSG_GETSETELEM] = AUDIT_NFT_OP_INVALID, 92 [NFT_MSG_DELSETELEM] = AUDIT_NFT_OP_SETELEM_UNREGISTER, 93 [NFT_MSG_NEWGEN] = AUDIT_NFT_OP_GEN_REGISTER, 94 [NFT_MSG_GETGEN] = AUDIT_NFT_OP_INVALID, 95 [NFT_MSG_TRACE] = AUDIT_NFT_OP_INVALID, 96 [NFT_MSG_NEWOBJ] = AUDIT_NFT_OP_OBJ_REGISTER, 97 [NFT_MSG_GETOBJ] = AUDIT_NFT_OP_INVALID, 98 [NFT_MSG_DELOBJ] = AUDIT_NFT_OP_OBJ_UNREGISTER, 99 [NFT_MSG_GETOBJ_RESET] = AUDIT_NFT_OP_OBJ_RESET, 100 [NFT_MSG_NEWFLOWTABLE] = AUDIT_NFT_OP_FLOWTABLE_REGISTER, 101 [NFT_MSG_GETFLOWTABLE] = AUDIT_NFT_OP_INVALID, 102 [NFT_MSG_DELFLOWTABLE] = AUDIT_NFT_OP_FLOWTABLE_UNREGISTER, 103 }; 104 105 static void nft_validate_state_update(struct net *net, u8 new_validate_state) 106 { 107 struct nftables_pernet *nft_net = nft_pernet(net); 108 109 switch (nft_net->validate_state) { 110 case NFT_VALIDATE_SKIP: 111 WARN_ON_ONCE(new_validate_state == NFT_VALIDATE_DO); 112 break; 113 case NFT_VALIDATE_NEED: 114 break; 115 case NFT_VALIDATE_DO: 116 if (new_validate_state == NFT_VALIDATE_NEED) 117 return; 118 } 119 120 nft_net->validate_state = new_validate_state; 121 } 122 static void nf_tables_trans_destroy_work(struct work_struct *w); 123 static DECLARE_WORK(trans_destroy_work, nf_tables_trans_destroy_work); 124 125 static void nft_ctx_init(struct nft_ctx *ctx, 126 struct net *net, 127 const struct sk_buff *skb, 128 const struct nlmsghdr *nlh, 129 u8 family, 130 struct nft_table *table, 131 struct nft_chain *chain, 132 const struct nlattr * const *nla) 133 { 134 ctx->net = net; 135 ctx->family = family; 136 ctx->level = 0; 137 ctx->table = table; 138 ctx->chain = chain; 139 ctx->nla = nla; 140 ctx->portid = NETLINK_CB(skb).portid; 141 ctx->report = nlmsg_report(nlh); 142 ctx->flags = nlh->nlmsg_flags; 143 ctx->seq = nlh->nlmsg_seq; 144 } 145 146 static struct nft_trans *nft_trans_alloc_gfp(const struct nft_ctx *ctx, 147 int msg_type, u32 size, gfp_t gfp) 148 { 149 struct nft_trans *trans; 150 151 trans = kzalloc(sizeof(struct nft_trans) + size, gfp); 152 if (trans == NULL) 153 return NULL; 154 155 INIT_LIST_HEAD(&trans->list); 156 trans->msg_type = msg_type; 157 trans->ctx = *ctx; 158 159 return trans; 160 } 161 162 static struct nft_trans *nft_trans_alloc(const struct nft_ctx *ctx, 163 int msg_type, u32 size) 164 { 165 return nft_trans_alloc_gfp(ctx, msg_type, size, GFP_KERNEL); 166 } 167 168 static void nft_trans_destroy(struct nft_trans *trans) 169 { 170 list_del(&trans->list); 171 kfree(trans); 172 } 173 174 static void nft_set_trans_bind(const struct nft_ctx *ctx, struct nft_set *set) 175 { 176 struct nftables_pernet *nft_net; 177 struct net *net = ctx->net; 178 struct nft_trans *trans; 179 180 if (!nft_set_is_anonymous(set)) 181 return; 182 183 nft_net = nft_pernet(net); 184 list_for_each_entry_reverse(trans, &nft_net->commit_list, list) { 185 switch (trans->msg_type) { 186 case NFT_MSG_NEWSET: 187 if (nft_trans_set(trans) == set) 188 nft_trans_set_bound(trans) = true; 189 break; 190 case NFT_MSG_NEWSETELEM: 191 if (nft_trans_elem_set(trans) == set) 192 nft_trans_elem_set_bound(trans) = true; 193 break; 194 } 195 } 196 } 197 198 static int nft_netdev_register_hooks(struct net *net, 199 struct list_head *hook_list) 200 { 201 struct nft_hook *hook; 202 int err, j; 203 204 j = 0; 205 list_for_each_entry(hook, hook_list, list) { 206 err = nf_register_net_hook(net, &hook->ops); 207 if (err < 0) 208 goto err_register; 209 210 j++; 211 } 212 return 0; 213 214 err_register: 215 list_for_each_entry(hook, hook_list, list) { 216 if (j-- <= 0) 217 break; 218 219 nf_unregister_net_hook(net, &hook->ops); 220 } 221 return err; 222 } 223 224 static void nft_netdev_unregister_hooks(struct net *net, 225 struct list_head *hook_list, 226 bool release_netdev) 227 { 228 struct nft_hook *hook, *next; 229 230 list_for_each_entry_safe(hook, next, hook_list, list) { 231 nf_unregister_net_hook(net, &hook->ops); 232 if (release_netdev) { 233 list_del(&hook->list); 234 kfree_rcu(hook, rcu); 235 } 236 } 237 } 238 239 static int nf_tables_register_hook(struct net *net, 240 const struct nft_table *table, 241 struct nft_chain *chain) 242 { 243 struct nft_base_chain *basechain; 244 const struct nf_hook_ops *ops; 245 246 if (table->flags & NFT_TABLE_F_DORMANT || 247 !nft_is_base_chain(chain)) 248 return 0; 249 250 basechain = nft_base_chain(chain); 251 ops = &basechain->ops; 252 253 if (basechain->type->ops_register) 254 return basechain->type->ops_register(net, ops); 255 256 if (nft_base_chain_netdev(table->family, basechain->ops.hooknum)) 257 return nft_netdev_register_hooks(net, &basechain->hook_list); 258 259 return nf_register_net_hook(net, &basechain->ops); 260 } 261 262 static void __nf_tables_unregister_hook(struct net *net, 263 const struct nft_table *table, 264 struct nft_chain *chain, 265 bool release_netdev) 266 { 267 struct nft_base_chain *basechain; 268 const struct nf_hook_ops *ops; 269 270 if (table->flags & NFT_TABLE_F_DORMANT || 271 !nft_is_base_chain(chain)) 272 return; 273 basechain = nft_base_chain(chain); 274 ops = &basechain->ops; 275 276 if (basechain->type->ops_unregister) 277 return basechain->type->ops_unregister(net, ops); 278 279 if (nft_base_chain_netdev(table->family, basechain->ops.hooknum)) 280 nft_netdev_unregister_hooks(net, &basechain->hook_list, 281 release_netdev); 282 else 283 nf_unregister_net_hook(net, &basechain->ops); 284 } 285 286 static void nf_tables_unregister_hook(struct net *net, 287 const struct nft_table *table, 288 struct nft_chain *chain) 289 { 290 return __nf_tables_unregister_hook(net, table, chain, false); 291 } 292 293 static void nft_trans_commit_list_add_tail(struct net *net, struct nft_trans *trans) 294 { 295 struct nftables_pernet *nft_net = nft_pernet(net); 296 297 list_add_tail(&trans->list, &nft_net->commit_list); 298 } 299 300 static int nft_trans_table_add(struct nft_ctx *ctx, int msg_type) 301 { 302 struct nft_trans *trans; 303 304 trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_table)); 305 if (trans == NULL) 306 return -ENOMEM; 307 308 if (msg_type == NFT_MSG_NEWTABLE) 309 nft_activate_next(ctx->net, ctx->table); 310 311 nft_trans_commit_list_add_tail(ctx->net, trans); 312 return 0; 313 } 314 315 static int nft_deltable(struct nft_ctx *ctx) 316 { 317 int err; 318 319 err = nft_trans_table_add(ctx, NFT_MSG_DELTABLE); 320 if (err < 0) 321 return err; 322 323 nft_deactivate_next(ctx->net, ctx->table); 324 return err; 325 } 326 327 static struct nft_trans *nft_trans_chain_add(struct nft_ctx *ctx, int msg_type) 328 { 329 struct nft_trans *trans; 330 331 trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_chain)); 332 if (trans == NULL) 333 return ERR_PTR(-ENOMEM); 334 335 if (msg_type == NFT_MSG_NEWCHAIN) { 336 nft_activate_next(ctx->net, ctx->chain); 337 338 if (ctx->nla[NFTA_CHAIN_ID]) { 339 nft_trans_chain_id(trans) = 340 ntohl(nla_get_be32(ctx->nla[NFTA_CHAIN_ID])); 341 } 342 } 343 344 nft_trans_commit_list_add_tail(ctx->net, trans); 345 return trans; 346 } 347 348 static int nft_delchain(struct nft_ctx *ctx) 349 { 350 struct nft_trans *trans; 351 352 trans = nft_trans_chain_add(ctx, NFT_MSG_DELCHAIN); 353 if (IS_ERR(trans)) 354 return PTR_ERR(trans); 355 356 ctx->table->use--; 357 nft_deactivate_next(ctx->net, ctx->chain); 358 359 return 0; 360 } 361 362 static void nft_rule_expr_activate(const struct nft_ctx *ctx, 363 struct nft_rule *rule) 364 { 365 struct nft_expr *expr; 366 367 expr = nft_expr_first(rule); 368 while (nft_expr_more(rule, expr)) { 369 if (expr->ops->activate) 370 expr->ops->activate(ctx, expr); 371 372 expr = nft_expr_next(expr); 373 } 374 } 375 376 static void nft_rule_expr_deactivate(const struct nft_ctx *ctx, 377 struct nft_rule *rule, 378 enum nft_trans_phase phase) 379 { 380 struct nft_expr *expr; 381 382 expr = nft_expr_first(rule); 383 while (nft_expr_more(rule, expr)) { 384 if (expr->ops->deactivate) 385 expr->ops->deactivate(ctx, expr, phase); 386 387 expr = nft_expr_next(expr); 388 } 389 } 390 391 static int 392 nf_tables_delrule_deactivate(struct nft_ctx *ctx, struct nft_rule *rule) 393 { 394 /* You cannot delete the same rule twice */ 395 if (nft_is_active_next(ctx->net, rule)) { 396 nft_deactivate_next(ctx->net, rule); 397 ctx->chain->use--; 398 return 0; 399 } 400 return -ENOENT; 401 } 402 403 static struct nft_trans *nft_trans_rule_add(struct nft_ctx *ctx, int msg_type, 404 struct nft_rule *rule) 405 { 406 struct nft_trans *trans; 407 408 trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_rule)); 409 if (trans == NULL) 410 return NULL; 411 412 if (msg_type == NFT_MSG_NEWRULE && ctx->nla[NFTA_RULE_ID] != NULL) { 413 nft_trans_rule_id(trans) = 414 ntohl(nla_get_be32(ctx->nla[NFTA_RULE_ID])); 415 } 416 nft_trans_rule(trans) = rule; 417 nft_trans_commit_list_add_tail(ctx->net, trans); 418 419 return trans; 420 } 421 422 static int nft_delrule(struct nft_ctx *ctx, struct nft_rule *rule) 423 { 424 struct nft_flow_rule *flow; 425 struct nft_trans *trans; 426 int err; 427 428 trans = nft_trans_rule_add(ctx, NFT_MSG_DELRULE, rule); 429 if (trans == NULL) 430 return -ENOMEM; 431 432 if (ctx->chain->flags & NFT_CHAIN_HW_OFFLOAD) { 433 flow = nft_flow_rule_create(ctx->net, rule); 434 if (IS_ERR(flow)) { 435 nft_trans_destroy(trans); 436 return PTR_ERR(flow); 437 } 438 439 nft_trans_flow_rule(trans) = flow; 440 } 441 442 err = nf_tables_delrule_deactivate(ctx, rule); 443 if (err < 0) { 444 nft_trans_destroy(trans); 445 return err; 446 } 447 nft_rule_expr_deactivate(ctx, rule, NFT_TRANS_PREPARE); 448 449 return 0; 450 } 451 452 static int nft_delrule_by_chain(struct nft_ctx *ctx) 453 { 454 struct nft_rule *rule; 455 int err; 456 457 list_for_each_entry(rule, &ctx->chain->rules, list) { 458 if (!nft_is_active_next(ctx->net, rule)) 459 continue; 460 461 err = nft_delrule(ctx, rule); 462 if (err < 0) 463 return err; 464 } 465 return 0; 466 } 467 468 static int __nft_trans_set_add(const struct nft_ctx *ctx, int msg_type, 469 struct nft_set *set, 470 const struct nft_set_desc *desc) 471 { 472 struct nft_trans *trans; 473 474 trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_set)); 475 if (trans == NULL) 476 return -ENOMEM; 477 478 if (msg_type == NFT_MSG_NEWSET && ctx->nla[NFTA_SET_ID] && !desc) { 479 nft_trans_set_id(trans) = 480 ntohl(nla_get_be32(ctx->nla[NFTA_SET_ID])); 481 nft_activate_next(ctx->net, set); 482 } 483 nft_trans_set(trans) = set; 484 if (desc) { 485 nft_trans_set_update(trans) = true; 486 nft_trans_set_gc_int(trans) = desc->gc_int; 487 nft_trans_set_timeout(trans) = desc->timeout; 488 } 489 nft_trans_commit_list_add_tail(ctx->net, trans); 490 491 return 0; 492 } 493 494 static int nft_trans_set_add(const struct nft_ctx *ctx, int msg_type, 495 struct nft_set *set) 496 { 497 return __nft_trans_set_add(ctx, msg_type, set, NULL); 498 } 499 500 static int nft_delset(const struct nft_ctx *ctx, struct nft_set *set) 501 { 502 int err; 503 504 err = nft_trans_set_add(ctx, NFT_MSG_DELSET, set); 505 if (err < 0) 506 return err; 507 508 nft_deactivate_next(ctx->net, set); 509 ctx->table->use--; 510 511 return err; 512 } 513 514 static int nft_trans_obj_add(struct nft_ctx *ctx, int msg_type, 515 struct nft_object *obj) 516 { 517 struct nft_trans *trans; 518 519 trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_obj)); 520 if (trans == NULL) 521 return -ENOMEM; 522 523 if (msg_type == NFT_MSG_NEWOBJ) 524 nft_activate_next(ctx->net, obj); 525 526 nft_trans_obj(trans) = obj; 527 nft_trans_commit_list_add_tail(ctx->net, trans); 528 529 return 0; 530 } 531 532 static int nft_delobj(struct nft_ctx *ctx, struct nft_object *obj) 533 { 534 int err; 535 536 err = nft_trans_obj_add(ctx, NFT_MSG_DELOBJ, obj); 537 if (err < 0) 538 return err; 539 540 nft_deactivate_next(ctx->net, obj); 541 ctx->table->use--; 542 543 return err; 544 } 545 546 static int nft_trans_flowtable_add(struct nft_ctx *ctx, int msg_type, 547 struct nft_flowtable *flowtable) 548 { 549 struct nft_trans *trans; 550 551 trans = nft_trans_alloc(ctx, msg_type, 552 sizeof(struct nft_trans_flowtable)); 553 if (trans == NULL) 554 return -ENOMEM; 555 556 if (msg_type == NFT_MSG_NEWFLOWTABLE) 557 nft_activate_next(ctx->net, flowtable); 558 559 INIT_LIST_HEAD(&nft_trans_flowtable_hooks(trans)); 560 nft_trans_flowtable(trans) = flowtable; 561 nft_trans_commit_list_add_tail(ctx->net, trans); 562 563 return 0; 564 } 565 566 static int nft_delflowtable(struct nft_ctx *ctx, 567 struct nft_flowtable *flowtable) 568 { 569 int err; 570 571 err = nft_trans_flowtable_add(ctx, NFT_MSG_DELFLOWTABLE, flowtable); 572 if (err < 0) 573 return err; 574 575 nft_deactivate_next(ctx->net, flowtable); 576 ctx->table->use--; 577 578 return err; 579 } 580 581 static void __nft_reg_track_clobber(struct nft_regs_track *track, u8 dreg) 582 { 583 int i; 584 585 for (i = track->regs[dreg].num_reg; i > 0; i--) 586 __nft_reg_track_cancel(track, dreg - i); 587 } 588 589 static void __nft_reg_track_update(struct nft_regs_track *track, 590 const struct nft_expr *expr, 591 u8 dreg, u8 num_reg) 592 { 593 track->regs[dreg].selector = expr; 594 track->regs[dreg].bitwise = NULL; 595 track->regs[dreg].num_reg = num_reg; 596 } 597 598 void nft_reg_track_update(struct nft_regs_track *track, 599 const struct nft_expr *expr, u8 dreg, u8 len) 600 { 601 unsigned int regcount; 602 int i; 603 604 __nft_reg_track_clobber(track, dreg); 605 606 regcount = DIV_ROUND_UP(len, NFT_REG32_SIZE); 607 for (i = 0; i < regcount; i++, dreg++) 608 __nft_reg_track_update(track, expr, dreg, i); 609 } 610 EXPORT_SYMBOL_GPL(nft_reg_track_update); 611 612 void nft_reg_track_cancel(struct nft_regs_track *track, u8 dreg, u8 len) 613 { 614 unsigned int regcount; 615 int i; 616 617 __nft_reg_track_clobber(track, dreg); 618 619 regcount = DIV_ROUND_UP(len, NFT_REG32_SIZE); 620 for (i = 0; i < regcount; i++, dreg++) 621 __nft_reg_track_cancel(track, dreg); 622 } 623 EXPORT_SYMBOL_GPL(nft_reg_track_cancel); 624 625 void __nft_reg_track_cancel(struct nft_regs_track *track, u8 dreg) 626 { 627 track->regs[dreg].selector = NULL; 628 track->regs[dreg].bitwise = NULL; 629 track->regs[dreg].num_reg = 0; 630 } 631 EXPORT_SYMBOL_GPL(__nft_reg_track_cancel); 632 633 /* 634 * Tables 635 */ 636 637 static struct nft_table *nft_table_lookup(const struct net *net, 638 const struct nlattr *nla, 639 u8 family, u8 genmask, u32 nlpid) 640 { 641 struct nftables_pernet *nft_net; 642 struct nft_table *table; 643 644 if (nla == NULL) 645 return ERR_PTR(-EINVAL); 646 647 nft_net = nft_pernet(net); 648 list_for_each_entry_rcu(table, &nft_net->tables, list, 649 lockdep_is_held(&nft_net->commit_mutex)) { 650 if (!nla_strcmp(nla, table->name) && 651 table->family == family && 652 nft_active_genmask(table, genmask)) { 653 if (nft_table_has_owner(table) && 654 nlpid && table->nlpid != nlpid) 655 return ERR_PTR(-EPERM); 656 657 return table; 658 } 659 } 660 661 return ERR_PTR(-ENOENT); 662 } 663 664 static struct nft_table *nft_table_lookup_byhandle(const struct net *net, 665 const struct nlattr *nla, 666 u8 genmask, u32 nlpid) 667 { 668 struct nftables_pernet *nft_net; 669 struct nft_table *table; 670 671 nft_net = nft_pernet(net); 672 list_for_each_entry(table, &nft_net->tables, list) { 673 if (be64_to_cpu(nla_get_be64(nla)) == table->handle && 674 nft_active_genmask(table, genmask)) { 675 if (nft_table_has_owner(table) && 676 nlpid && table->nlpid != nlpid) 677 return ERR_PTR(-EPERM); 678 679 return table; 680 } 681 } 682 683 return ERR_PTR(-ENOENT); 684 } 685 686 static inline u64 nf_tables_alloc_handle(struct nft_table *table) 687 { 688 return ++table->hgenerator; 689 } 690 691 static const struct nft_chain_type *chain_type[NFPROTO_NUMPROTO][NFT_CHAIN_T_MAX]; 692 693 static const struct nft_chain_type * 694 __nft_chain_type_get(u8 family, enum nft_chain_types type) 695 { 696 if (family >= NFPROTO_NUMPROTO || 697 type >= NFT_CHAIN_T_MAX) 698 return NULL; 699 700 return chain_type[family][type]; 701 } 702 703 static const struct nft_chain_type * 704 __nf_tables_chain_type_lookup(const struct nlattr *nla, u8 family) 705 { 706 const struct nft_chain_type *type; 707 int i; 708 709 for (i = 0; i < NFT_CHAIN_T_MAX; i++) { 710 type = __nft_chain_type_get(family, i); 711 if (!type) 712 continue; 713 if (!nla_strcmp(nla, type->name)) 714 return type; 715 } 716 return NULL; 717 } 718 719 struct nft_module_request { 720 struct list_head list; 721 char module[MODULE_NAME_LEN]; 722 bool done; 723 }; 724 725 #ifdef CONFIG_MODULES 726 __printf(2, 3) int nft_request_module(struct net *net, const char *fmt, 727 ...) 728 { 729 char module_name[MODULE_NAME_LEN]; 730 struct nftables_pernet *nft_net; 731 struct nft_module_request *req; 732 va_list args; 733 int ret; 734 735 va_start(args, fmt); 736 ret = vsnprintf(module_name, MODULE_NAME_LEN, fmt, args); 737 va_end(args); 738 if (ret >= MODULE_NAME_LEN) 739 return 0; 740 741 nft_net = nft_pernet(net); 742 list_for_each_entry(req, &nft_net->module_list, list) { 743 if (!strcmp(req->module, module_name)) { 744 if (req->done) 745 return 0; 746 747 /* A request to load this module already exists. */ 748 return -EAGAIN; 749 } 750 } 751 752 req = kmalloc(sizeof(*req), GFP_KERNEL); 753 if (!req) 754 return -ENOMEM; 755 756 req->done = false; 757 strscpy(req->module, module_name, MODULE_NAME_LEN); 758 list_add_tail(&req->list, &nft_net->module_list); 759 760 return -EAGAIN; 761 } 762 EXPORT_SYMBOL_GPL(nft_request_module); 763 #endif 764 765 static void lockdep_nfnl_nft_mutex_not_held(void) 766 { 767 #ifdef CONFIG_PROVE_LOCKING 768 if (debug_locks) 769 WARN_ON_ONCE(lockdep_nfnl_is_held(NFNL_SUBSYS_NFTABLES)); 770 #endif 771 } 772 773 static const struct nft_chain_type * 774 nf_tables_chain_type_lookup(struct net *net, const struct nlattr *nla, 775 u8 family, bool autoload) 776 { 777 const struct nft_chain_type *type; 778 779 type = __nf_tables_chain_type_lookup(nla, family); 780 if (type != NULL) 781 return type; 782 783 lockdep_nfnl_nft_mutex_not_held(); 784 #ifdef CONFIG_MODULES 785 if (autoload) { 786 if (nft_request_module(net, "nft-chain-%u-%.*s", family, 787 nla_len(nla), 788 (const char *)nla_data(nla)) == -EAGAIN) 789 return ERR_PTR(-EAGAIN); 790 } 791 #endif 792 return ERR_PTR(-ENOENT); 793 } 794 795 static __be16 nft_base_seq(const struct net *net) 796 { 797 struct nftables_pernet *nft_net = nft_pernet(net); 798 799 return htons(nft_net->base_seq & 0xffff); 800 } 801 802 static const struct nla_policy nft_table_policy[NFTA_TABLE_MAX + 1] = { 803 [NFTA_TABLE_NAME] = { .type = NLA_STRING, 804 .len = NFT_TABLE_MAXNAMELEN - 1 }, 805 [NFTA_TABLE_FLAGS] = { .type = NLA_U32 }, 806 [NFTA_TABLE_HANDLE] = { .type = NLA_U64 }, 807 [NFTA_TABLE_USERDATA] = { .type = NLA_BINARY, 808 .len = NFT_USERDATA_MAXLEN } 809 }; 810 811 static int nf_tables_fill_table_info(struct sk_buff *skb, struct net *net, 812 u32 portid, u32 seq, int event, u32 flags, 813 int family, const struct nft_table *table) 814 { 815 struct nlmsghdr *nlh; 816 817 event = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event); 818 nlh = nfnl_msg_put(skb, portid, seq, event, flags, family, 819 NFNETLINK_V0, nft_base_seq(net)); 820 if (!nlh) 821 goto nla_put_failure; 822 823 if (nla_put_string(skb, NFTA_TABLE_NAME, table->name) || 824 nla_put_be32(skb, NFTA_TABLE_FLAGS, 825 htonl(table->flags & NFT_TABLE_F_MASK)) || 826 nla_put_be32(skb, NFTA_TABLE_USE, htonl(table->use)) || 827 nla_put_be64(skb, NFTA_TABLE_HANDLE, cpu_to_be64(table->handle), 828 NFTA_TABLE_PAD)) 829 goto nla_put_failure; 830 if (nft_table_has_owner(table) && 831 nla_put_be32(skb, NFTA_TABLE_OWNER, htonl(table->nlpid))) 832 goto nla_put_failure; 833 834 if (table->udata) { 835 if (nla_put(skb, NFTA_TABLE_USERDATA, table->udlen, table->udata)) 836 goto nla_put_failure; 837 } 838 839 nlmsg_end(skb, nlh); 840 return 0; 841 842 nla_put_failure: 843 nlmsg_trim(skb, nlh); 844 return -1; 845 } 846 847 struct nftnl_skb_parms { 848 bool report; 849 }; 850 #define NFT_CB(skb) (*(struct nftnl_skb_parms*)&((skb)->cb)) 851 852 static void nft_notify_enqueue(struct sk_buff *skb, bool report, 853 struct list_head *notify_list) 854 { 855 NFT_CB(skb).report = report; 856 list_add_tail(&skb->list, notify_list); 857 } 858 859 static void nf_tables_table_notify(const struct nft_ctx *ctx, int event) 860 { 861 struct nftables_pernet *nft_net; 862 struct sk_buff *skb; 863 u16 flags = 0; 864 int err; 865 866 if (!ctx->report && 867 !nfnetlink_has_listeners(ctx->net, NFNLGRP_NFTABLES)) 868 return; 869 870 skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL); 871 if (skb == NULL) 872 goto err; 873 874 if (ctx->flags & (NLM_F_CREATE | NLM_F_EXCL)) 875 flags |= ctx->flags & (NLM_F_CREATE | NLM_F_EXCL); 876 877 err = nf_tables_fill_table_info(skb, ctx->net, ctx->portid, ctx->seq, 878 event, flags, ctx->family, ctx->table); 879 if (err < 0) { 880 kfree_skb(skb); 881 goto err; 882 } 883 884 nft_net = nft_pernet(ctx->net); 885 nft_notify_enqueue(skb, ctx->report, &nft_net->notify_list); 886 return; 887 err: 888 nfnetlink_set_err(ctx->net, ctx->portid, NFNLGRP_NFTABLES, -ENOBUFS); 889 } 890 891 static int nf_tables_dump_tables(struct sk_buff *skb, 892 struct netlink_callback *cb) 893 { 894 const struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh); 895 struct nftables_pernet *nft_net; 896 const struct nft_table *table; 897 unsigned int idx = 0, s_idx = cb->args[0]; 898 struct net *net = sock_net(skb->sk); 899 int family = nfmsg->nfgen_family; 900 901 rcu_read_lock(); 902 nft_net = nft_pernet(net); 903 cb->seq = READ_ONCE(nft_net->base_seq); 904 905 list_for_each_entry_rcu(table, &nft_net->tables, list) { 906 if (family != NFPROTO_UNSPEC && family != table->family) 907 continue; 908 909 if (idx < s_idx) 910 goto cont; 911 if (idx > s_idx) 912 memset(&cb->args[1], 0, 913 sizeof(cb->args) - sizeof(cb->args[0])); 914 if (!nft_is_active(net, table)) 915 continue; 916 if (nf_tables_fill_table_info(skb, net, 917 NETLINK_CB(cb->skb).portid, 918 cb->nlh->nlmsg_seq, 919 NFT_MSG_NEWTABLE, NLM_F_MULTI, 920 table->family, table) < 0) 921 goto done; 922 923 nl_dump_check_consistent(cb, nlmsg_hdr(skb)); 924 cont: 925 idx++; 926 } 927 done: 928 rcu_read_unlock(); 929 cb->args[0] = idx; 930 return skb->len; 931 } 932 933 static int nft_netlink_dump_start_rcu(struct sock *nlsk, struct sk_buff *skb, 934 const struct nlmsghdr *nlh, 935 struct netlink_dump_control *c) 936 { 937 int err; 938 939 if (!try_module_get(THIS_MODULE)) 940 return -EINVAL; 941 942 rcu_read_unlock(); 943 err = netlink_dump_start(nlsk, skb, nlh, c); 944 rcu_read_lock(); 945 module_put(THIS_MODULE); 946 947 return err; 948 } 949 950 /* called with rcu_read_lock held */ 951 static int nf_tables_gettable(struct sk_buff *skb, const struct nfnl_info *info, 952 const struct nlattr * const nla[]) 953 { 954 struct netlink_ext_ack *extack = info->extack; 955 u8 genmask = nft_genmask_cur(info->net); 956 u8 family = info->nfmsg->nfgen_family; 957 const struct nft_table *table; 958 struct net *net = info->net; 959 struct sk_buff *skb2; 960 int err; 961 962 if (info->nlh->nlmsg_flags & NLM_F_DUMP) { 963 struct netlink_dump_control c = { 964 .dump = nf_tables_dump_tables, 965 .module = THIS_MODULE, 966 }; 967 968 return nft_netlink_dump_start_rcu(info->sk, skb, info->nlh, &c); 969 } 970 971 table = nft_table_lookup(net, nla[NFTA_TABLE_NAME], family, genmask, 0); 972 if (IS_ERR(table)) { 973 NL_SET_BAD_ATTR(extack, nla[NFTA_TABLE_NAME]); 974 return PTR_ERR(table); 975 } 976 977 skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC); 978 if (!skb2) 979 return -ENOMEM; 980 981 err = nf_tables_fill_table_info(skb2, net, NETLINK_CB(skb).portid, 982 info->nlh->nlmsg_seq, NFT_MSG_NEWTABLE, 983 0, family, table); 984 if (err < 0) 985 goto err_fill_table_info; 986 987 return nfnetlink_unicast(skb2, net, NETLINK_CB(skb).portid); 988 989 err_fill_table_info: 990 kfree_skb(skb2); 991 return err; 992 } 993 994 static void nft_table_disable(struct net *net, struct nft_table *table, u32 cnt) 995 { 996 struct nft_chain *chain; 997 u32 i = 0; 998 999 list_for_each_entry(chain, &table->chains, list) { 1000 if (!nft_is_active_next(net, chain)) 1001 continue; 1002 if (!nft_is_base_chain(chain)) 1003 continue; 1004 1005 if (cnt && i++ == cnt) 1006 break; 1007 1008 nf_tables_unregister_hook(net, table, chain); 1009 } 1010 } 1011 1012 static int nf_tables_table_enable(struct net *net, struct nft_table *table) 1013 { 1014 struct nft_chain *chain; 1015 int err, i = 0; 1016 1017 list_for_each_entry(chain, &table->chains, list) { 1018 if (!nft_is_active_next(net, chain)) 1019 continue; 1020 if (!nft_is_base_chain(chain)) 1021 continue; 1022 1023 err = nf_tables_register_hook(net, table, chain); 1024 if (err < 0) 1025 goto err_register_hooks; 1026 1027 i++; 1028 } 1029 return 0; 1030 1031 err_register_hooks: 1032 if (i) 1033 nft_table_disable(net, table, i); 1034 return err; 1035 } 1036 1037 static void nf_tables_table_disable(struct net *net, struct nft_table *table) 1038 { 1039 table->flags &= ~NFT_TABLE_F_DORMANT; 1040 nft_table_disable(net, table, 0); 1041 table->flags |= NFT_TABLE_F_DORMANT; 1042 } 1043 1044 #define __NFT_TABLE_F_INTERNAL (NFT_TABLE_F_MASK + 1) 1045 #define __NFT_TABLE_F_WAS_DORMANT (__NFT_TABLE_F_INTERNAL << 0) 1046 #define __NFT_TABLE_F_WAS_AWAKEN (__NFT_TABLE_F_INTERNAL << 1) 1047 #define __NFT_TABLE_F_UPDATE (__NFT_TABLE_F_WAS_DORMANT | \ 1048 __NFT_TABLE_F_WAS_AWAKEN) 1049 1050 static int nf_tables_updtable(struct nft_ctx *ctx) 1051 { 1052 struct nft_trans *trans; 1053 u32 flags; 1054 int ret; 1055 1056 if (!ctx->nla[NFTA_TABLE_FLAGS]) 1057 return 0; 1058 1059 flags = ntohl(nla_get_be32(ctx->nla[NFTA_TABLE_FLAGS])); 1060 if (flags & ~NFT_TABLE_F_MASK) 1061 return -EOPNOTSUPP; 1062 1063 if (flags == ctx->table->flags) 1064 return 0; 1065 1066 if ((nft_table_has_owner(ctx->table) && 1067 !(flags & NFT_TABLE_F_OWNER)) || 1068 (!nft_table_has_owner(ctx->table) && 1069 flags & NFT_TABLE_F_OWNER)) 1070 return -EOPNOTSUPP; 1071 1072 trans = nft_trans_alloc(ctx, NFT_MSG_NEWTABLE, 1073 sizeof(struct nft_trans_table)); 1074 if (trans == NULL) 1075 return -ENOMEM; 1076 1077 if ((flags & NFT_TABLE_F_DORMANT) && 1078 !(ctx->table->flags & NFT_TABLE_F_DORMANT)) { 1079 ctx->table->flags |= NFT_TABLE_F_DORMANT; 1080 if (!(ctx->table->flags & __NFT_TABLE_F_UPDATE)) 1081 ctx->table->flags |= __NFT_TABLE_F_WAS_AWAKEN; 1082 } else if (!(flags & NFT_TABLE_F_DORMANT) && 1083 ctx->table->flags & NFT_TABLE_F_DORMANT) { 1084 ctx->table->flags &= ~NFT_TABLE_F_DORMANT; 1085 if (!(ctx->table->flags & __NFT_TABLE_F_UPDATE)) { 1086 ret = nf_tables_table_enable(ctx->net, ctx->table); 1087 if (ret < 0) 1088 goto err_register_hooks; 1089 1090 ctx->table->flags |= __NFT_TABLE_F_WAS_DORMANT; 1091 } 1092 } 1093 1094 nft_trans_table_update(trans) = true; 1095 nft_trans_commit_list_add_tail(ctx->net, trans); 1096 1097 return 0; 1098 1099 err_register_hooks: 1100 nft_trans_destroy(trans); 1101 return ret; 1102 } 1103 1104 static u32 nft_chain_hash(const void *data, u32 len, u32 seed) 1105 { 1106 const char *name = data; 1107 1108 return jhash(name, strlen(name), seed); 1109 } 1110 1111 static u32 nft_chain_hash_obj(const void *data, u32 len, u32 seed) 1112 { 1113 const struct nft_chain *chain = data; 1114 1115 return nft_chain_hash(chain->name, 0, seed); 1116 } 1117 1118 static int nft_chain_hash_cmp(struct rhashtable_compare_arg *arg, 1119 const void *ptr) 1120 { 1121 const struct nft_chain *chain = ptr; 1122 const char *name = arg->key; 1123 1124 return strcmp(chain->name, name); 1125 } 1126 1127 static u32 nft_objname_hash(const void *data, u32 len, u32 seed) 1128 { 1129 const struct nft_object_hash_key *k = data; 1130 1131 seed ^= hash_ptr(k->table, 32); 1132 1133 return jhash(k->name, strlen(k->name), seed); 1134 } 1135 1136 static u32 nft_objname_hash_obj(const void *data, u32 len, u32 seed) 1137 { 1138 const struct nft_object *obj = data; 1139 1140 return nft_objname_hash(&obj->key, 0, seed); 1141 } 1142 1143 static int nft_objname_hash_cmp(struct rhashtable_compare_arg *arg, 1144 const void *ptr) 1145 { 1146 const struct nft_object_hash_key *k = arg->key; 1147 const struct nft_object *obj = ptr; 1148 1149 if (obj->key.table != k->table) 1150 return -1; 1151 1152 return strcmp(obj->key.name, k->name); 1153 } 1154 1155 static bool nft_supported_family(u8 family) 1156 { 1157 return false 1158 #ifdef CONFIG_NF_TABLES_INET 1159 || family == NFPROTO_INET 1160 #endif 1161 #ifdef CONFIG_NF_TABLES_IPV4 1162 || family == NFPROTO_IPV4 1163 #endif 1164 #ifdef CONFIG_NF_TABLES_ARP 1165 || family == NFPROTO_ARP 1166 #endif 1167 #ifdef CONFIG_NF_TABLES_NETDEV 1168 || family == NFPROTO_NETDEV 1169 #endif 1170 #if IS_ENABLED(CONFIG_NF_TABLES_BRIDGE) 1171 || family == NFPROTO_BRIDGE 1172 #endif 1173 #ifdef CONFIG_NF_TABLES_IPV6 1174 || family == NFPROTO_IPV6 1175 #endif 1176 ; 1177 } 1178 1179 static int nf_tables_newtable(struct sk_buff *skb, const struct nfnl_info *info, 1180 const struct nlattr * const nla[]) 1181 { 1182 struct nftables_pernet *nft_net = nft_pernet(info->net); 1183 struct netlink_ext_ack *extack = info->extack; 1184 u8 genmask = nft_genmask_next(info->net); 1185 u8 family = info->nfmsg->nfgen_family; 1186 struct net *net = info->net; 1187 const struct nlattr *attr; 1188 struct nft_table *table; 1189 struct nft_ctx ctx; 1190 u32 flags = 0; 1191 int err; 1192 1193 if (!nft_supported_family(family)) 1194 return -EOPNOTSUPP; 1195 1196 lockdep_assert_held(&nft_net->commit_mutex); 1197 attr = nla[NFTA_TABLE_NAME]; 1198 table = nft_table_lookup(net, attr, family, genmask, 1199 NETLINK_CB(skb).portid); 1200 if (IS_ERR(table)) { 1201 if (PTR_ERR(table) != -ENOENT) 1202 return PTR_ERR(table); 1203 } else { 1204 if (info->nlh->nlmsg_flags & NLM_F_EXCL) { 1205 NL_SET_BAD_ATTR(extack, attr); 1206 return -EEXIST; 1207 } 1208 if (info->nlh->nlmsg_flags & NLM_F_REPLACE) 1209 return -EOPNOTSUPP; 1210 1211 nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla); 1212 1213 return nf_tables_updtable(&ctx); 1214 } 1215 1216 if (nla[NFTA_TABLE_FLAGS]) { 1217 flags = ntohl(nla_get_be32(nla[NFTA_TABLE_FLAGS])); 1218 if (flags & ~NFT_TABLE_F_MASK) 1219 return -EOPNOTSUPP; 1220 } 1221 1222 err = -ENOMEM; 1223 table = kzalloc(sizeof(*table), GFP_KERNEL_ACCOUNT); 1224 if (table == NULL) 1225 goto err_kzalloc; 1226 1227 table->name = nla_strdup(attr, GFP_KERNEL_ACCOUNT); 1228 if (table->name == NULL) 1229 goto err_strdup; 1230 1231 if (nla[NFTA_TABLE_USERDATA]) { 1232 table->udata = nla_memdup(nla[NFTA_TABLE_USERDATA], GFP_KERNEL_ACCOUNT); 1233 if (table->udata == NULL) 1234 goto err_table_udata; 1235 1236 table->udlen = nla_len(nla[NFTA_TABLE_USERDATA]); 1237 } 1238 1239 err = rhltable_init(&table->chains_ht, &nft_chain_ht_params); 1240 if (err) 1241 goto err_chain_ht; 1242 1243 INIT_LIST_HEAD(&table->chains); 1244 INIT_LIST_HEAD(&table->sets); 1245 INIT_LIST_HEAD(&table->objects); 1246 INIT_LIST_HEAD(&table->flowtables); 1247 table->family = family; 1248 table->flags = flags; 1249 table->handle = ++nft_net->table_handle; 1250 if (table->flags & NFT_TABLE_F_OWNER) 1251 table->nlpid = NETLINK_CB(skb).portid; 1252 1253 nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla); 1254 err = nft_trans_table_add(&ctx, NFT_MSG_NEWTABLE); 1255 if (err < 0) 1256 goto err_trans; 1257 1258 list_add_tail_rcu(&table->list, &nft_net->tables); 1259 return 0; 1260 err_trans: 1261 rhltable_destroy(&table->chains_ht); 1262 err_chain_ht: 1263 kfree(table->udata); 1264 err_table_udata: 1265 kfree(table->name); 1266 err_strdup: 1267 kfree(table); 1268 err_kzalloc: 1269 return err; 1270 } 1271 1272 static int nft_flush_table(struct nft_ctx *ctx) 1273 { 1274 struct nft_flowtable *flowtable, *nft; 1275 struct nft_chain *chain, *nc; 1276 struct nft_object *obj, *ne; 1277 struct nft_set *set, *ns; 1278 int err; 1279 1280 list_for_each_entry(chain, &ctx->table->chains, list) { 1281 if (!nft_is_active_next(ctx->net, chain)) 1282 continue; 1283 1284 if (nft_chain_is_bound(chain)) 1285 continue; 1286 1287 ctx->chain = chain; 1288 1289 err = nft_delrule_by_chain(ctx); 1290 if (err < 0) 1291 goto out; 1292 } 1293 1294 list_for_each_entry_safe(set, ns, &ctx->table->sets, list) { 1295 if (!nft_is_active_next(ctx->net, set)) 1296 continue; 1297 1298 if (nft_set_is_anonymous(set) && 1299 !list_empty(&set->bindings)) 1300 continue; 1301 1302 err = nft_delset(ctx, set); 1303 if (err < 0) 1304 goto out; 1305 } 1306 1307 list_for_each_entry_safe(flowtable, nft, &ctx->table->flowtables, list) { 1308 if (!nft_is_active_next(ctx->net, flowtable)) 1309 continue; 1310 1311 err = nft_delflowtable(ctx, flowtable); 1312 if (err < 0) 1313 goto out; 1314 } 1315 1316 list_for_each_entry_safe(obj, ne, &ctx->table->objects, list) { 1317 if (!nft_is_active_next(ctx->net, obj)) 1318 continue; 1319 1320 err = nft_delobj(ctx, obj); 1321 if (err < 0) 1322 goto out; 1323 } 1324 1325 list_for_each_entry_safe(chain, nc, &ctx->table->chains, list) { 1326 if (!nft_is_active_next(ctx->net, chain)) 1327 continue; 1328 1329 if (nft_chain_is_bound(chain)) 1330 continue; 1331 1332 ctx->chain = chain; 1333 1334 err = nft_delchain(ctx); 1335 if (err < 0) 1336 goto out; 1337 } 1338 1339 err = nft_deltable(ctx); 1340 out: 1341 return err; 1342 } 1343 1344 static int nft_flush(struct nft_ctx *ctx, int family) 1345 { 1346 struct nftables_pernet *nft_net = nft_pernet(ctx->net); 1347 const struct nlattr * const *nla = ctx->nla; 1348 struct nft_table *table, *nt; 1349 int err = 0; 1350 1351 list_for_each_entry_safe(table, nt, &nft_net->tables, list) { 1352 if (family != AF_UNSPEC && table->family != family) 1353 continue; 1354 1355 ctx->family = table->family; 1356 1357 if (!nft_is_active_next(ctx->net, table)) 1358 continue; 1359 1360 if (nft_table_has_owner(table) && table->nlpid != ctx->portid) 1361 continue; 1362 1363 if (nla[NFTA_TABLE_NAME] && 1364 nla_strcmp(nla[NFTA_TABLE_NAME], table->name) != 0) 1365 continue; 1366 1367 ctx->table = table; 1368 1369 err = nft_flush_table(ctx); 1370 if (err < 0) 1371 goto out; 1372 } 1373 out: 1374 return err; 1375 } 1376 1377 static int nf_tables_deltable(struct sk_buff *skb, const struct nfnl_info *info, 1378 const struct nlattr * const nla[]) 1379 { 1380 struct netlink_ext_ack *extack = info->extack; 1381 u8 genmask = nft_genmask_next(info->net); 1382 u8 family = info->nfmsg->nfgen_family; 1383 struct net *net = info->net; 1384 const struct nlattr *attr; 1385 struct nft_table *table; 1386 struct nft_ctx ctx; 1387 1388 nft_ctx_init(&ctx, net, skb, info->nlh, 0, NULL, NULL, nla); 1389 if (family == AF_UNSPEC || 1390 (!nla[NFTA_TABLE_NAME] && !nla[NFTA_TABLE_HANDLE])) 1391 return nft_flush(&ctx, family); 1392 1393 if (nla[NFTA_TABLE_HANDLE]) { 1394 attr = nla[NFTA_TABLE_HANDLE]; 1395 table = nft_table_lookup_byhandle(net, attr, genmask, 1396 NETLINK_CB(skb).portid); 1397 } else { 1398 attr = nla[NFTA_TABLE_NAME]; 1399 table = nft_table_lookup(net, attr, family, genmask, 1400 NETLINK_CB(skb).portid); 1401 } 1402 1403 if (IS_ERR(table)) { 1404 NL_SET_BAD_ATTR(extack, attr); 1405 return PTR_ERR(table); 1406 } 1407 1408 if (info->nlh->nlmsg_flags & NLM_F_NONREC && 1409 table->use > 0) 1410 return -EBUSY; 1411 1412 ctx.family = family; 1413 ctx.table = table; 1414 1415 return nft_flush_table(&ctx); 1416 } 1417 1418 static void nf_tables_table_destroy(struct nft_ctx *ctx) 1419 { 1420 if (WARN_ON(ctx->table->use > 0)) 1421 return; 1422 1423 rhltable_destroy(&ctx->table->chains_ht); 1424 kfree(ctx->table->name); 1425 kfree(ctx->table->udata); 1426 kfree(ctx->table); 1427 } 1428 1429 void nft_register_chain_type(const struct nft_chain_type *ctype) 1430 { 1431 nfnl_lock(NFNL_SUBSYS_NFTABLES); 1432 if (WARN_ON(__nft_chain_type_get(ctype->family, ctype->type))) { 1433 nfnl_unlock(NFNL_SUBSYS_NFTABLES); 1434 return; 1435 } 1436 chain_type[ctype->family][ctype->type] = ctype; 1437 nfnl_unlock(NFNL_SUBSYS_NFTABLES); 1438 } 1439 EXPORT_SYMBOL_GPL(nft_register_chain_type); 1440 1441 void nft_unregister_chain_type(const struct nft_chain_type *ctype) 1442 { 1443 nfnl_lock(NFNL_SUBSYS_NFTABLES); 1444 chain_type[ctype->family][ctype->type] = NULL; 1445 nfnl_unlock(NFNL_SUBSYS_NFTABLES); 1446 } 1447 EXPORT_SYMBOL_GPL(nft_unregister_chain_type); 1448 1449 /* 1450 * Chains 1451 */ 1452 1453 static struct nft_chain * 1454 nft_chain_lookup_byhandle(const struct nft_table *table, u64 handle, u8 genmask) 1455 { 1456 struct nft_chain *chain; 1457 1458 list_for_each_entry(chain, &table->chains, list) { 1459 if (chain->handle == handle && 1460 nft_active_genmask(chain, genmask)) 1461 return chain; 1462 } 1463 1464 return ERR_PTR(-ENOENT); 1465 } 1466 1467 static bool lockdep_commit_lock_is_held(const struct net *net) 1468 { 1469 #ifdef CONFIG_PROVE_LOCKING 1470 struct nftables_pernet *nft_net = nft_pernet(net); 1471 1472 return lockdep_is_held(&nft_net->commit_mutex); 1473 #else 1474 return true; 1475 #endif 1476 } 1477 1478 static struct nft_chain *nft_chain_lookup(struct net *net, 1479 struct nft_table *table, 1480 const struct nlattr *nla, u8 genmask) 1481 { 1482 char search[NFT_CHAIN_MAXNAMELEN + 1]; 1483 struct rhlist_head *tmp, *list; 1484 struct nft_chain *chain; 1485 1486 if (nla == NULL) 1487 return ERR_PTR(-EINVAL); 1488 1489 nla_strscpy(search, nla, sizeof(search)); 1490 1491 WARN_ON(!rcu_read_lock_held() && 1492 !lockdep_commit_lock_is_held(net)); 1493 1494 chain = ERR_PTR(-ENOENT); 1495 rcu_read_lock(); 1496 list = rhltable_lookup(&table->chains_ht, search, nft_chain_ht_params); 1497 if (!list) 1498 goto out_unlock; 1499 1500 rhl_for_each_entry_rcu(chain, tmp, list, rhlhead) { 1501 if (nft_active_genmask(chain, genmask)) 1502 goto out_unlock; 1503 } 1504 chain = ERR_PTR(-ENOENT); 1505 out_unlock: 1506 rcu_read_unlock(); 1507 return chain; 1508 } 1509 1510 static const struct nla_policy nft_chain_policy[NFTA_CHAIN_MAX + 1] = { 1511 [NFTA_CHAIN_TABLE] = { .type = NLA_STRING, 1512 .len = NFT_TABLE_MAXNAMELEN - 1 }, 1513 [NFTA_CHAIN_HANDLE] = { .type = NLA_U64 }, 1514 [NFTA_CHAIN_NAME] = { .type = NLA_STRING, 1515 .len = NFT_CHAIN_MAXNAMELEN - 1 }, 1516 [NFTA_CHAIN_HOOK] = { .type = NLA_NESTED }, 1517 [NFTA_CHAIN_POLICY] = { .type = NLA_U32 }, 1518 [NFTA_CHAIN_TYPE] = { .type = NLA_STRING, 1519 .len = NFT_MODULE_AUTOLOAD_LIMIT }, 1520 [NFTA_CHAIN_COUNTERS] = { .type = NLA_NESTED }, 1521 [NFTA_CHAIN_FLAGS] = { .type = NLA_U32 }, 1522 [NFTA_CHAIN_ID] = { .type = NLA_U32 }, 1523 [NFTA_CHAIN_USERDATA] = { .type = NLA_BINARY, 1524 .len = NFT_USERDATA_MAXLEN }, 1525 }; 1526 1527 static const struct nla_policy nft_hook_policy[NFTA_HOOK_MAX + 1] = { 1528 [NFTA_HOOK_HOOKNUM] = { .type = NLA_U32 }, 1529 [NFTA_HOOK_PRIORITY] = { .type = NLA_U32 }, 1530 [NFTA_HOOK_DEV] = { .type = NLA_STRING, 1531 .len = IFNAMSIZ - 1 }, 1532 }; 1533 1534 static int nft_dump_stats(struct sk_buff *skb, struct nft_stats __percpu *stats) 1535 { 1536 struct nft_stats *cpu_stats, total; 1537 struct nlattr *nest; 1538 unsigned int seq; 1539 u64 pkts, bytes; 1540 int cpu; 1541 1542 if (!stats) 1543 return 0; 1544 1545 memset(&total, 0, sizeof(total)); 1546 for_each_possible_cpu(cpu) { 1547 cpu_stats = per_cpu_ptr(stats, cpu); 1548 do { 1549 seq = u64_stats_fetch_begin(&cpu_stats->syncp); 1550 pkts = cpu_stats->pkts; 1551 bytes = cpu_stats->bytes; 1552 } while (u64_stats_fetch_retry(&cpu_stats->syncp, seq)); 1553 total.pkts += pkts; 1554 total.bytes += bytes; 1555 } 1556 nest = nla_nest_start_noflag(skb, NFTA_CHAIN_COUNTERS); 1557 if (nest == NULL) 1558 goto nla_put_failure; 1559 1560 if (nla_put_be64(skb, NFTA_COUNTER_PACKETS, cpu_to_be64(total.pkts), 1561 NFTA_COUNTER_PAD) || 1562 nla_put_be64(skb, NFTA_COUNTER_BYTES, cpu_to_be64(total.bytes), 1563 NFTA_COUNTER_PAD)) 1564 goto nla_put_failure; 1565 1566 nla_nest_end(skb, nest); 1567 return 0; 1568 1569 nla_put_failure: 1570 return -ENOSPC; 1571 } 1572 1573 static int nft_dump_basechain_hook(struct sk_buff *skb, int family, 1574 const struct nft_base_chain *basechain) 1575 { 1576 const struct nf_hook_ops *ops = &basechain->ops; 1577 struct nft_hook *hook, *first = NULL; 1578 struct nlattr *nest, *nest_devs; 1579 int n = 0; 1580 1581 nest = nla_nest_start_noflag(skb, NFTA_CHAIN_HOOK); 1582 if (nest == NULL) 1583 goto nla_put_failure; 1584 if (nla_put_be32(skb, NFTA_HOOK_HOOKNUM, htonl(ops->hooknum))) 1585 goto nla_put_failure; 1586 if (nla_put_be32(skb, NFTA_HOOK_PRIORITY, htonl(ops->priority))) 1587 goto nla_put_failure; 1588 1589 if (nft_base_chain_netdev(family, ops->hooknum)) { 1590 nest_devs = nla_nest_start_noflag(skb, NFTA_HOOK_DEVS); 1591 list_for_each_entry(hook, &basechain->hook_list, list) { 1592 if (!first) 1593 first = hook; 1594 1595 if (nla_put_string(skb, NFTA_DEVICE_NAME, 1596 hook->ops.dev->name)) 1597 goto nla_put_failure; 1598 n++; 1599 } 1600 nla_nest_end(skb, nest_devs); 1601 1602 if (n == 1 && 1603 nla_put_string(skb, NFTA_HOOK_DEV, first->ops.dev->name)) 1604 goto nla_put_failure; 1605 } 1606 nla_nest_end(skb, nest); 1607 1608 return 0; 1609 nla_put_failure: 1610 return -1; 1611 } 1612 1613 static int nf_tables_fill_chain_info(struct sk_buff *skb, struct net *net, 1614 u32 portid, u32 seq, int event, u32 flags, 1615 int family, const struct nft_table *table, 1616 const struct nft_chain *chain) 1617 { 1618 struct nlmsghdr *nlh; 1619 1620 event = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event); 1621 nlh = nfnl_msg_put(skb, portid, seq, event, flags, family, 1622 NFNETLINK_V0, nft_base_seq(net)); 1623 if (!nlh) 1624 goto nla_put_failure; 1625 1626 if (nla_put_string(skb, NFTA_CHAIN_TABLE, table->name)) 1627 goto nla_put_failure; 1628 if (nla_put_be64(skb, NFTA_CHAIN_HANDLE, cpu_to_be64(chain->handle), 1629 NFTA_CHAIN_PAD)) 1630 goto nla_put_failure; 1631 if (nla_put_string(skb, NFTA_CHAIN_NAME, chain->name)) 1632 goto nla_put_failure; 1633 1634 if (nft_is_base_chain(chain)) { 1635 const struct nft_base_chain *basechain = nft_base_chain(chain); 1636 struct nft_stats __percpu *stats; 1637 1638 if (nft_dump_basechain_hook(skb, family, basechain)) 1639 goto nla_put_failure; 1640 1641 if (nla_put_be32(skb, NFTA_CHAIN_POLICY, 1642 htonl(basechain->policy))) 1643 goto nla_put_failure; 1644 1645 if (nla_put_string(skb, NFTA_CHAIN_TYPE, basechain->type->name)) 1646 goto nla_put_failure; 1647 1648 stats = rcu_dereference_check(basechain->stats, 1649 lockdep_commit_lock_is_held(net)); 1650 if (nft_dump_stats(skb, stats)) 1651 goto nla_put_failure; 1652 } 1653 1654 if (chain->flags && 1655 nla_put_be32(skb, NFTA_CHAIN_FLAGS, htonl(chain->flags))) 1656 goto nla_put_failure; 1657 1658 if (nla_put_be32(skb, NFTA_CHAIN_USE, htonl(chain->use))) 1659 goto nla_put_failure; 1660 1661 if (chain->udata && 1662 nla_put(skb, NFTA_CHAIN_USERDATA, chain->udlen, chain->udata)) 1663 goto nla_put_failure; 1664 1665 nlmsg_end(skb, nlh); 1666 return 0; 1667 1668 nla_put_failure: 1669 nlmsg_trim(skb, nlh); 1670 return -1; 1671 } 1672 1673 static void nf_tables_chain_notify(const struct nft_ctx *ctx, int event) 1674 { 1675 struct nftables_pernet *nft_net; 1676 struct sk_buff *skb; 1677 u16 flags = 0; 1678 int err; 1679 1680 if (!ctx->report && 1681 !nfnetlink_has_listeners(ctx->net, NFNLGRP_NFTABLES)) 1682 return; 1683 1684 skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL); 1685 if (skb == NULL) 1686 goto err; 1687 1688 if (ctx->flags & (NLM_F_CREATE | NLM_F_EXCL)) 1689 flags |= ctx->flags & (NLM_F_CREATE | NLM_F_EXCL); 1690 1691 err = nf_tables_fill_chain_info(skb, ctx->net, ctx->portid, ctx->seq, 1692 event, flags, ctx->family, ctx->table, 1693 ctx->chain); 1694 if (err < 0) { 1695 kfree_skb(skb); 1696 goto err; 1697 } 1698 1699 nft_net = nft_pernet(ctx->net); 1700 nft_notify_enqueue(skb, ctx->report, &nft_net->notify_list); 1701 return; 1702 err: 1703 nfnetlink_set_err(ctx->net, ctx->portid, NFNLGRP_NFTABLES, -ENOBUFS); 1704 } 1705 1706 static int nf_tables_dump_chains(struct sk_buff *skb, 1707 struct netlink_callback *cb) 1708 { 1709 const struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh); 1710 unsigned int idx = 0, s_idx = cb->args[0]; 1711 struct net *net = sock_net(skb->sk); 1712 int family = nfmsg->nfgen_family; 1713 struct nftables_pernet *nft_net; 1714 const struct nft_table *table; 1715 const struct nft_chain *chain; 1716 1717 rcu_read_lock(); 1718 nft_net = nft_pernet(net); 1719 cb->seq = READ_ONCE(nft_net->base_seq); 1720 1721 list_for_each_entry_rcu(table, &nft_net->tables, list) { 1722 if (family != NFPROTO_UNSPEC && family != table->family) 1723 continue; 1724 1725 list_for_each_entry_rcu(chain, &table->chains, list) { 1726 if (idx < s_idx) 1727 goto cont; 1728 if (idx > s_idx) 1729 memset(&cb->args[1], 0, 1730 sizeof(cb->args) - sizeof(cb->args[0])); 1731 if (!nft_is_active(net, chain)) 1732 continue; 1733 if (nf_tables_fill_chain_info(skb, net, 1734 NETLINK_CB(cb->skb).portid, 1735 cb->nlh->nlmsg_seq, 1736 NFT_MSG_NEWCHAIN, 1737 NLM_F_MULTI, 1738 table->family, table, 1739 chain) < 0) 1740 goto done; 1741 1742 nl_dump_check_consistent(cb, nlmsg_hdr(skb)); 1743 cont: 1744 idx++; 1745 } 1746 } 1747 done: 1748 rcu_read_unlock(); 1749 cb->args[0] = idx; 1750 return skb->len; 1751 } 1752 1753 /* called with rcu_read_lock held */ 1754 static int nf_tables_getchain(struct sk_buff *skb, const struct nfnl_info *info, 1755 const struct nlattr * const nla[]) 1756 { 1757 struct netlink_ext_ack *extack = info->extack; 1758 u8 genmask = nft_genmask_cur(info->net); 1759 u8 family = info->nfmsg->nfgen_family; 1760 const struct nft_chain *chain; 1761 struct net *net = info->net; 1762 struct nft_table *table; 1763 struct sk_buff *skb2; 1764 int err; 1765 1766 if (info->nlh->nlmsg_flags & NLM_F_DUMP) { 1767 struct netlink_dump_control c = { 1768 .dump = nf_tables_dump_chains, 1769 .module = THIS_MODULE, 1770 }; 1771 1772 return nft_netlink_dump_start_rcu(info->sk, skb, info->nlh, &c); 1773 } 1774 1775 table = nft_table_lookup(net, nla[NFTA_CHAIN_TABLE], family, genmask, 0); 1776 if (IS_ERR(table)) { 1777 NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_TABLE]); 1778 return PTR_ERR(table); 1779 } 1780 1781 chain = nft_chain_lookup(net, table, nla[NFTA_CHAIN_NAME], genmask); 1782 if (IS_ERR(chain)) { 1783 NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_NAME]); 1784 return PTR_ERR(chain); 1785 } 1786 1787 skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC); 1788 if (!skb2) 1789 return -ENOMEM; 1790 1791 err = nf_tables_fill_chain_info(skb2, net, NETLINK_CB(skb).portid, 1792 info->nlh->nlmsg_seq, NFT_MSG_NEWCHAIN, 1793 0, family, table, chain); 1794 if (err < 0) 1795 goto err_fill_chain_info; 1796 1797 return nfnetlink_unicast(skb2, net, NETLINK_CB(skb).portid); 1798 1799 err_fill_chain_info: 1800 kfree_skb(skb2); 1801 return err; 1802 } 1803 1804 static const struct nla_policy nft_counter_policy[NFTA_COUNTER_MAX + 1] = { 1805 [NFTA_COUNTER_PACKETS] = { .type = NLA_U64 }, 1806 [NFTA_COUNTER_BYTES] = { .type = NLA_U64 }, 1807 }; 1808 1809 static struct nft_stats __percpu *nft_stats_alloc(const struct nlattr *attr) 1810 { 1811 struct nlattr *tb[NFTA_COUNTER_MAX+1]; 1812 struct nft_stats __percpu *newstats; 1813 struct nft_stats *stats; 1814 int err; 1815 1816 err = nla_parse_nested_deprecated(tb, NFTA_COUNTER_MAX, attr, 1817 nft_counter_policy, NULL); 1818 if (err < 0) 1819 return ERR_PTR(err); 1820 1821 if (!tb[NFTA_COUNTER_BYTES] || !tb[NFTA_COUNTER_PACKETS]) 1822 return ERR_PTR(-EINVAL); 1823 1824 newstats = netdev_alloc_pcpu_stats(struct nft_stats); 1825 if (newstats == NULL) 1826 return ERR_PTR(-ENOMEM); 1827 1828 /* Restore old counters on this cpu, no problem. Per-cpu statistics 1829 * are not exposed to userspace. 1830 */ 1831 preempt_disable(); 1832 stats = this_cpu_ptr(newstats); 1833 stats->bytes = be64_to_cpu(nla_get_be64(tb[NFTA_COUNTER_BYTES])); 1834 stats->pkts = be64_to_cpu(nla_get_be64(tb[NFTA_COUNTER_PACKETS])); 1835 preempt_enable(); 1836 1837 return newstats; 1838 } 1839 1840 static void nft_chain_stats_replace(struct nft_trans *trans) 1841 { 1842 struct nft_base_chain *chain = nft_base_chain(trans->ctx.chain); 1843 1844 if (!nft_trans_chain_stats(trans)) 1845 return; 1846 1847 nft_trans_chain_stats(trans) = 1848 rcu_replace_pointer(chain->stats, nft_trans_chain_stats(trans), 1849 lockdep_commit_lock_is_held(trans->ctx.net)); 1850 1851 if (!nft_trans_chain_stats(trans)) 1852 static_branch_inc(&nft_counters_enabled); 1853 } 1854 1855 static void nf_tables_chain_free_chain_rules(struct nft_chain *chain) 1856 { 1857 struct nft_rule_blob *g0 = rcu_dereference_raw(chain->blob_gen_0); 1858 struct nft_rule_blob *g1 = rcu_dereference_raw(chain->blob_gen_1); 1859 1860 if (g0 != g1) 1861 kvfree(g1); 1862 kvfree(g0); 1863 1864 /* should be NULL either via abort or via successful commit */ 1865 WARN_ON_ONCE(chain->blob_next); 1866 kvfree(chain->blob_next); 1867 } 1868 1869 void nf_tables_chain_destroy(struct nft_ctx *ctx) 1870 { 1871 struct nft_chain *chain = ctx->chain; 1872 struct nft_hook *hook, *next; 1873 1874 if (WARN_ON(chain->use > 0)) 1875 return; 1876 1877 /* no concurrent access possible anymore */ 1878 nf_tables_chain_free_chain_rules(chain); 1879 1880 if (nft_is_base_chain(chain)) { 1881 struct nft_base_chain *basechain = nft_base_chain(chain); 1882 1883 if (nft_base_chain_netdev(ctx->family, basechain->ops.hooknum)) { 1884 list_for_each_entry_safe(hook, next, 1885 &basechain->hook_list, list) { 1886 list_del_rcu(&hook->list); 1887 kfree_rcu(hook, rcu); 1888 } 1889 } 1890 module_put(basechain->type->owner); 1891 if (rcu_access_pointer(basechain->stats)) { 1892 static_branch_dec(&nft_counters_enabled); 1893 free_percpu(rcu_dereference_raw(basechain->stats)); 1894 } 1895 kfree(chain->name); 1896 kfree(chain->udata); 1897 kfree(basechain); 1898 } else { 1899 kfree(chain->name); 1900 kfree(chain->udata); 1901 kfree(chain); 1902 } 1903 } 1904 1905 static struct nft_hook *nft_netdev_hook_alloc(struct net *net, 1906 const struct nlattr *attr) 1907 { 1908 struct net_device *dev; 1909 char ifname[IFNAMSIZ]; 1910 struct nft_hook *hook; 1911 int err; 1912 1913 hook = kmalloc(sizeof(struct nft_hook), GFP_KERNEL_ACCOUNT); 1914 if (!hook) { 1915 err = -ENOMEM; 1916 goto err_hook_alloc; 1917 } 1918 1919 nla_strscpy(ifname, attr, IFNAMSIZ); 1920 /* nf_tables_netdev_event() is called under rtnl_mutex, this is 1921 * indirectly serializing all the other holders of the commit_mutex with 1922 * the rtnl_mutex. 1923 */ 1924 dev = __dev_get_by_name(net, ifname); 1925 if (!dev) { 1926 err = -ENOENT; 1927 goto err_hook_dev; 1928 } 1929 hook->ops.dev = dev; 1930 1931 return hook; 1932 1933 err_hook_dev: 1934 kfree(hook); 1935 err_hook_alloc: 1936 return ERR_PTR(err); 1937 } 1938 1939 static struct nft_hook *nft_hook_list_find(struct list_head *hook_list, 1940 const struct nft_hook *this) 1941 { 1942 struct nft_hook *hook; 1943 1944 list_for_each_entry(hook, hook_list, list) { 1945 if (this->ops.dev == hook->ops.dev) 1946 return hook; 1947 } 1948 1949 return NULL; 1950 } 1951 1952 static int nf_tables_parse_netdev_hooks(struct net *net, 1953 const struct nlattr *attr, 1954 struct list_head *hook_list) 1955 { 1956 struct nft_hook *hook, *next; 1957 const struct nlattr *tmp; 1958 int rem, n = 0, err; 1959 1960 nla_for_each_nested(tmp, attr, rem) { 1961 if (nla_type(tmp) != NFTA_DEVICE_NAME) { 1962 err = -EINVAL; 1963 goto err_hook; 1964 } 1965 1966 hook = nft_netdev_hook_alloc(net, tmp); 1967 if (IS_ERR(hook)) { 1968 err = PTR_ERR(hook); 1969 goto err_hook; 1970 } 1971 if (nft_hook_list_find(hook_list, hook)) { 1972 kfree(hook); 1973 err = -EEXIST; 1974 goto err_hook; 1975 } 1976 list_add_tail(&hook->list, hook_list); 1977 n++; 1978 1979 if (n == NFT_NETDEVICE_MAX) { 1980 err = -EFBIG; 1981 goto err_hook; 1982 } 1983 } 1984 1985 return 0; 1986 1987 err_hook: 1988 list_for_each_entry_safe(hook, next, hook_list, list) { 1989 list_del(&hook->list); 1990 kfree(hook); 1991 } 1992 return err; 1993 } 1994 1995 struct nft_chain_hook { 1996 u32 num; 1997 s32 priority; 1998 const struct nft_chain_type *type; 1999 struct list_head list; 2000 }; 2001 2002 static int nft_chain_parse_netdev(struct net *net, 2003 struct nlattr *tb[], 2004 struct list_head *hook_list) 2005 { 2006 struct nft_hook *hook; 2007 int err; 2008 2009 if (tb[NFTA_HOOK_DEV]) { 2010 hook = nft_netdev_hook_alloc(net, tb[NFTA_HOOK_DEV]); 2011 if (IS_ERR(hook)) 2012 return PTR_ERR(hook); 2013 2014 list_add_tail(&hook->list, hook_list); 2015 } else if (tb[NFTA_HOOK_DEVS]) { 2016 err = nf_tables_parse_netdev_hooks(net, tb[NFTA_HOOK_DEVS], 2017 hook_list); 2018 if (err < 0) 2019 return err; 2020 2021 if (list_empty(hook_list)) 2022 return -EINVAL; 2023 } else { 2024 return -EINVAL; 2025 } 2026 2027 return 0; 2028 } 2029 2030 static int nft_chain_parse_hook(struct net *net, 2031 const struct nlattr * const nla[], 2032 struct nft_chain_hook *hook, u8 family, 2033 struct netlink_ext_ack *extack, bool autoload) 2034 { 2035 struct nftables_pernet *nft_net = nft_pernet(net); 2036 struct nlattr *ha[NFTA_HOOK_MAX + 1]; 2037 const struct nft_chain_type *type; 2038 int err; 2039 2040 lockdep_assert_held(&nft_net->commit_mutex); 2041 lockdep_nfnl_nft_mutex_not_held(); 2042 2043 err = nla_parse_nested_deprecated(ha, NFTA_HOOK_MAX, 2044 nla[NFTA_CHAIN_HOOK], 2045 nft_hook_policy, NULL); 2046 if (err < 0) 2047 return err; 2048 2049 if (ha[NFTA_HOOK_HOOKNUM] == NULL || 2050 ha[NFTA_HOOK_PRIORITY] == NULL) 2051 return -EINVAL; 2052 2053 hook->num = ntohl(nla_get_be32(ha[NFTA_HOOK_HOOKNUM])); 2054 hook->priority = ntohl(nla_get_be32(ha[NFTA_HOOK_PRIORITY])); 2055 2056 type = __nft_chain_type_get(family, NFT_CHAIN_T_DEFAULT); 2057 if (!type) 2058 return -EOPNOTSUPP; 2059 2060 if (nla[NFTA_CHAIN_TYPE]) { 2061 type = nf_tables_chain_type_lookup(net, nla[NFTA_CHAIN_TYPE], 2062 family, autoload); 2063 if (IS_ERR(type)) { 2064 NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_TYPE]); 2065 return PTR_ERR(type); 2066 } 2067 } 2068 if (hook->num >= NFT_MAX_HOOKS || !(type->hook_mask & (1 << hook->num))) 2069 return -EOPNOTSUPP; 2070 2071 if (type->type == NFT_CHAIN_T_NAT && 2072 hook->priority <= NF_IP_PRI_CONNTRACK) 2073 return -EOPNOTSUPP; 2074 2075 if (!try_module_get(type->owner)) { 2076 if (nla[NFTA_CHAIN_TYPE]) 2077 NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_TYPE]); 2078 return -ENOENT; 2079 } 2080 2081 hook->type = type; 2082 2083 INIT_LIST_HEAD(&hook->list); 2084 if (nft_base_chain_netdev(family, hook->num)) { 2085 err = nft_chain_parse_netdev(net, ha, &hook->list); 2086 if (err < 0) { 2087 module_put(type->owner); 2088 return err; 2089 } 2090 } else if (ha[NFTA_HOOK_DEV] || ha[NFTA_HOOK_DEVS]) { 2091 module_put(type->owner); 2092 return -EOPNOTSUPP; 2093 } 2094 2095 return 0; 2096 } 2097 2098 static void nft_chain_release_hook(struct nft_chain_hook *hook) 2099 { 2100 struct nft_hook *h, *next; 2101 2102 list_for_each_entry_safe(h, next, &hook->list, list) { 2103 list_del(&h->list); 2104 kfree(h); 2105 } 2106 module_put(hook->type->owner); 2107 } 2108 2109 struct nft_rules_old { 2110 struct rcu_head h; 2111 struct nft_rule_blob *blob; 2112 }; 2113 2114 static void nft_last_rule(struct nft_rule_blob *blob, const void *ptr) 2115 { 2116 struct nft_rule_dp *prule; 2117 2118 prule = (struct nft_rule_dp *)ptr; 2119 prule->is_last = 1; 2120 /* blob size does not include the trailer rule */ 2121 } 2122 2123 static struct nft_rule_blob *nf_tables_chain_alloc_rules(unsigned int size) 2124 { 2125 struct nft_rule_blob *blob; 2126 2127 /* size must include room for the last rule */ 2128 if (size < offsetof(struct nft_rule_dp, data)) 2129 return NULL; 2130 2131 size += sizeof(struct nft_rule_blob) + sizeof(struct nft_rules_old); 2132 if (size > INT_MAX) 2133 return NULL; 2134 2135 blob = kvmalloc(size, GFP_KERNEL_ACCOUNT); 2136 if (!blob) 2137 return NULL; 2138 2139 blob->size = 0; 2140 nft_last_rule(blob, blob->data); 2141 2142 return blob; 2143 } 2144 2145 static void nft_basechain_hook_init(struct nf_hook_ops *ops, u8 family, 2146 const struct nft_chain_hook *hook, 2147 struct nft_chain *chain) 2148 { 2149 ops->pf = family; 2150 ops->hooknum = hook->num; 2151 ops->priority = hook->priority; 2152 ops->priv = chain; 2153 ops->hook = hook->type->hooks[ops->hooknum]; 2154 ops->hook_ops_type = NF_HOOK_OP_NF_TABLES; 2155 } 2156 2157 static int nft_basechain_init(struct nft_base_chain *basechain, u8 family, 2158 struct nft_chain_hook *hook, u32 flags) 2159 { 2160 struct nft_chain *chain; 2161 struct nft_hook *h; 2162 2163 basechain->type = hook->type; 2164 INIT_LIST_HEAD(&basechain->hook_list); 2165 chain = &basechain->chain; 2166 2167 if (nft_base_chain_netdev(family, hook->num)) { 2168 list_splice_init(&hook->list, &basechain->hook_list); 2169 list_for_each_entry(h, &basechain->hook_list, list) 2170 nft_basechain_hook_init(&h->ops, family, hook, chain); 2171 2172 basechain->ops.hooknum = hook->num; 2173 basechain->ops.priority = hook->priority; 2174 } else { 2175 nft_basechain_hook_init(&basechain->ops, family, hook, chain); 2176 } 2177 2178 chain->flags |= NFT_CHAIN_BASE | flags; 2179 basechain->policy = NF_ACCEPT; 2180 if (chain->flags & NFT_CHAIN_HW_OFFLOAD && 2181 !nft_chain_offload_support(basechain)) { 2182 list_splice_init(&basechain->hook_list, &hook->list); 2183 return -EOPNOTSUPP; 2184 } 2185 2186 flow_block_init(&basechain->flow_block); 2187 2188 return 0; 2189 } 2190 2191 static int nft_chain_add(struct nft_table *table, struct nft_chain *chain) 2192 { 2193 int err; 2194 2195 err = rhltable_insert_key(&table->chains_ht, chain->name, 2196 &chain->rhlhead, nft_chain_ht_params); 2197 if (err) 2198 return err; 2199 2200 list_add_tail_rcu(&chain->list, &table->chains); 2201 2202 return 0; 2203 } 2204 2205 static u64 chain_id; 2206 2207 static int nf_tables_addchain(struct nft_ctx *ctx, u8 family, u8 genmask, 2208 u8 policy, u32 flags, 2209 struct netlink_ext_ack *extack) 2210 { 2211 const struct nlattr * const *nla = ctx->nla; 2212 struct nft_table *table = ctx->table; 2213 struct nft_base_chain *basechain; 2214 struct net *net = ctx->net; 2215 char name[NFT_NAME_MAXLEN]; 2216 struct nft_rule_blob *blob; 2217 struct nft_trans *trans; 2218 struct nft_chain *chain; 2219 unsigned int data_size; 2220 int err; 2221 2222 if (table->use == UINT_MAX) 2223 return -EOVERFLOW; 2224 2225 if (nla[NFTA_CHAIN_HOOK]) { 2226 struct nft_stats __percpu *stats = NULL; 2227 struct nft_chain_hook hook; 2228 2229 if (flags & NFT_CHAIN_BINDING) 2230 return -EOPNOTSUPP; 2231 2232 err = nft_chain_parse_hook(net, nla, &hook, family, extack, 2233 true); 2234 if (err < 0) 2235 return err; 2236 2237 basechain = kzalloc(sizeof(*basechain), GFP_KERNEL_ACCOUNT); 2238 if (basechain == NULL) { 2239 nft_chain_release_hook(&hook); 2240 return -ENOMEM; 2241 } 2242 chain = &basechain->chain; 2243 2244 if (nla[NFTA_CHAIN_COUNTERS]) { 2245 stats = nft_stats_alloc(nla[NFTA_CHAIN_COUNTERS]); 2246 if (IS_ERR(stats)) { 2247 nft_chain_release_hook(&hook); 2248 kfree(basechain); 2249 return PTR_ERR(stats); 2250 } 2251 rcu_assign_pointer(basechain->stats, stats); 2252 } 2253 2254 err = nft_basechain_init(basechain, family, &hook, flags); 2255 if (err < 0) { 2256 nft_chain_release_hook(&hook); 2257 kfree(basechain); 2258 free_percpu(stats); 2259 return err; 2260 } 2261 if (stats) 2262 static_branch_inc(&nft_counters_enabled); 2263 } else { 2264 if (flags & NFT_CHAIN_BASE) 2265 return -EINVAL; 2266 if (flags & NFT_CHAIN_HW_OFFLOAD) 2267 return -EOPNOTSUPP; 2268 2269 chain = kzalloc(sizeof(*chain), GFP_KERNEL_ACCOUNT); 2270 if (chain == NULL) 2271 return -ENOMEM; 2272 2273 chain->flags = flags; 2274 } 2275 ctx->chain = chain; 2276 2277 INIT_LIST_HEAD(&chain->rules); 2278 chain->handle = nf_tables_alloc_handle(table); 2279 chain->table = table; 2280 2281 if (nla[NFTA_CHAIN_NAME]) { 2282 chain->name = nla_strdup(nla[NFTA_CHAIN_NAME], GFP_KERNEL_ACCOUNT); 2283 } else { 2284 if (!(flags & NFT_CHAIN_BINDING)) { 2285 err = -EINVAL; 2286 goto err_destroy_chain; 2287 } 2288 2289 snprintf(name, sizeof(name), "__chain%llu", ++chain_id); 2290 chain->name = kstrdup(name, GFP_KERNEL_ACCOUNT); 2291 } 2292 2293 if (!chain->name) { 2294 err = -ENOMEM; 2295 goto err_destroy_chain; 2296 } 2297 2298 if (nla[NFTA_CHAIN_USERDATA]) { 2299 chain->udata = nla_memdup(nla[NFTA_CHAIN_USERDATA], GFP_KERNEL_ACCOUNT); 2300 if (chain->udata == NULL) { 2301 err = -ENOMEM; 2302 goto err_destroy_chain; 2303 } 2304 chain->udlen = nla_len(nla[NFTA_CHAIN_USERDATA]); 2305 } 2306 2307 data_size = offsetof(struct nft_rule_dp, data); /* last rule */ 2308 blob = nf_tables_chain_alloc_rules(data_size); 2309 if (!blob) { 2310 err = -ENOMEM; 2311 goto err_destroy_chain; 2312 } 2313 2314 RCU_INIT_POINTER(chain->blob_gen_0, blob); 2315 RCU_INIT_POINTER(chain->blob_gen_1, blob); 2316 2317 err = nf_tables_register_hook(net, table, chain); 2318 if (err < 0) 2319 goto err_destroy_chain; 2320 2321 trans = nft_trans_chain_add(ctx, NFT_MSG_NEWCHAIN); 2322 if (IS_ERR(trans)) { 2323 err = PTR_ERR(trans); 2324 goto err_unregister_hook; 2325 } 2326 2327 nft_trans_chain_policy(trans) = NFT_CHAIN_POLICY_UNSET; 2328 if (nft_is_base_chain(chain)) 2329 nft_trans_chain_policy(trans) = policy; 2330 2331 err = nft_chain_add(table, chain); 2332 if (err < 0) { 2333 nft_trans_destroy(trans); 2334 goto err_unregister_hook; 2335 } 2336 2337 table->use++; 2338 2339 return 0; 2340 err_unregister_hook: 2341 nf_tables_unregister_hook(net, table, chain); 2342 err_destroy_chain: 2343 nf_tables_chain_destroy(ctx); 2344 2345 return err; 2346 } 2347 2348 static bool nft_hook_list_equal(struct list_head *hook_list1, 2349 struct list_head *hook_list2) 2350 { 2351 struct nft_hook *hook; 2352 int n = 0, m = 0; 2353 2354 n = 0; 2355 list_for_each_entry(hook, hook_list2, list) { 2356 if (!nft_hook_list_find(hook_list1, hook)) 2357 return false; 2358 2359 n++; 2360 } 2361 list_for_each_entry(hook, hook_list1, list) 2362 m++; 2363 2364 return n == m; 2365 } 2366 2367 static int nf_tables_updchain(struct nft_ctx *ctx, u8 genmask, u8 policy, 2368 u32 flags, const struct nlattr *attr, 2369 struct netlink_ext_ack *extack) 2370 { 2371 const struct nlattr * const *nla = ctx->nla; 2372 struct nft_table *table = ctx->table; 2373 struct nft_chain *chain = ctx->chain; 2374 struct nft_base_chain *basechain; 2375 struct nft_stats *stats = NULL; 2376 struct nft_chain_hook hook; 2377 struct nf_hook_ops *ops; 2378 struct nft_trans *trans; 2379 int err; 2380 2381 if (chain->flags ^ flags) 2382 return -EOPNOTSUPP; 2383 2384 if (nla[NFTA_CHAIN_HOOK]) { 2385 if (!nft_is_base_chain(chain)) { 2386 NL_SET_BAD_ATTR(extack, attr); 2387 return -EEXIST; 2388 } 2389 err = nft_chain_parse_hook(ctx->net, nla, &hook, ctx->family, 2390 extack, false); 2391 if (err < 0) 2392 return err; 2393 2394 basechain = nft_base_chain(chain); 2395 if (basechain->type != hook.type) { 2396 nft_chain_release_hook(&hook); 2397 NL_SET_BAD_ATTR(extack, attr); 2398 return -EEXIST; 2399 } 2400 2401 if (nft_base_chain_netdev(ctx->family, hook.num)) { 2402 if (!nft_hook_list_equal(&basechain->hook_list, 2403 &hook.list)) { 2404 nft_chain_release_hook(&hook); 2405 NL_SET_BAD_ATTR(extack, attr); 2406 return -EEXIST; 2407 } 2408 } else { 2409 ops = &basechain->ops; 2410 if (ops->hooknum != hook.num || 2411 ops->priority != hook.priority) { 2412 nft_chain_release_hook(&hook); 2413 NL_SET_BAD_ATTR(extack, attr); 2414 return -EEXIST; 2415 } 2416 } 2417 nft_chain_release_hook(&hook); 2418 } 2419 2420 if (nla[NFTA_CHAIN_HANDLE] && 2421 nla[NFTA_CHAIN_NAME]) { 2422 struct nft_chain *chain2; 2423 2424 chain2 = nft_chain_lookup(ctx->net, table, 2425 nla[NFTA_CHAIN_NAME], genmask); 2426 if (!IS_ERR(chain2)) { 2427 NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_NAME]); 2428 return -EEXIST; 2429 } 2430 } 2431 2432 if (nla[NFTA_CHAIN_COUNTERS]) { 2433 if (!nft_is_base_chain(chain)) 2434 return -EOPNOTSUPP; 2435 2436 stats = nft_stats_alloc(nla[NFTA_CHAIN_COUNTERS]); 2437 if (IS_ERR(stats)) 2438 return PTR_ERR(stats); 2439 } 2440 2441 err = -ENOMEM; 2442 trans = nft_trans_alloc(ctx, NFT_MSG_NEWCHAIN, 2443 sizeof(struct nft_trans_chain)); 2444 if (trans == NULL) 2445 goto err; 2446 2447 nft_trans_chain_stats(trans) = stats; 2448 nft_trans_chain_update(trans) = true; 2449 2450 if (nla[NFTA_CHAIN_POLICY]) 2451 nft_trans_chain_policy(trans) = policy; 2452 else 2453 nft_trans_chain_policy(trans) = -1; 2454 2455 if (nla[NFTA_CHAIN_HANDLE] && 2456 nla[NFTA_CHAIN_NAME]) { 2457 struct nftables_pernet *nft_net = nft_pernet(ctx->net); 2458 struct nft_trans *tmp; 2459 char *name; 2460 2461 err = -ENOMEM; 2462 name = nla_strdup(nla[NFTA_CHAIN_NAME], GFP_KERNEL_ACCOUNT); 2463 if (!name) 2464 goto err; 2465 2466 err = -EEXIST; 2467 list_for_each_entry(tmp, &nft_net->commit_list, list) { 2468 if (tmp->msg_type == NFT_MSG_NEWCHAIN && 2469 tmp->ctx.table == table && 2470 nft_trans_chain_update(tmp) && 2471 nft_trans_chain_name(tmp) && 2472 strcmp(name, nft_trans_chain_name(tmp)) == 0) { 2473 NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_NAME]); 2474 kfree(name); 2475 goto err; 2476 } 2477 } 2478 2479 nft_trans_chain_name(trans) = name; 2480 } 2481 nft_trans_commit_list_add_tail(ctx->net, trans); 2482 2483 return 0; 2484 err: 2485 free_percpu(stats); 2486 kfree(trans); 2487 return err; 2488 } 2489 2490 static struct nft_chain *nft_chain_lookup_byid(const struct net *net, 2491 const struct nft_table *table, 2492 const struct nlattr *nla) 2493 { 2494 struct nftables_pernet *nft_net = nft_pernet(net); 2495 u32 id = ntohl(nla_get_be32(nla)); 2496 struct nft_trans *trans; 2497 2498 list_for_each_entry(trans, &nft_net->commit_list, list) { 2499 struct nft_chain *chain = trans->ctx.chain; 2500 2501 if (trans->msg_type == NFT_MSG_NEWCHAIN && 2502 chain->table == table && 2503 id == nft_trans_chain_id(trans)) 2504 return chain; 2505 } 2506 return ERR_PTR(-ENOENT); 2507 } 2508 2509 static int nf_tables_newchain(struct sk_buff *skb, const struct nfnl_info *info, 2510 const struct nlattr * const nla[]) 2511 { 2512 struct nftables_pernet *nft_net = nft_pernet(info->net); 2513 struct netlink_ext_ack *extack = info->extack; 2514 u8 genmask = nft_genmask_next(info->net); 2515 u8 family = info->nfmsg->nfgen_family; 2516 struct nft_chain *chain = NULL; 2517 struct net *net = info->net; 2518 const struct nlattr *attr; 2519 struct nft_table *table; 2520 u8 policy = NF_ACCEPT; 2521 struct nft_ctx ctx; 2522 u64 handle = 0; 2523 u32 flags = 0; 2524 2525 lockdep_assert_held(&nft_net->commit_mutex); 2526 2527 table = nft_table_lookup(net, nla[NFTA_CHAIN_TABLE], family, genmask, 2528 NETLINK_CB(skb).portid); 2529 if (IS_ERR(table)) { 2530 NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_TABLE]); 2531 return PTR_ERR(table); 2532 } 2533 2534 chain = NULL; 2535 attr = nla[NFTA_CHAIN_NAME]; 2536 2537 if (nla[NFTA_CHAIN_HANDLE]) { 2538 handle = be64_to_cpu(nla_get_be64(nla[NFTA_CHAIN_HANDLE])); 2539 chain = nft_chain_lookup_byhandle(table, handle, genmask); 2540 if (IS_ERR(chain)) { 2541 NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_HANDLE]); 2542 return PTR_ERR(chain); 2543 } 2544 attr = nla[NFTA_CHAIN_HANDLE]; 2545 } else if (nla[NFTA_CHAIN_NAME]) { 2546 chain = nft_chain_lookup(net, table, attr, genmask); 2547 if (IS_ERR(chain)) { 2548 if (PTR_ERR(chain) != -ENOENT) { 2549 NL_SET_BAD_ATTR(extack, attr); 2550 return PTR_ERR(chain); 2551 } 2552 chain = NULL; 2553 } 2554 } else if (!nla[NFTA_CHAIN_ID]) { 2555 return -EINVAL; 2556 } 2557 2558 if (nla[NFTA_CHAIN_POLICY]) { 2559 if (chain != NULL && 2560 !nft_is_base_chain(chain)) { 2561 NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_POLICY]); 2562 return -EOPNOTSUPP; 2563 } 2564 2565 if (chain == NULL && 2566 nla[NFTA_CHAIN_HOOK] == NULL) { 2567 NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_POLICY]); 2568 return -EOPNOTSUPP; 2569 } 2570 2571 policy = ntohl(nla_get_be32(nla[NFTA_CHAIN_POLICY])); 2572 switch (policy) { 2573 case NF_DROP: 2574 case NF_ACCEPT: 2575 break; 2576 default: 2577 return -EINVAL; 2578 } 2579 } 2580 2581 if (nla[NFTA_CHAIN_FLAGS]) 2582 flags = ntohl(nla_get_be32(nla[NFTA_CHAIN_FLAGS])); 2583 else if (chain) 2584 flags = chain->flags; 2585 2586 if (flags & ~NFT_CHAIN_FLAGS) 2587 return -EOPNOTSUPP; 2588 2589 nft_ctx_init(&ctx, net, skb, info->nlh, family, table, chain, nla); 2590 2591 if (chain != NULL) { 2592 if (chain->flags & NFT_CHAIN_BINDING) 2593 return -EINVAL; 2594 2595 if (info->nlh->nlmsg_flags & NLM_F_EXCL) { 2596 NL_SET_BAD_ATTR(extack, attr); 2597 return -EEXIST; 2598 } 2599 if (info->nlh->nlmsg_flags & NLM_F_REPLACE) 2600 return -EOPNOTSUPP; 2601 2602 flags |= chain->flags & NFT_CHAIN_BASE; 2603 return nf_tables_updchain(&ctx, genmask, policy, flags, attr, 2604 extack); 2605 } 2606 2607 return nf_tables_addchain(&ctx, family, genmask, policy, flags, extack); 2608 } 2609 2610 static int nf_tables_delchain(struct sk_buff *skb, const struct nfnl_info *info, 2611 const struct nlattr * const nla[]) 2612 { 2613 struct netlink_ext_ack *extack = info->extack; 2614 u8 genmask = nft_genmask_next(info->net); 2615 u8 family = info->nfmsg->nfgen_family; 2616 struct net *net = info->net; 2617 const struct nlattr *attr; 2618 struct nft_table *table; 2619 struct nft_chain *chain; 2620 struct nft_rule *rule; 2621 struct nft_ctx ctx; 2622 u64 handle; 2623 u32 use; 2624 int err; 2625 2626 table = nft_table_lookup(net, nla[NFTA_CHAIN_TABLE], family, genmask, 2627 NETLINK_CB(skb).portid); 2628 if (IS_ERR(table)) { 2629 NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_TABLE]); 2630 return PTR_ERR(table); 2631 } 2632 2633 if (nla[NFTA_CHAIN_HANDLE]) { 2634 attr = nla[NFTA_CHAIN_HANDLE]; 2635 handle = be64_to_cpu(nla_get_be64(attr)); 2636 chain = nft_chain_lookup_byhandle(table, handle, genmask); 2637 } else { 2638 attr = nla[NFTA_CHAIN_NAME]; 2639 chain = nft_chain_lookup(net, table, attr, genmask); 2640 } 2641 if (IS_ERR(chain)) { 2642 NL_SET_BAD_ATTR(extack, attr); 2643 return PTR_ERR(chain); 2644 } 2645 2646 if (info->nlh->nlmsg_flags & NLM_F_NONREC && 2647 chain->use > 0) 2648 return -EBUSY; 2649 2650 nft_ctx_init(&ctx, net, skb, info->nlh, family, table, chain, nla); 2651 2652 use = chain->use; 2653 list_for_each_entry(rule, &chain->rules, list) { 2654 if (!nft_is_active_next(net, rule)) 2655 continue; 2656 use--; 2657 2658 err = nft_delrule(&ctx, rule); 2659 if (err < 0) 2660 return err; 2661 } 2662 2663 /* There are rules and elements that are still holding references to us, 2664 * we cannot do a recursive removal in this case. 2665 */ 2666 if (use > 0) { 2667 NL_SET_BAD_ATTR(extack, attr); 2668 return -EBUSY; 2669 } 2670 2671 return nft_delchain(&ctx); 2672 } 2673 2674 /* 2675 * Expressions 2676 */ 2677 2678 /** 2679 * nft_register_expr - register nf_tables expr type 2680 * @type: expr type 2681 * 2682 * Registers the expr type for use with nf_tables. Returns zero on 2683 * success or a negative errno code otherwise. 2684 */ 2685 int nft_register_expr(struct nft_expr_type *type) 2686 { 2687 nfnl_lock(NFNL_SUBSYS_NFTABLES); 2688 if (type->family == NFPROTO_UNSPEC) 2689 list_add_tail_rcu(&type->list, &nf_tables_expressions); 2690 else 2691 list_add_rcu(&type->list, &nf_tables_expressions); 2692 nfnl_unlock(NFNL_SUBSYS_NFTABLES); 2693 return 0; 2694 } 2695 EXPORT_SYMBOL_GPL(nft_register_expr); 2696 2697 /** 2698 * nft_unregister_expr - unregister nf_tables expr type 2699 * @type: expr type 2700 * 2701 * Unregisters the expr typefor use with nf_tables. 2702 */ 2703 void nft_unregister_expr(struct nft_expr_type *type) 2704 { 2705 nfnl_lock(NFNL_SUBSYS_NFTABLES); 2706 list_del_rcu(&type->list); 2707 nfnl_unlock(NFNL_SUBSYS_NFTABLES); 2708 } 2709 EXPORT_SYMBOL_GPL(nft_unregister_expr); 2710 2711 static const struct nft_expr_type *__nft_expr_type_get(u8 family, 2712 struct nlattr *nla) 2713 { 2714 const struct nft_expr_type *type, *candidate = NULL; 2715 2716 list_for_each_entry(type, &nf_tables_expressions, list) { 2717 if (!nla_strcmp(nla, type->name)) { 2718 if (!type->family && !candidate) 2719 candidate = type; 2720 else if (type->family == family) 2721 candidate = type; 2722 } 2723 } 2724 return candidate; 2725 } 2726 2727 #ifdef CONFIG_MODULES 2728 static int nft_expr_type_request_module(struct net *net, u8 family, 2729 struct nlattr *nla) 2730 { 2731 if (nft_request_module(net, "nft-expr-%u-%.*s", family, 2732 nla_len(nla), (char *)nla_data(nla)) == -EAGAIN) 2733 return -EAGAIN; 2734 2735 return 0; 2736 } 2737 #endif 2738 2739 static const struct nft_expr_type *nft_expr_type_get(struct net *net, 2740 u8 family, 2741 struct nlattr *nla) 2742 { 2743 const struct nft_expr_type *type; 2744 2745 if (nla == NULL) 2746 return ERR_PTR(-EINVAL); 2747 2748 type = __nft_expr_type_get(family, nla); 2749 if (type != NULL && try_module_get(type->owner)) 2750 return type; 2751 2752 lockdep_nfnl_nft_mutex_not_held(); 2753 #ifdef CONFIG_MODULES 2754 if (type == NULL) { 2755 if (nft_expr_type_request_module(net, family, nla) == -EAGAIN) 2756 return ERR_PTR(-EAGAIN); 2757 2758 if (nft_request_module(net, "nft-expr-%.*s", 2759 nla_len(nla), 2760 (char *)nla_data(nla)) == -EAGAIN) 2761 return ERR_PTR(-EAGAIN); 2762 } 2763 #endif 2764 return ERR_PTR(-ENOENT); 2765 } 2766 2767 static const struct nla_policy nft_expr_policy[NFTA_EXPR_MAX + 1] = { 2768 [NFTA_EXPR_NAME] = { .type = NLA_STRING, 2769 .len = NFT_MODULE_AUTOLOAD_LIMIT }, 2770 [NFTA_EXPR_DATA] = { .type = NLA_NESTED }, 2771 }; 2772 2773 static int nf_tables_fill_expr_info(struct sk_buff *skb, 2774 const struct nft_expr *expr, bool reset) 2775 { 2776 if (nla_put_string(skb, NFTA_EXPR_NAME, expr->ops->type->name)) 2777 goto nla_put_failure; 2778 2779 if (expr->ops->dump) { 2780 struct nlattr *data = nla_nest_start_noflag(skb, 2781 NFTA_EXPR_DATA); 2782 if (data == NULL) 2783 goto nla_put_failure; 2784 if (expr->ops->dump(skb, expr, reset) < 0) 2785 goto nla_put_failure; 2786 nla_nest_end(skb, data); 2787 } 2788 2789 return skb->len; 2790 2791 nla_put_failure: 2792 return -1; 2793 }; 2794 2795 int nft_expr_dump(struct sk_buff *skb, unsigned int attr, 2796 const struct nft_expr *expr, bool reset) 2797 { 2798 struct nlattr *nest; 2799 2800 nest = nla_nest_start_noflag(skb, attr); 2801 if (!nest) 2802 goto nla_put_failure; 2803 if (nf_tables_fill_expr_info(skb, expr, reset) < 0) 2804 goto nla_put_failure; 2805 nla_nest_end(skb, nest); 2806 return 0; 2807 2808 nla_put_failure: 2809 return -1; 2810 } 2811 2812 struct nft_expr_info { 2813 const struct nft_expr_ops *ops; 2814 const struct nlattr *attr; 2815 struct nlattr *tb[NFT_EXPR_MAXATTR + 1]; 2816 }; 2817 2818 static int nf_tables_expr_parse(const struct nft_ctx *ctx, 2819 const struct nlattr *nla, 2820 struct nft_expr_info *info) 2821 { 2822 const struct nft_expr_type *type; 2823 const struct nft_expr_ops *ops; 2824 struct nlattr *tb[NFTA_EXPR_MAX + 1]; 2825 int err; 2826 2827 err = nla_parse_nested_deprecated(tb, NFTA_EXPR_MAX, nla, 2828 nft_expr_policy, NULL); 2829 if (err < 0) 2830 return err; 2831 2832 type = nft_expr_type_get(ctx->net, ctx->family, tb[NFTA_EXPR_NAME]); 2833 if (IS_ERR(type)) 2834 return PTR_ERR(type); 2835 2836 if (tb[NFTA_EXPR_DATA]) { 2837 err = nla_parse_nested_deprecated(info->tb, type->maxattr, 2838 tb[NFTA_EXPR_DATA], 2839 type->policy, NULL); 2840 if (err < 0) 2841 goto err1; 2842 } else 2843 memset(info->tb, 0, sizeof(info->tb[0]) * (type->maxattr + 1)); 2844 2845 if (type->select_ops != NULL) { 2846 ops = type->select_ops(ctx, 2847 (const struct nlattr * const *)info->tb); 2848 if (IS_ERR(ops)) { 2849 err = PTR_ERR(ops); 2850 #ifdef CONFIG_MODULES 2851 if (err == -EAGAIN) 2852 if (nft_expr_type_request_module(ctx->net, 2853 ctx->family, 2854 tb[NFTA_EXPR_NAME]) != -EAGAIN) 2855 err = -ENOENT; 2856 #endif 2857 goto err1; 2858 } 2859 } else 2860 ops = type->ops; 2861 2862 info->attr = nla; 2863 info->ops = ops; 2864 2865 return 0; 2866 2867 err1: 2868 module_put(type->owner); 2869 return err; 2870 } 2871 2872 int nft_expr_inner_parse(const struct nft_ctx *ctx, const struct nlattr *nla, 2873 struct nft_expr_info *info) 2874 { 2875 struct nlattr *tb[NFTA_EXPR_MAX + 1]; 2876 const struct nft_expr_type *type; 2877 int err; 2878 2879 err = nla_parse_nested_deprecated(tb, NFTA_EXPR_MAX, nla, 2880 nft_expr_policy, NULL); 2881 if (err < 0) 2882 return err; 2883 2884 if (!tb[NFTA_EXPR_DATA]) 2885 return -EINVAL; 2886 2887 type = __nft_expr_type_get(ctx->family, tb[NFTA_EXPR_NAME]); 2888 if (!type) 2889 return -ENOENT; 2890 2891 if (!type->inner_ops) 2892 return -EOPNOTSUPP; 2893 2894 err = nla_parse_nested_deprecated(info->tb, type->maxattr, 2895 tb[NFTA_EXPR_DATA], 2896 type->policy, NULL); 2897 if (err < 0) 2898 goto err_nla_parse; 2899 2900 info->attr = nla; 2901 info->ops = type->inner_ops; 2902 2903 return 0; 2904 2905 err_nla_parse: 2906 return err; 2907 } 2908 2909 static int nf_tables_newexpr(const struct nft_ctx *ctx, 2910 const struct nft_expr_info *expr_info, 2911 struct nft_expr *expr) 2912 { 2913 const struct nft_expr_ops *ops = expr_info->ops; 2914 int err; 2915 2916 expr->ops = ops; 2917 if (ops->init) { 2918 err = ops->init(ctx, expr, (const struct nlattr **)expr_info->tb); 2919 if (err < 0) 2920 goto err1; 2921 } 2922 2923 return 0; 2924 err1: 2925 expr->ops = NULL; 2926 return err; 2927 } 2928 2929 static void nf_tables_expr_destroy(const struct nft_ctx *ctx, 2930 struct nft_expr *expr) 2931 { 2932 const struct nft_expr_type *type = expr->ops->type; 2933 2934 if (expr->ops->destroy) 2935 expr->ops->destroy(ctx, expr); 2936 module_put(type->owner); 2937 } 2938 2939 static struct nft_expr *nft_expr_init(const struct nft_ctx *ctx, 2940 const struct nlattr *nla) 2941 { 2942 struct nft_expr_info expr_info; 2943 struct nft_expr *expr; 2944 struct module *owner; 2945 int err; 2946 2947 err = nf_tables_expr_parse(ctx, nla, &expr_info); 2948 if (err < 0) 2949 goto err_expr_parse; 2950 2951 err = -EOPNOTSUPP; 2952 if (!(expr_info.ops->type->flags & NFT_EXPR_STATEFUL)) 2953 goto err_expr_stateful; 2954 2955 err = -ENOMEM; 2956 expr = kzalloc(expr_info.ops->size, GFP_KERNEL_ACCOUNT); 2957 if (expr == NULL) 2958 goto err_expr_stateful; 2959 2960 err = nf_tables_newexpr(ctx, &expr_info, expr); 2961 if (err < 0) 2962 goto err_expr_new; 2963 2964 return expr; 2965 err_expr_new: 2966 kfree(expr); 2967 err_expr_stateful: 2968 owner = expr_info.ops->type->owner; 2969 if (expr_info.ops->type->release_ops) 2970 expr_info.ops->type->release_ops(expr_info.ops); 2971 2972 module_put(owner); 2973 err_expr_parse: 2974 return ERR_PTR(err); 2975 } 2976 2977 int nft_expr_clone(struct nft_expr *dst, struct nft_expr *src) 2978 { 2979 int err; 2980 2981 if (src->ops->clone) { 2982 dst->ops = src->ops; 2983 err = src->ops->clone(dst, src); 2984 if (err < 0) 2985 return err; 2986 } else { 2987 memcpy(dst, src, src->ops->size); 2988 } 2989 2990 __module_get(src->ops->type->owner); 2991 2992 return 0; 2993 } 2994 2995 void nft_expr_destroy(const struct nft_ctx *ctx, struct nft_expr *expr) 2996 { 2997 nf_tables_expr_destroy(ctx, expr); 2998 kfree(expr); 2999 } 3000 3001 /* 3002 * Rules 3003 */ 3004 3005 static struct nft_rule *__nft_rule_lookup(const struct nft_chain *chain, 3006 u64 handle) 3007 { 3008 struct nft_rule *rule; 3009 3010 // FIXME: this sucks 3011 list_for_each_entry_rcu(rule, &chain->rules, list) { 3012 if (handle == rule->handle) 3013 return rule; 3014 } 3015 3016 return ERR_PTR(-ENOENT); 3017 } 3018 3019 static struct nft_rule *nft_rule_lookup(const struct nft_chain *chain, 3020 const struct nlattr *nla) 3021 { 3022 if (nla == NULL) 3023 return ERR_PTR(-EINVAL); 3024 3025 return __nft_rule_lookup(chain, be64_to_cpu(nla_get_be64(nla))); 3026 } 3027 3028 static const struct nla_policy nft_rule_policy[NFTA_RULE_MAX + 1] = { 3029 [NFTA_RULE_TABLE] = { .type = NLA_STRING, 3030 .len = NFT_TABLE_MAXNAMELEN - 1 }, 3031 [NFTA_RULE_CHAIN] = { .type = NLA_STRING, 3032 .len = NFT_CHAIN_MAXNAMELEN - 1 }, 3033 [NFTA_RULE_HANDLE] = { .type = NLA_U64 }, 3034 [NFTA_RULE_EXPRESSIONS] = { .type = NLA_NESTED }, 3035 [NFTA_RULE_COMPAT] = { .type = NLA_NESTED }, 3036 [NFTA_RULE_POSITION] = { .type = NLA_U64 }, 3037 [NFTA_RULE_USERDATA] = { .type = NLA_BINARY, 3038 .len = NFT_USERDATA_MAXLEN }, 3039 [NFTA_RULE_ID] = { .type = NLA_U32 }, 3040 [NFTA_RULE_POSITION_ID] = { .type = NLA_U32 }, 3041 [NFTA_RULE_CHAIN_ID] = { .type = NLA_U32 }, 3042 }; 3043 3044 static int nf_tables_fill_rule_info(struct sk_buff *skb, struct net *net, 3045 u32 portid, u32 seq, int event, 3046 u32 flags, int family, 3047 const struct nft_table *table, 3048 const struct nft_chain *chain, 3049 const struct nft_rule *rule, u64 handle, 3050 bool reset) 3051 { 3052 struct nlmsghdr *nlh; 3053 const struct nft_expr *expr, *next; 3054 struct nlattr *list; 3055 u16 type = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event); 3056 3057 nlh = nfnl_msg_put(skb, portid, seq, type, flags, family, NFNETLINK_V0, 3058 nft_base_seq(net)); 3059 if (!nlh) 3060 goto nla_put_failure; 3061 3062 if (nla_put_string(skb, NFTA_RULE_TABLE, table->name)) 3063 goto nla_put_failure; 3064 if (nla_put_string(skb, NFTA_RULE_CHAIN, chain->name)) 3065 goto nla_put_failure; 3066 if (nla_put_be64(skb, NFTA_RULE_HANDLE, cpu_to_be64(rule->handle), 3067 NFTA_RULE_PAD)) 3068 goto nla_put_failure; 3069 3070 if (event != NFT_MSG_DELRULE && handle) { 3071 if (nla_put_be64(skb, NFTA_RULE_POSITION, cpu_to_be64(handle), 3072 NFTA_RULE_PAD)) 3073 goto nla_put_failure; 3074 } 3075 3076 if (chain->flags & NFT_CHAIN_HW_OFFLOAD) 3077 nft_flow_rule_stats(chain, rule); 3078 3079 list = nla_nest_start_noflag(skb, NFTA_RULE_EXPRESSIONS); 3080 if (list == NULL) 3081 goto nla_put_failure; 3082 nft_rule_for_each_expr(expr, next, rule) { 3083 if (nft_expr_dump(skb, NFTA_LIST_ELEM, expr, reset) < 0) 3084 goto nla_put_failure; 3085 } 3086 nla_nest_end(skb, list); 3087 3088 if (rule->udata) { 3089 struct nft_userdata *udata = nft_userdata(rule); 3090 if (nla_put(skb, NFTA_RULE_USERDATA, udata->len + 1, 3091 udata->data) < 0) 3092 goto nla_put_failure; 3093 } 3094 3095 nlmsg_end(skb, nlh); 3096 return 0; 3097 3098 nla_put_failure: 3099 nlmsg_trim(skb, nlh); 3100 return -1; 3101 } 3102 3103 static void nf_tables_rule_notify(const struct nft_ctx *ctx, 3104 const struct nft_rule *rule, int event) 3105 { 3106 struct nftables_pernet *nft_net = nft_pernet(ctx->net); 3107 const struct nft_rule *prule; 3108 struct sk_buff *skb; 3109 u64 handle = 0; 3110 u16 flags = 0; 3111 int err; 3112 3113 if (!ctx->report && 3114 !nfnetlink_has_listeners(ctx->net, NFNLGRP_NFTABLES)) 3115 return; 3116 3117 skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL); 3118 if (skb == NULL) 3119 goto err; 3120 3121 if (event == NFT_MSG_NEWRULE && 3122 !list_is_first(&rule->list, &ctx->chain->rules) && 3123 !list_is_last(&rule->list, &ctx->chain->rules)) { 3124 prule = list_prev_entry(rule, list); 3125 handle = prule->handle; 3126 } 3127 if (ctx->flags & (NLM_F_APPEND | NLM_F_REPLACE)) 3128 flags |= NLM_F_APPEND; 3129 if (ctx->flags & (NLM_F_CREATE | NLM_F_EXCL)) 3130 flags |= ctx->flags & (NLM_F_CREATE | NLM_F_EXCL); 3131 3132 err = nf_tables_fill_rule_info(skb, ctx->net, ctx->portid, ctx->seq, 3133 event, flags, ctx->family, ctx->table, 3134 ctx->chain, rule, handle, false); 3135 if (err < 0) { 3136 kfree_skb(skb); 3137 goto err; 3138 } 3139 3140 nft_notify_enqueue(skb, ctx->report, &nft_net->notify_list); 3141 return; 3142 err: 3143 nfnetlink_set_err(ctx->net, ctx->portid, NFNLGRP_NFTABLES, -ENOBUFS); 3144 } 3145 3146 struct nft_rule_dump_ctx { 3147 char *table; 3148 char *chain; 3149 }; 3150 3151 static int __nf_tables_dump_rules(struct sk_buff *skb, 3152 unsigned int *idx, 3153 struct netlink_callback *cb, 3154 const struct nft_table *table, 3155 const struct nft_chain *chain, 3156 bool reset) 3157 { 3158 struct net *net = sock_net(skb->sk); 3159 const struct nft_rule *rule, *prule; 3160 unsigned int s_idx = cb->args[0]; 3161 u64 handle; 3162 3163 prule = NULL; 3164 list_for_each_entry_rcu(rule, &chain->rules, list) { 3165 if (!nft_is_active(net, rule)) 3166 goto cont_skip; 3167 if (*idx < s_idx) 3168 goto cont; 3169 if (*idx > s_idx) { 3170 memset(&cb->args[1], 0, 3171 sizeof(cb->args) - sizeof(cb->args[0])); 3172 } 3173 if (prule) 3174 handle = prule->handle; 3175 else 3176 handle = 0; 3177 3178 if (nf_tables_fill_rule_info(skb, net, NETLINK_CB(cb->skb).portid, 3179 cb->nlh->nlmsg_seq, 3180 NFT_MSG_NEWRULE, 3181 NLM_F_MULTI | NLM_F_APPEND, 3182 table->family, 3183 table, chain, rule, handle, reset) < 0) 3184 return 1; 3185 3186 nl_dump_check_consistent(cb, nlmsg_hdr(skb)); 3187 cont: 3188 prule = rule; 3189 cont_skip: 3190 (*idx)++; 3191 } 3192 return 0; 3193 } 3194 3195 static int nf_tables_dump_rules(struct sk_buff *skb, 3196 struct netlink_callback *cb) 3197 { 3198 const struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh); 3199 const struct nft_rule_dump_ctx *ctx = cb->data; 3200 struct nft_table *table; 3201 const struct nft_chain *chain; 3202 unsigned int idx = 0; 3203 struct net *net = sock_net(skb->sk); 3204 int family = nfmsg->nfgen_family; 3205 struct nftables_pernet *nft_net; 3206 bool reset = false; 3207 3208 if (NFNL_MSG_TYPE(cb->nlh->nlmsg_type) == NFT_MSG_GETRULE_RESET) 3209 reset = true; 3210 3211 rcu_read_lock(); 3212 nft_net = nft_pernet(net); 3213 cb->seq = READ_ONCE(nft_net->base_seq); 3214 3215 list_for_each_entry_rcu(table, &nft_net->tables, list) { 3216 if (family != NFPROTO_UNSPEC && family != table->family) 3217 continue; 3218 3219 if (ctx && ctx->table && strcmp(ctx->table, table->name) != 0) 3220 continue; 3221 3222 if (ctx && ctx->table && ctx->chain) { 3223 struct rhlist_head *list, *tmp; 3224 3225 list = rhltable_lookup(&table->chains_ht, ctx->chain, 3226 nft_chain_ht_params); 3227 if (!list) 3228 goto done; 3229 3230 rhl_for_each_entry_rcu(chain, tmp, list, rhlhead) { 3231 if (!nft_is_active(net, chain)) 3232 continue; 3233 __nf_tables_dump_rules(skb, &idx, 3234 cb, table, chain, reset); 3235 break; 3236 } 3237 goto done; 3238 } 3239 3240 list_for_each_entry_rcu(chain, &table->chains, list) { 3241 if (__nf_tables_dump_rules(skb, &idx, 3242 cb, table, chain, reset)) 3243 goto done; 3244 } 3245 3246 if (ctx && ctx->table) 3247 break; 3248 } 3249 done: 3250 rcu_read_unlock(); 3251 3252 cb->args[0] = idx; 3253 return skb->len; 3254 } 3255 3256 static int nf_tables_dump_rules_start(struct netlink_callback *cb) 3257 { 3258 const struct nlattr * const *nla = cb->data; 3259 struct nft_rule_dump_ctx *ctx = NULL; 3260 3261 if (nla[NFTA_RULE_TABLE] || nla[NFTA_RULE_CHAIN]) { 3262 ctx = kzalloc(sizeof(*ctx), GFP_ATOMIC); 3263 if (!ctx) 3264 return -ENOMEM; 3265 3266 if (nla[NFTA_RULE_TABLE]) { 3267 ctx->table = nla_strdup(nla[NFTA_RULE_TABLE], 3268 GFP_ATOMIC); 3269 if (!ctx->table) { 3270 kfree(ctx); 3271 return -ENOMEM; 3272 } 3273 } 3274 if (nla[NFTA_RULE_CHAIN]) { 3275 ctx->chain = nla_strdup(nla[NFTA_RULE_CHAIN], 3276 GFP_ATOMIC); 3277 if (!ctx->chain) { 3278 kfree(ctx->table); 3279 kfree(ctx); 3280 return -ENOMEM; 3281 } 3282 } 3283 } 3284 3285 cb->data = ctx; 3286 return 0; 3287 } 3288 3289 static int nf_tables_dump_rules_done(struct netlink_callback *cb) 3290 { 3291 struct nft_rule_dump_ctx *ctx = cb->data; 3292 3293 if (ctx) { 3294 kfree(ctx->table); 3295 kfree(ctx->chain); 3296 kfree(ctx); 3297 } 3298 return 0; 3299 } 3300 3301 /* called with rcu_read_lock held */ 3302 static int nf_tables_getrule(struct sk_buff *skb, const struct nfnl_info *info, 3303 const struct nlattr * const nla[]) 3304 { 3305 struct netlink_ext_ack *extack = info->extack; 3306 u8 genmask = nft_genmask_cur(info->net); 3307 u8 family = info->nfmsg->nfgen_family; 3308 const struct nft_chain *chain; 3309 const struct nft_rule *rule; 3310 struct net *net = info->net; 3311 struct nft_table *table; 3312 struct sk_buff *skb2; 3313 bool reset = false; 3314 int err; 3315 3316 if (info->nlh->nlmsg_flags & NLM_F_DUMP) { 3317 struct netlink_dump_control c = { 3318 .start= nf_tables_dump_rules_start, 3319 .dump = nf_tables_dump_rules, 3320 .done = nf_tables_dump_rules_done, 3321 .module = THIS_MODULE, 3322 .data = (void *)nla, 3323 }; 3324 3325 return nft_netlink_dump_start_rcu(info->sk, skb, info->nlh, &c); 3326 } 3327 3328 table = nft_table_lookup(net, nla[NFTA_RULE_TABLE], family, genmask, 0); 3329 if (IS_ERR(table)) { 3330 NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_TABLE]); 3331 return PTR_ERR(table); 3332 } 3333 3334 chain = nft_chain_lookup(net, table, nla[NFTA_RULE_CHAIN], genmask); 3335 if (IS_ERR(chain)) { 3336 NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_CHAIN]); 3337 return PTR_ERR(chain); 3338 } 3339 3340 rule = nft_rule_lookup(chain, nla[NFTA_RULE_HANDLE]); 3341 if (IS_ERR(rule)) { 3342 NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_HANDLE]); 3343 return PTR_ERR(rule); 3344 } 3345 3346 skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC); 3347 if (!skb2) 3348 return -ENOMEM; 3349 3350 if (NFNL_MSG_TYPE(info->nlh->nlmsg_type) == NFT_MSG_GETRULE_RESET) 3351 reset = true; 3352 3353 err = nf_tables_fill_rule_info(skb2, net, NETLINK_CB(skb).portid, 3354 info->nlh->nlmsg_seq, NFT_MSG_NEWRULE, 0, 3355 family, table, chain, rule, 0, reset); 3356 if (err < 0) 3357 goto err_fill_rule_info; 3358 3359 return nfnetlink_unicast(skb2, net, NETLINK_CB(skb).portid); 3360 3361 err_fill_rule_info: 3362 kfree_skb(skb2); 3363 return err; 3364 } 3365 3366 static void nf_tables_rule_destroy(const struct nft_ctx *ctx, 3367 struct nft_rule *rule) 3368 { 3369 struct nft_expr *expr, *next; 3370 3371 /* 3372 * Careful: some expressions might not be initialized in case this 3373 * is called on error from nf_tables_newrule(). 3374 */ 3375 expr = nft_expr_first(rule); 3376 while (nft_expr_more(rule, expr)) { 3377 next = nft_expr_next(expr); 3378 nf_tables_expr_destroy(ctx, expr); 3379 expr = next; 3380 } 3381 kfree(rule); 3382 } 3383 3384 void nf_tables_rule_release(const struct nft_ctx *ctx, struct nft_rule *rule) 3385 { 3386 nft_rule_expr_deactivate(ctx, rule, NFT_TRANS_RELEASE); 3387 nf_tables_rule_destroy(ctx, rule); 3388 } 3389 3390 int nft_chain_validate(const struct nft_ctx *ctx, const struct nft_chain *chain) 3391 { 3392 struct nft_expr *expr, *last; 3393 const struct nft_data *data; 3394 struct nft_rule *rule; 3395 int err; 3396 3397 if (ctx->level == NFT_JUMP_STACK_SIZE) 3398 return -EMLINK; 3399 3400 list_for_each_entry(rule, &chain->rules, list) { 3401 if (!nft_is_active_next(ctx->net, rule)) 3402 continue; 3403 3404 nft_rule_for_each_expr(expr, last, rule) { 3405 if (!expr->ops->validate) 3406 continue; 3407 3408 err = expr->ops->validate(ctx, expr, &data); 3409 if (err < 0) 3410 return err; 3411 } 3412 3413 cond_resched(); 3414 } 3415 3416 return 0; 3417 } 3418 EXPORT_SYMBOL_GPL(nft_chain_validate); 3419 3420 static int nft_table_validate(struct net *net, const struct nft_table *table) 3421 { 3422 struct nft_chain *chain; 3423 struct nft_ctx ctx = { 3424 .net = net, 3425 .family = table->family, 3426 }; 3427 int err; 3428 3429 list_for_each_entry(chain, &table->chains, list) { 3430 if (!nft_is_base_chain(chain)) 3431 continue; 3432 3433 ctx.chain = chain; 3434 err = nft_chain_validate(&ctx, chain); 3435 if (err < 0) 3436 return err; 3437 } 3438 3439 return 0; 3440 } 3441 3442 static struct nft_rule *nft_rule_lookup_byid(const struct net *net, 3443 const struct nft_chain *chain, 3444 const struct nlattr *nla); 3445 3446 #define NFT_RULE_MAXEXPRS 128 3447 3448 static int nf_tables_newrule(struct sk_buff *skb, const struct nfnl_info *info, 3449 const struct nlattr * const nla[]) 3450 { 3451 struct nftables_pernet *nft_net = nft_pernet(info->net); 3452 struct netlink_ext_ack *extack = info->extack; 3453 unsigned int size, i, n, ulen = 0, usize = 0; 3454 u8 genmask = nft_genmask_next(info->net); 3455 struct nft_rule *rule, *old_rule = NULL; 3456 struct nft_expr_info *expr_info = NULL; 3457 u8 family = info->nfmsg->nfgen_family; 3458 struct nft_flow_rule *flow = NULL; 3459 struct net *net = info->net; 3460 struct nft_userdata *udata; 3461 struct nft_table *table; 3462 struct nft_chain *chain; 3463 struct nft_trans *trans; 3464 u64 handle, pos_handle; 3465 struct nft_expr *expr; 3466 struct nft_ctx ctx; 3467 struct nlattr *tmp; 3468 int err, rem; 3469 3470 lockdep_assert_held(&nft_net->commit_mutex); 3471 3472 table = nft_table_lookup(net, nla[NFTA_RULE_TABLE], family, genmask, 3473 NETLINK_CB(skb).portid); 3474 if (IS_ERR(table)) { 3475 NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_TABLE]); 3476 return PTR_ERR(table); 3477 } 3478 3479 if (nla[NFTA_RULE_CHAIN]) { 3480 chain = nft_chain_lookup(net, table, nla[NFTA_RULE_CHAIN], 3481 genmask); 3482 if (IS_ERR(chain)) { 3483 NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_CHAIN]); 3484 return PTR_ERR(chain); 3485 } 3486 if (nft_chain_is_bound(chain)) 3487 return -EOPNOTSUPP; 3488 3489 } else if (nla[NFTA_RULE_CHAIN_ID]) { 3490 chain = nft_chain_lookup_byid(net, table, nla[NFTA_RULE_CHAIN_ID]); 3491 if (IS_ERR(chain)) { 3492 NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_CHAIN_ID]); 3493 return PTR_ERR(chain); 3494 } 3495 } else { 3496 return -EINVAL; 3497 } 3498 3499 if (nla[NFTA_RULE_HANDLE]) { 3500 handle = be64_to_cpu(nla_get_be64(nla[NFTA_RULE_HANDLE])); 3501 rule = __nft_rule_lookup(chain, handle); 3502 if (IS_ERR(rule)) { 3503 NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_HANDLE]); 3504 return PTR_ERR(rule); 3505 } 3506 3507 if (info->nlh->nlmsg_flags & NLM_F_EXCL) { 3508 NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_HANDLE]); 3509 return -EEXIST; 3510 } 3511 if (info->nlh->nlmsg_flags & NLM_F_REPLACE) 3512 old_rule = rule; 3513 else 3514 return -EOPNOTSUPP; 3515 } else { 3516 if (!(info->nlh->nlmsg_flags & NLM_F_CREATE) || 3517 info->nlh->nlmsg_flags & NLM_F_REPLACE) 3518 return -EINVAL; 3519 handle = nf_tables_alloc_handle(table); 3520 3521 if (chain->use == UINT_MAX) 3522 return -EOVERFLOW; 3523 3524 if (nla[NFTA_RULE_POSITION]) { 3525 pos_handle = be64_to_cpu(nla_get_be64(nla[NFTA_RULE_POSITION])); 3526 old_rule = __nft_rule_lookup(chain, pos_handle); 3527 if (IS_ERR(old_rule)) { 3528 NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_POSITION]); 3529 return PTR_ERR(old_rule); 3530 } 3531 } else if (nla[NFTA_RULE_POSITION_ID]) { 3532 old_rule = nft_rule_lookup_byid(net, chain, nla[NFTA_RULE_POSITION_ID]); 3533 if (IS_ERR(old_rule)) { 3534 NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_POSITION_ID]); 3535 return PTR_ERR(old_rule); 3536 } 3537 } 3538 } 3539 3540 nft_ctx_init(&ctx, net, skb, info->nlh, family, table, chain, nla); 3541 3542 n = 0; 3543 size = 0; 3544 if (nla[NFTA_RULE_EXPRESSIONS]) { 3545 expr_info = kvmalloc_array(NFT_RULE_MAXEXPRS, 3546 sizeof(struct nft_expr_info), 3547 GFP_KERNEL); 3548 if (!expr_info) 3549 return -ENOMEM; 3550 3551 nla_for_each_nested(tmp, nla[NFTA_RULE_EXPRESSIONS], rem) { 3552 err = -EINVAL; 3553 if (nla_type(tmp) != NFTA_LIST_ELEM) 3554 goto err_release_expr; 3555 if (n == NFT_RULE_MAXEXPRS) 3556 goto err_release_expr; 3557 err = nf_tables_expr_parse(&ctx, tmp, &expr_info[n]); 3558 if (err < 0) { 3559 NL_SET_BAD_ATTR(extack, tmp); 3560 goto err_release_expr; 3561 } 3562 size += expr_info[n].ops->size; 3563 n++; 3564 } 3565 } 3566 /* Check for overflow of dlen field */ 3567 err = -EFBIG; 3568 if (size >= 1 << 12) 3569 goto err_release_expr; 3570 3571 if (nla[NFTA_RULE_USERDATA]) { 3572 ulen = nla_len(nla[NFTA_RULE_USERDATA]); 3573 if (ulen > 0) 3574 usize = sizeof(struct nft_userdata) + ulen; 3575 } 3576 3577 err = -ENOMEM; 3578 rule = kzalloc(sizeof(*rule) + size + usize, GFP_KERNEL_ACCOUNT); 3579 if (rule == NULL) 3580 goto err_release_expr; 3581 3582 nft_activate_next(net, rule); 3583 3584 rule->handle = handle; 3585 rule->dlen = size; 3586 rule->udata = ulen ? 1 : 0; 3587 3588 if (ulen) { 3589 udata = nft_userdata(rule); 3590 udata->len = ulen - 1; 3591 nla_memcpy(udata->data, nla[NFTA_RULE_USERDATA], ulen); 3592 } 3593 3594 expr = nft_expr_first(rule); 3595 for (i = 0; i < n; i++) { 3596 err = nf_tables_newexpr(&ctx, &expr_info[i], expr); 3597 if (err < 0) { 3598 NL_SET_BAD_ATTR(extack, expr_info[i].attr); 3599 goto err_release_rule; 3600 } 3601 3602 if (expr_info[i].ops->validate) 3603 nft_validate_state_update(net, NFT_VALIDATE_NEED); 3604 3605 expr_info[i].ops = NULL; 3606 expr = nft_expr_next(expr); 3607 } 3608 3609 if (chain->flags & NFT_CHAIN_HW_OFFLOAD) { 3610 flow = nft_flow_rule_create(net, rule); 3611 if (IS_ERR(flow)) { 3612 err = PTR_ERR(flow); 3613 goto err_release_rule; 3614 } 3615 } 3616 3617 if (info->nlh->nlmsg_flags & NLM_F_REPLACE) { 3618 err = nft_delrule(&ctx, old_rule); 3619 if (err < 0) 3620 goto err_destroy_flow_rule; 3621 3622 trans = nft_trans_rule_add(&ctx, NFT_MSG_NEWRULE, rule); 3623 if (trans == NULL) { 3624 err = -ENOMEM; 3625 goto err_destroy_flow_rule; 3626 } 3627 list_add_tail_rcu(&rule->list, &old_rule->list); 3628 } else { 3629 trans = nft_trans_rule_add(&ctx, NFT_MSG_NEWRULE, rule); 3630 if (!trans) { 3631 err = -ENOMEM; 3632 goto err_destroy_flow_rule; 3633 } 3634 3635 if (info->nlh->nlmsg_flags & NLM_F_APPEND) { 3636 if (old_rule) 3637 list_add_rcu(&rule->list, &old_rule->list); 3638 else 3639 list_add_tail_rcu(&rule->list, &chain->rules); 3640 } else { 3641 if (old_rule) 3642 list_add_tail_rcu(&rule->list, &old_rule->list); 3643 else 3644 list_add_rcu(&rule->list, &chain->rules); 3645 } 3646 } 3647 kvfree(expr_info); 3648 chain->use++; 3649 3650 if (flow) 3651 nft_trans_flow_rule(trans) = flow; 3652 3653 if (nft_net->validate_state == NFT_VALIDATE_DO) 3654 return nft_table_validate(net, table); 3655 3656 return 0; 3657 3658 err_destroy_flow_rule: 3659 if (flow) 3660 nft_flow_rule_destroy(flow); 3661 err_release_rule: 3662 nf_tables_rule_release(&ctx, rule); 3663 err_release_expr: 3664 for (i = 0; i < n; i++) { 3665 if (expr_info[i].ops) { 3666 module_put(expr_info[i].ops->type->owner); 3667 if (expr_info[i].ops->type->release_ops) 3668 expr_info[i].ops->type->release_ops(expr_info[i].ops); 3669 } 3670 } 3671 kvfree(expr_info); 3672 3673 return err; 3674 } 3675 3676 static struct nft_rule *nft_rule_lookup_byid(const struct net *net, 3677 const struct nft_chain *chain, 3678 const struct nlattr *nla) 3679 { 3680 struct nftables_pernet *nft_net = nft_pernet(net); 3681 u32 id = ntohl(nla_get_be32(nla)); 3682 struct nft_trans *trans; 3683 3684 list_for_each_entry(trans, &nft_net->commit_list, list) { 3685 struct nft_rule *rule = nft_trans_rule(trans); 3686 3687 if (trans->msg_type == NFT_MSG_NEWRULE && 3688 trans->ctx.chain == chain && 3689 id == nft_trans_rule_id(trans)) 3690 return rule; 3691 } 3692 return ERR_PTR(-ENOENT); 3693 } 3694 3695 static int nf_tables_delrule(struct sk_buff *skb, const struct nfnl_info *info, 3696 const struct nlattr * const nla[]) 3697 { 3698 struct netlink_ext_ack *extack = info->extack; 3699 u8 genmask = nft_genmask_next(info->net); 3700 u8 family = info->nfmsg->nfgen_family; 3701 struct nft_chain *chain = NULL; 3702 struct net *net = info->net; 3703 struct nft_table *table; 3704 struct nft_rule *rule; 3705 struct nft_ctx ctx; 3706 int err = 0; 3707 3708 table = nft_table_lookup(net, nla[NFTA_RULE_TABLE], family, genmask, 3709 NETLINK_CB(skb).portid); 3710 if (IS_ERR(table)) { 3711 NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_TABLE]); 3712 return PTR_ERR(table); 3713 } 3714 3715 if (nla[NFTA_RULE_CHAIN]) { 3716 chain = nft_chain_lookup(net, table, nla[NFTA_RULE_CHAIN], 3717 genmask); 3718 if (IS_ERR(chain)) { 3719 NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_CHAIN]); 3720 return PTR_ERR(chain); 3721 } 3722 if (nft_chain_is_bound(chain)) 3723 return -EOPNOTSUPP; 3724 } 3725 3726 nft_ctx_init(&ctx, net, skb, info->nlh, family, table, chain, nla); 3727 3728 if (chain) { 3729 if (nla[NFTA_RULE_HANDLE]) { 3730 rule = nft_rule_lookup(chain, nla[NFTA_RULE_HANDLE]); 3731 if (IS_ERR(rule)) { 3732 NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_HANDLE]); 3733 return PTR_ERR(rule); 3734 } 3735 3736 err = nft_delrule(&ctx, rule); 3737 } else if (nla[NFTA_RULE_ID]) { 3738 rule = nft_rule_lookup_byid(net, chain, nla[NFTA_RULE_ID]); 3739 if (IS_ERR(rule)) { 3740 NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_ID]); 3741 return PTR_ERR(rule); 3742 } 3743 3744 err = nft_delrule(&ctx, rule); 3745 } else { 3746 err = nft_delrule_by_chain(&ctx); 3747 } 3748 } else { 3749 list_for_each_entry(chain, &table->chains, list) { 3750 if (!nft_is_active_next(net, chain)) 3751 continue; 3752 3753 ctx.chain = chain; 3754 err = nft_delrule_by_chain(&ctx); 3755 if (err < 0) 3756 break; 3757 } 3758 } 3759 3760 return err; 3761 } 3762 3763 /* 3764 * Sets 3765 */ 3766 static const struct nft_set_type *nft_set_types[] = { 3767 &nft_set_hash_fast_type, 3768 &nft_set_hash_type, 3769 &nft_set_rhash_type, 3770 &nft_set_bitmap_type, 3771 &nft_set_rbtree_type, 3772 #if defined(CONFIG_X86_64) && !defined(CONFIG_UML) 3773 &nft_set_pipapo_avx2_type, 3774 #endif 3775 &nft_set_pipapo_type, 3776 }; 3777 3778 #define NFT_SET_FEATURES (NFT_SET_INTERVAL | NFT_SET_MAP | \ 3779 NFT_SET_TIMEOUT | NFT_SET_OBJECT | \ 3780 NFT_SET_EVAL) 3781 3782 static bool nft_set_ops_candidate(const struct nft_set_type *type, u32 flags) 3783 { 3784 return (flags & type->features) == (flags & NFT_SET_FEATURES); 3785 } 3786 3787 /* 3788 * Select a set implementation based on the data characteristics and the 3789 * given policy. The total memory use might not be known if no size is 3790 * given, in that case the amount of memory per element is used. 3791 */ 3792 static const struct nft_set_ops * 3793 nft_select_set_ops(const struct nft_ctx *ctx, 3794 const struct nlattr * const nla[], 3795 const struct nft_set_desc *desc) 3796 { 3797 struct nftables_pernet *nft_net = nft_pernet(ctx->net); 3798 const struct nft_set_ops *ops, *bops; 3799 struct nft_set_estimate est, best; 3800 const struct nft_set_type *type; 3801 u32 flags = 0; 3802 int i; 3803 3804 lockdep_assert_held(&nft_net->commit_mutex); 3805 lockdep_nfnl_nft_mutex_not_held(); 3806 3807 if (nla[NFTA_SET_FLAGS] != NULL) 3808 flags = ntohl(nla_get_be32(nla[NFTA_SET_FLAGS])); 3809 3810 bops = NULL; 3811 best.size = ~0; 3812 best.lookup = ~0; 3813 best.space = ~0; 3814 3815 for (i = 0; i < ARRAY_SIZE(nft_set_types); i++) { 3816 type = nft_set_types[i]; 3817 ops = &type->ops; 3818 3819 if (!nft_set_ops_candidate(type, flags)) 3820 continue; 3821 if (!ops->estimate(desc, flags, &est)) 3822 continue; 3823 3824 switch (desc->policy) { 3825 case NFT_SET_POL_PERFORMANCE: 3826 if (est.lookup < best.lookup) 3827 break; 3828 if (est.lookup == best.lookup && 3829 est.space < best.space) 3830 break; 3831 continue; 3832 case NFT_SET_POL_MEMORY: 3833 if (!desc->size) { 3834 if (est.space < best.space) 3835 break; 3836 if (est.space == best.space && 3837 est.lookup < best.lookup) 3838 break; 3839 } else if (est.size < best.size || !bops) { 3840 break; 3841 } 3842 continue; 3843 default: 3844 break; 3845 } 3846 3847 bops = ops; 3848 best = est; 3849 } 3850 3851 if (bops != NULL) 3852 return bops; 3853 3854 return ERR_PTR(-EOPNOTSUPP); 3855 } 3856 3857 static const struct nla_policy nft_set_policy[NFTA_SET_MAX + 1] = { 3858 [NFTA_SET_TABLE] = { .type = NLA_STRING, 3859 .len = NFT_TABLE_MAXNAMELEN - 1 }, 3860 [NFTA_SET_NAME] = { .type = NLA_STRING, 3861 .len = NFT_SET_MAXNAMELEN - 1 }, 3862 [NFTA_SET_FLAGS] = { .type = NLA_U32 }, 3863 [NFTA_SET_KEY_TYPE] = { .type = NLA_U32 }, 3864 [NFTA_SET_KEY_LEN] = { .type = NLA_U32 }, 3865 [NFTA_SET_DATA_TYPE] = { .type = NLA_U32 }, 3866 [NFTA_SET_DATA_LEN] = { .type = NLA_U32 }, 3867 [NFTA_SET_POLICY] = { .type = NLA_U32 }, 3868 [NFTA_SET_DESC] = { .type = NLA_NESTED }, 3869 [NFTA_SET_ID] = { .type = NLA_U32 }, 3870 [NFTA_SET_TIMEOUT] = { .type = NLA_U64 }, 3871 [NFTA_SET_GC_INTERVAL] = { .type = NLA_U32 }, 3872 [NFTA_SET_USERDATA] = { .type = NLA_BINARY, 3873 .len = NFT_USERDATA_MAXLEN }, 3874 [NFTA_SET_OBJ_TYPE] = { .type = NLA_U32 }, 3875 [NFTA_SET_HANDLE] = { .type = NLA_U64 }, 3876 [NFTA_SET_EXPR] = { .type = NLA_NESTED }, 3877 [NFTA_SET_EXPRESSIONS] = { .type = NLA_NESTED }, 3878 }; 3879 3880 static const struct nla_policy nft_set_desc_policy[NFTA_SET_DESC_MAX + 1] = { 3881 [NFTA_SET_DESC_SIZE] = { .type = NLA_U32 }, 3882 [NFTA_SET_DESC_CONCAT] = { .type = NLA_NESTED }, 3883 }; 3884 3885 static struct nft_set *nft_set_lookup(const struct nft_table *table, 3886 const struct nlattr *nla, u8 genmask) 3887 { 3888 struct nft_set *set; 3889 3890 if (nla == NULL) 3891 return ERR_PTR(-EINVAL); 3892 3893 list_for_each_entry_rcu(set, &table->sets, list) { 3894 if (!nla_strcmp(nla, set->name) && 3895 nft_active_genmask(set, genmask)) 3896 return set; 3897 } 3898 return ERR_PTR(-ENOENT); 3899 } 3900 3901 static struct nft_set *nft_set_lookup_byhandle(const struct nft_table *table, 3902 const struct nlattr *nla, 3903 u8 genmask) 3904 { 3905 struct nft_set *set; 3906 3907 list_for_each_entry(set, &table->sets, list) { 3908 if (be64_to_cpu(nla_get_be64(nla)) == set->handle && 3909 nft_active_genmask(set, genmask)) 3910 return set; 3911 } 3912 return ERR_PTR(-ENOENT); 3913 } 3914 3915 static struct nft_set *nft_set_lookup_byid(const struct net *net, 3916 const struct nft_table *table, 3917 const struct nlattr *nla, u8 genmask) 3918 { 3919 struct nftables_pernet *nft_net = nft_pernet(net); 3920 u32 id = ntohl(nla_get_be32(nla)); 3921 struct nft_trans *trans; 3922 3923 list_for_each_entry(trans, &nft_net->commit_list, list) { 3924 if (trans->msg_type == NFT_MSG_NEWSET) { 3925 struct nft_set *set = nft_trans_set(trans); 3926 3927 if (id == nft_trans_set_id(trans) && 3928 set->table == table && 3929 nft_active_genmask(set, genmask)) 3930 return set; 3931 } 3932 } 3933 return ERR_PTR(-ENOENT); 3934 } 3935 3936 struct nft_set *nft_set_lookup_global(const struct net *net, 3937 const struct nft_table *table, 3938 const struct nlattr *nla_set_name, 3939 const struct nlattr *nla_set_id, 3940 u8 genmask) 3941 { 3942 struct nft_set *set; 3943 3944 set = nft_set_lookup(table, nla_set_name, genmask); 3945 if (IS_ERR(set)) { 3946 if (!nla_set_id) 3947 return set; 3948 3949 set = nft_set_lookup_byid(net, table, nla_set_id, genmask); 3950 } 3951 return set; 3952 } 3953 EXPORT_SYMBOL_GPL(nft_set_lookup_global); 3954 3955 static int nf_tables_set_alloc_name(struct nft_ctx *ctx, struct nft_set *set, 3956 const char *name) 3957 { 3958 const struct nft_set *i; 3959 const char *p; 3960 unsigned long *inuse; 3961 unsigned int n = 0, min = 0; 3962 3963 p = strchr(name, '%'); 3964 if (p != NULL) { 3965 if (p[1] != 'd' || strchr(p + 2, '%')) 3966 return -EINVAL; 3967 3968 inuse = (unsigned long *)get_zeroed_page(GFP_KERNEL); 3969 if (inuse == NULL) 3970 return -ENOMEM; 3971 cont: 3972 list_for_each_entry(i, &ctx->table->sets, list) { 3973 int tmp; 3974 3975 if (!nft_is_active_next(ctx->net, i)) 3976 continue; 3977 if (!sscanf(i->name, name, &tmp)) 3978 continue; 3979 if (tmp < min || tmp >= min + BITS_PER_BYTE * PAGE_SIZE) 3980 continue; 3981 3982 set_bit(tmp - min, inuse); 3983 } 3984 3985 n = find_first_zero_bit(inuse, BITS_PER_BYTE * PAGE_SIZE); 3986 if (n >= BITS_PER_BYTE * PAGE_SIZE) { 3987 min += BITS_PER_BYTE * PAGE_SIZE; 3988 memset(inuse, 0, PAGE_SIZE); 3989 goto cont; 3990 } 3991 free_page((unsigned long)inuse); 3992 } 3993 3994 set->name = kasprintf(GFP_KERNEL_ACCOUNT, name, min + n); 3995 if (!set->name) 3996 return -ENOMEM; 3997 3998 list_for_each_entry(i, &ctx->table->sets, list) { 3999 if (!nft_is_active_next(ctx->net, i)) 4000 continue; 4001 if (!strcmp(set->name, i->name)) { 4002 kfree(set->name); 4003 set->name = NULL; 4004 return -ENFILE; 4005 } 4006 } 4007 return 0; 4008 } 4009 4010 int nf_msecs_to_jiffies64(const struct nlattr *nla, u64 *result) 4011 { 4012 u64 ms = be64_to_cpu(nla_get_be64(nla)); 4013 u64 max = (u64)(~((u64)0)); 4014 4015 max = div_u64(max, NSEC_PER_MSEC); 4016 if (ms >= max) 4017 return -ERANGE; 4018 4019 ms *= NSEC_PER_MSEC; 4020 *result = nsecs_to_jiffies64(ms); 4021 return 0; 4022 } 4023 4024 __be64 nf_jiffies64_to_msecs(u64 input) 4025 { 4026 return cpu_to_be64(jiffies64_to_msecs(input)); 4027 } 4028 4029 static int nf_tables_fill_set_concat(struct sk_buff *skb, 4030 const struct nft_set *set) 4031 { 4032 struct nlattr *concat, *field; 4033 int i; 4034 4035 concat = nla_nest_start_noflag(skb, NFTA_SET_DESC_CONCAT); 4036 if (!concat) 4037 return -ENOMEM; 4038 4039 for (i = 0; i < set->field_count; i++) { 4040 field = nla_nest_start_noflag(skb, NFTA_LIST_ELEM); 4041 if (!field) 4042 return -ENOMEM; 4043 4044 if (nla_put_be32(skb, NFTA_SET_FIELD_LEN, 4045 htonl(set->field_len[i]))) 4046 return -ENOMEM; 4047 4048 nla_nest_end(skb, field); 4049 } 4050 4051 nla_nest_end(skb, concat); 4052 4053 return 0; 4054 } 4055 4056 static int nf_tables_fill_set(struct sk_buff *skb, const struct nft_ctx *ctx, 4057 const struct nft_set *set, u16 event, u16 flags) 4058 { 4059 u64 timeout = READ_ONCE(set->timeout); 4060 u32 gc_int = READ_ONCE(set->gc_int); 4061 u32 portid = ctx->portid; 4062 struct nlmsghdr *nlh; 4063 struct nlattr *nest; 4064 u32 seq = ctx->seq; 4065 int i; 4066 4067 event = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event); 4068 nlh = nfnl_msg_put(skb, portid, seq, event, flags, ctx->family, 4069 NFNETLINK_V0, nft_base_seq(ctx->net)); 4070 if (!nlh) 4071 goto nla_put_failure; 4072 4073 if (nla_put_string(skb, NFTA_SET_TABLE, ctx->table->name)) 4074 goto nla_put_failure; 4075 if (nla_put_string(skb, NFTA_SET_NAME, set->name)) 4076 goto nla_put_failure; 4077 if (nla_put_be64(skb, NFTA_SET_HANDLE, cpu_to_be64(set->handle), 4078 NFTA_SET_PAD)) 4079 goto nla_put_failure; 4080 if (set->flags != 0) 4081 if (nla_put_be32(skb, NFTA_SET_FLAGS, htonl(set->flags))) 4082 goto nla_put_failure; 4083 4084 if (nla_put_be32(skb, NFTA_SET_KEY_TYPE, htonl(set->ktype))) 4085 goto nla_put_failure; 4086 if (nla_put_be32(skb, NFTA_SET_KEY_LEN, htonl(set->klen))) 4087 goto nla_put_failure; 4088 if (set->flags & NFT_SET_MAP) { 4089 if (nla_put_be32(skb, NFTA_SET_DATA_TYPE, htonl(set->dtype))) 4090 goto nla_put_failure; 4091 if (nla_put_be32(skb, NFTA_SET_DATA_LEN, htonl(set->dlen))) 4092 goto nla_put_failure; 4093 } 4094 if (set->flags & NFT_SET_OBJECT && 4095 nla_put_be32(skb, NFTA_SET_OBJ_TYPE, htonl(set->objtype))) 4096 goto nla_put_failure; 4097 4098 if (timeout && 4099 nla_put_be64(skb, NFTA_SET_TIMEOUT, 4100 nf_jiffies64_to_msecs(timeout), 4101 NFTA_SET_PAD)) 4102 goto nla_put_failure; 4103 if (gc_int && 4104 nla_put_be32(skb, NFTA_SET_GC_INTERVAL, htonl(gc_int))) 4105 goto nla_put_failure; 4106 4107 if (set->policy != NFT_SET_POL_PERFORMANCE) { 4108 if (nla_put_be32(skb, NFTA_SET_POLICY, htonl(set->policy))) 4109 goto nla_put_failure; 4110 } 4111 4112 if (set->udata && 4113 nla_put(skb, NFTA_SET_USERDATA, set->udlen, set->udata)) 4114 goto nla_put_failure; 4115 4116 nest = nla_nest_start_noflag(skb, NFTA_SET_DESC); 4117 if (!nest) 4118 goto nla_put_failure; 4119 if (set->size && 4120 nla_put_be32(skb, NFTA_SET_DESC_SIZE, htonl(set->size))) 4121 goto nla_put_failure; 4122 4123 if (set->field_count > 1 && 4124 nf_tables_fill_set_concat(skb, set)) 4125 goto nla_put_failure; 4126 4127 nla_nest_end(skb, nest); 4128 4129 if (set->num_exprs == 1) { 4130 nest = nla_nest_start_noflag(skb, NFTA_SET_EXPR); 4131 if (nf_tables_fill_expr_info(skb, set->exprs[0], false) < 0) 4132 goto nla_put_failure; 4133 4134 nla_nest_end(skb, nest); 4135 } else if (set->num_exprs > 1) { 4136 nest = nla_nest_start_noflag(skb, NFTA_SET_EXPRESSIONS); 4137 if (nest == NULL) 4138 goto nla_put_failure; 4139 4140 for (i = 0; i < set->num_exprs; i++) { 4141 if (nft_expr_dump(skb, NFTA_LIST_ELEM, 4142 set->exprs[i], false) < 0) 4143 goto nla_put_failure; 4144 } 4145 nla_nest_end(skb, nest); 4146 } 4147 4148 nlmsg_end(skb, nlh); 4149 return 0; 4150 4151 nla_put_failure: 4152 nlmsg_trim(skb, nlh); 4153 return -1; 4154 } 4155 4156 static void nf_tables_set_notify(const struct nft_ctx *ctx, 4157 const struct nft_set *set, int event, 4158 gfp_t gfp_flags) 4159 { 4160 struct nftables_pernet *nft_net = nft_pernet(ctx->net); 4161 u32 portid = ctx->portid; 4162 struct sk_buff *skb; 4163 u16 flags = 0; 4164 int err; 4165 4166 if (!ctx->report && 4167 !nfnetlink_has_listeners(ctx->net, NFNLGRP_NFTABLES)) 4168 return; 4169 4170 skb = nlmsg_new(NLMSG_GOODSIZE, gfp_flags); 4171 if (skb == NULL) 4172 goto err; 4173 4174 if (ctx->flags & (NLM_F_CREATE | NLM_F_EXCL)) 4175 flags |= ctx->flags & (NLM_F_CREATE | NLM_F_EXCL); 4176 4177 err = nf_tables_fill_set(skb, ctx, set, event, flags); 4178 if (err < 0) { 4179 kfree_skb(skb); 4180 goto err; 4181 } 4182 4183 nft_notify_enqueue(skb, ctx->report, &nft_net->notify_list); 4184 return; 4185 err: 4186 nfnetlink_set_err(ctx->net, portid, NFNLGRP_NFTABLES, -ENOBUFS); 4187 } 4188 4189 static int nf_tables_dump_sets(struct sk_buff *skb, struct netlink_callback *cb) 4190 { 4191 const struct nft_set *set; 4192 unsigned int idx, s_idx = cb->args[0]; 4193 struct nft_table *table, *cur_table = (struct nft_table *)cb->args[2]; 4194 struct net *net = sock_net(skb->sk); 4195 struct nft_ctx *ctx = cb->data, ctx_set; 4196 struct nftables_pernet *nft_net; 4197 4198 if (cb->args[1]) 4199 return skb->len; 4200 4201 rcu_read_lock(); 4202 nft_net = nft_pernet(net); 4203 cb->seq = READ_ONCE(nft_net->base_seq); 4204 4205 list_for_each_entry_rcu(table, &nft_net->tables, list) { 4206 if (ctx->family != NFPROTO_UNSPEC && 4207 ctx->family != table->family) 4208 continue; 4209 4210 if (ctx->table && ctx->table != table) 4211 continue; 4212 4213 if (cur_table) { 4214 if (cur_table != table) 4215 continue; 4216 4217 cur_table = NULL; 4218 } 4219 idx = 0; 4220 list_for_each_entry_rcu(set, &table->sets, list) { 4221 if (idx < s_idx) 4222 goto cont; 4223 if (!nft_is_active(net, set)) 4224 goto cont; 4225 4226 ctx_set = *ctx; 4227 ctx_set.table = table; 4228 ctx_set.family = table->family; 4229 4230 if (nf_tables_fill_set(skb, &ctx_set, set, 4231 NFT_MSG_NEWSET, 4232 NLM_F_MULTI) < 0) { 4233 cb->args[0] = idx; 4234 cb->args[2] = (unsigned long) table; 4235 goto done; 4236 } 4237 nl_dump_check_consistent(cb, nlmsg_hdr(skb)); 4238 cont: 4239 idx++; 4240 } 4241 if (s_idx) 4242 s_idx = 0; 4243 } 4244 cb->args[1] = 1; 4245 done: 4246 rcu_read_unlock(); 4247 return skb->len; 4248 } 4249 4250 static int nf_tables_dump_sets_start(struct netlink_callback *cb) 4251 { 4252 struct nft_ctx *ctx_dump = NULL; 4253 4254 ctx_dump = kmemdup(cb->data, sizeof(*ctx_dump), GFP_ATOMIC); 4255 if (ctx_dump == NULL) 4256 return -ENOMEM; 4257 4258 cb->data = ctx_dump; 4259 return 0; 4260 } 4261 4262 static int nf_tables_dump_sets_done(struct netlink_callback *cb) 4263 { 4264 kfree(cb->data); 4265 return 0; 4266 } 4267 4268 /* called with rcu_read_lock held */ 4269 static int nf_tables_getset(struct sk_buff *skb, const struct nfnl_info *info, 4270 const struct nlattr * const nla[]) 4271 { 4272 struct netlink_ext_ack *extack = info->extack; 4273 u8 genmask = nft_genmask_cur(info->net); 4274 u8 family = info->nfmsg->nfgen_family; 4275 struct nft_table *table = NULL; 4276 struct net *net = info->net; 4277 const struct nft_set *set; 4278 struct sk_buff *skb2; 4279 struct nft_ctx ctx; 4280 int err; 4281 4282 if (nla[NFTA_SET_TABLE]) { 4283 table = nft_table_lookup(net, nla[NFTA_SET_TABLE], family, 4284 genmask, 0); 4285 if (IS_ERR(table)) { 4286 NL_SET_BAD_ATTR(extack, nla[NFTA_SET_TABLE]); 4287 return PTR_ERR(table); 4288 } 4289 } 4290 4291 nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla); 4292 4293 if (info->nlh->nlmsg_flags & NLM_F_DUMP) { 4294 struct netlink_dump_control c = { 4295 .start = nf_tables_dump_sets_start, 4296 .dump = nf_tables_dump_sets, 4297 .done = nf_tables_dump_sets_done, 4298 .data = &ctx, 4299 .module = THIS_MODULE, 4300 }; 4301 4302 return nft_netlink_dump_start_rcu(info->sk, skb, info->nlh, &c); 4303 } 4304 4305 /* Only accept unspec with dump */ 4306 if (info->nfmsg->nfgen_family == NFPROTO_UNSPEC) 4307 return -EAFNOSUPPORT; 4308 if (!nla[NFTA_SET_TABLE]) 4309 return -EINVAL; 4310 4311 set = nft_set_lookup(table, nla[NFTA_SET_NAME], genmask); 4312 if (IS_ERR(set)) 4313 return PTR_ERR(set); 4314 4315 skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC); 4316 if (skb2 == NULL) 4317 return -ENOMEM; 4318 4319 err = nf_tables_fill_set(skb2, &ctx, set, NFT_MSG_NEWSET, 0); 4320 if (err < 0) 4321 goto err_fill_set_info; 4322 4323 return nfnetlink_unicast(skb2, net, NETLINK_CB(skb).portid); 4324 4325 err_fill_set_info: 4326 kfree_skb(skb2); 4327 return err; 4328 } 4329 4330 static const struct nla_policy nft_concat_policy[NFTA_SET_FIELD_MAX + 1] = { 4331 [NFTA_SET_FIELD_LEN] = { .type = NLA_U32 }, 4332 }; 4333 4334 static int nft_set_desc_concat_parse(const struct nlattr *attr, 4335 struct nft_set_desc *desc) 4336 { 4337 struct nlattr *tb[NFTA_SET_FIELD_MAX + 1]; 4338 u32 len; 4339 int err; 4340 4341 if (desc->field_count >= ARRAY_SIZE(desc->field_len)) 4342 return -E2BIG; 4343 4344 err = nla_parse_nested_deprecated(tb, NFTA_SET_FIELD_MAX, attr, 4345 nft_concat_policy, NULL); 4346 if (err < 0) 4347 return err; 4348 4349 if (!tb[NFTA_SET_FIELD_LEN]) 4350 return -EINVAL; 4351 4352 len = ntohl(nla_get_be32(tb[NFTA_SET_FIELD_LEN])); 4353 if (!len || len > U8_MAX) 4354 return -EINVAL; 4355 4356 desc->field_len[desc->field_count++] = len; 4357 4358 return 0; 4359 } 4360 4361 static int nft_set_desc_concat(struct nft_set_desc *desc, 4362 const struct nlattr *nla) 4363 { 4364 struct nlattr *attr; 4365 u32 num_regs = 0; 4366 int rem, err, i; 4367 4368 nla_for_each_nested(attr, nla, rem) { 4369 if (nla_type(attr) != NFTA_LIST_ELEM) 4370 return -EINVAL; 4371 4372 err = nft_set_desc_concat_parse(attr, desc); 4373 if (err < 0) 4374 return err; 4375 } 4376 4377 for (i = 0; i < desc->field_count; i++) 4378 num_regs += DIV_ROUND_UP(desc->field_len[i], sizeof(u32)); 4379 4380 if (num_regs > NFT_REG32_COUNT) 4381 return -E2BIG; 4382 4383 return 0; 4384 } 4385 4386 static int nf_tables_set_desc_parse(struct nft_set_desc *desc, 4387 const struct nlattr *nla) 4388 { 4389 struct nlattr *da[NFTA_SET_DESC_MAX + 1]; 4390 int err; 4391 4392 err = nla_parse_nested_deprecated(da, NFTA_SET_DESC_MAX, nla, 4393 nft_set_desc_policy, NULL); 4394 if (err < 0) 4395 return err; 4396 4397 if (da[NFTA_SET_DESC_SIZE] != NULL) 4398 desc->size = ntohl(nla_get_be32(da[NFTA_SET_DESC_SIZE])); 4399 if (da[NFTA_SET_DESC_CONCAT]) 4400 err = nft_set_desc_concat(desc, da[NFTA_SET_DESC_CONCAT]); 4401 4402 return err; 4403 } 4404 4405 static int nft_set_expr_alloc(struct nft_ctx *ctx, struct nft_set *set, 4406 const struct nlattr * const *nla, 4407 struct nft_expr **exprs, int *num_exprs, 4408 u32 flags) 4409 { 4410 struct nft_expr *expr; 4411 int err, i; 4412 4413 if (nla[NFTA_SET_EXPR]) { 4414 expr = nft_set_elem_expr_alloc(ctx, set, nla[NFTA_SET_EXPR]); 4415 if (IS_ERR(expr)) { 4416 err = PTR_ERR(expr); 4417 goto err_set_expr_alloc; 4418 } 4419 exprs[0] = expr; 4420 (*num_exprs)++; 4421 } else if (nla[NFTA_SET_EXPRESSIONS]) { 4422 struct nlattr *tmp; 4423 int left; 4424 4425 if (!(flags & NFT_SET_EXPR)) { 4426 err = -EINVAL; 4427 goto err_set_expr_alloc; 4428 } 4429 i = 0; 4430 nla_for_each_nested(tmp, nla[NFTA_SET_EXPRESSIONS], left) { 4431 if (i == NFT_SET_EXPR_MAX) { 4432 err = -E2BIG; 4433 goto err_set_expr_alloc; 4434 } 4435 if (nla_type(tmp) != NFTA_LIST_ELEM) { 4436 err = -EINVAL; 4437 goto err_set_expr_alloc; 4438 } 4439 expr = nft_set_elem_expr_alloc(ctx, set, tmp); 4440 if (IS_ERR(expr)) { 4441 err = PTR_ERR(expr); 4442 goto err_set_expr_alloc; 4443 } 4444 exprs[i++] = expr; 4445 (*num_exprs)++; 4446 } 4447 } 4448 4449 return 0; 4450 4451 err_set_expr_alloc: 4452 for (i = 0; i < *num_exprs; i++) 4453 nft_expr_destroy(ctx, exprs[i]); 4454 4455 return err; 4456 } 4457 4458 static bool nft_set_is_same(const struct nft_set *set, 4459 const struct nft_set_desc *desc, 4460 struct nft_expr *exprs[], u32 num_exprs, u32 flags) 4461 { 4462 int i; 4463 4464 if (set->ktype != desc->ktype || 4465 set->dtype != desc->dtype || 4466 set->flags != flags || 4467 set->klen != desc->klen || 4468 set->dlen != desc->dlen || 4469 set->field_count != desc->field_count || 4470 set->num_exprs != num_exprs) 4471 return false; 4472 4473 for (i = 0; i < desc->field_count; i++) { 4474 if (set->field_len[i] != desc->field_len[i]) 4475 return false; 4476 } 4477 4478 for (i = 0; i < num_exprs; i++) { 4479 if (set->exprs[i]->ops != exprs[i]->ops) 4480 return false; 4481 } 4482 4483 return true; 4484 } 4485 4486 static int nf_tables_newset(struct sk_buff *skb, const struct nfnl_info *info, 4487 const struct nlattr * const nla[]) 4488 { 4489 struct netlink_ext_ack *extack = info->extack; 4490 u8 genmask = nft_genmask_next(info->net); 4491 u8 family = info->nfmsg->nfgen_family; 4492 const struct nft_set_ops *ops; 4493 struct net *net = info->net; 4494 struct nft_set_desc desc; 4495 struct nft_table *table; 4496 unsigned char *udata; 4497 struct nft_set *set; 4498 struct nft_ctx ctx; 4499 size_t alloc_size; 4500 int num_exprs = 0; 4501 char *name; 4502 int err, i; 4503 u16 udlen; 4504 u32 flags; 4505 u64 size; 4506 4507 if (nla[NFTA_SET_TABLE] == NULL || 4508 nla[NFTA_SET_NAME] == NULL || 4509 nla[NFTA_SET_KEY_LEN] == NULL || 4510 nla[NFTA_SET_ID] == NULL) 4511 return -EINVAL; 4512 4513 memset(&desc, 0, sizeof(desc)); 4514 4515 desc.ktype = NFT_DATA_VALUE; 4516 if (nla[NFTA_SET_KEY_TYPE] != NULL) { 4517 desc.ktype = ntohl(nla_get_be32(nla[NFTA_SET_KEY_TYPE])); 4518 if ((desc.ktype & NFT_DATA_RESERVED_MASK) == NFT_DATA_RESERVED_MASK) 4519 return -EINVAL; 4520 } 4521 4522 desc.klen = ntohl(nla_get_be32(nla[NFTA_SET_KEY_LEN])); 4523 if (desc.klen == 0 || desc.klen > NFT_DATA_VALUE_MAXLEN) 4524 return -EINVAL; 4525 4526 flags = 0; 4527 if (nla[NFTA_SET_FLAGS] != NULL) { 4528 flags = ntohl(nla_get_be32(nla[NFTA_SET_FLAGS])); 4529 if (flags & ~(NFT_SET_ANONYMOUS | NFT_SET_CONSTANT | 4530 NFT_SET_INTERVAL | NFT_SET_TIMEOUT | 4531 NFT_SET_MAP | NFT_SET_EVAL | 4532 NFT_SET_OBJECT | NFT_SET_CONCAT | NFT_SET_EXPR)) 4533 return -EOPNOTSUPP; 4534 /* Only one of these operations is supported */ 4535 if ((flags & (NFT_SET_MAP | NFT_SET_OBJECT)) == 4536 (NFT_SET_MAP | NFT_SET_OBJECT)) 4537 return -EOPNOTSUPP; 4538 if ((flags & (NFT_SET_EVAL | NFT_SET_OBJECT)) == 4539 (NFT_SET_EVAL | NFT_SET_OBJECT)) 4540 return -EOPNOTSUPP; 4541 } 4542 4543 desc.dtype = 0; 4544 if (nla[NFTA_SET_DATA_TYPE] != NULL) { 4545 if (!(flags & NFT_SET_MAP)) 4546 return -EINVAL; 4547 4548 desc.dtype = ntohl(nla_get_be32(nla[NFTA_SET_DATA_TYPE])); 4549 if ((desc.dtype & NFT_DATA_RESERVED_MASK) == NFT_DATA_RESERVED_MASK && 4550 desc.dtype != NFT_DATA_VERDICT) 4551 return -EINVAL; 4552 4553 if (desc.dtype != NFT_DATA_VERDICT) { 4554 if (nla[NFTA_SET_DATA_LEN] == NULL) 4555 return -EINVAL; 4556 desc.dlen = ntohl(nla_get_be32(nla[NFTA_SET_DATA_LEN])); 4557 if (desc.dlen == 0 || desc.dlen > NFT_DATA_VALUE_MAXLEN) 4558 return -EINVAL; 4559 } else 4560 desc.dlen = sizeof(struct nft_verdict); 4561 } else if (flags & NFT_SET_MAP) 4562 return -EINVAL; 4563 4564 if (nla[NFTA_SET_OBJ_TYPE] != NULL) { 4565 if (!(flags & NFT_SET_OBJECT)) 4566 return -EINVAL; 4567 4568 desc.objtype = ntohl(nla_get_be32(nla[NFTA_SET_OBJ_TYPE])); 4569 if (desc.objtype == NFT_OBJECT_UNSPEC || 4570 desc.objtype > NFT_OBJECT_MAX) 4571 return -EOPNOTSUPP; 4572 } else if (flags & NFT_SET_OBJECT) 4573 return -EINVAL; 4574 else 4575 desc.objtype = NFT_OBJECT_UNSPEC; 4576 4577 desc.timeout = 0; 4578 if (nla[NFTA_SET_TIMEOUT] != NULL) { 4579 if (!(flags & NFT_SET_TIMEOUT)) 4580 return -EINVAL; 4581 4582 err = nf_msecs_to_jiffies64(nla[NFTA_SET_TIMEOUT], &desc.timeout); 4583 if (err) 4584 return err; 4585 } 4586 desc.gc_int = 0; 4587 if (nla[NFTA_SET_GC_INTERVAL] != NULL) { 4588 if (!(flags & NFT_SET_TIMEOUT)) 4589 return -EINVAL; 4590 desc.gc_int = ntohl(nla_get_be32(nla[NFTA_SET_GC_INTERVAL])); 4591 } 4592 4593 desc.policy = NFT_SET_POL_PERFORMANCE; 4594 if (nla[NFTA_SET_POLICY] != NULL) 4595 desc.policy = ntohl(nla_get_be32(nla[NFTA_SET_POLICY])); 4596 4597 if (nla[NFTA_SET_DESC] != NULL) { 4598 err = nf_tables_set_desc_parse(&desc, nla[NFTA_SET_DESC]); 4599 if (err < 0) 4600 return err; 4601 4602 if (desc.field_count > 1 && !(flags & NFT_SET_CONCAT)) 4603 return -EINVAL; 4604 } else if (flags & NFT_SET_CONCAT) { 4605 return -EINVAL; 4606 } 4607 4608 if (nla[NFTA_SET_EXPR] || nla[NFTA_SET_EXPRESSIONS]) 4609 desc.expr = true; 4610 4611 table = nft_table_lookup(net, nla[NFTA_SET_TABLE], family, genmask, 4612 NETLINK_CB(skb).portid); 4613 if (IS_ERR(table)) { 4614 NL_SET_BAD_ATTR(extack, nla[NFTA_SET_TABLE]); 4615 return PTR_ERR(table); 4616 } 4617 4618 nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla); 4619 4620 set = nft_set_lookup(table, nla[NFTA_SET_NAME], genmask); 4621 if (IS_ERR(set)) { 4622 if (PTR_ERR(set) != -ENOENT) { 4623 NL_SET_BAD_ATTR(extack, nla[NFTA_SET_NAME]); 4624 return PTR_ERR(set); 4625 } 4626 } else { 4627 struct nft_expr *exprs[NFT_SET_EXPR_MAX] = {}; 4628 4629 if (info->nlh->nlmsg_flags & NLM_F_EXCL) { 4630 NL_SET_BAD_ATTR(extack, nla[NFTA_SET_NAME]); 4631 return -EEXIST; 4632 } 4633 if (info->nlh->nlmsg_flags & NLM_F_REPLACE) 4634 return -EOPNOTSUPP; 4635 4636 err = nft_set_expr_alloc(&ctx, set, nla, exprs, &num_exprs, flags); 4637 if (err < 0) 4638 return err; 4639 4640 err = 0; 4641 if (!nft_set_is_same(set, &desc, exprs, num_exprs, flags)) { 4642 NL_SET_BAD_ATTR(extack, nla[NFTA_SET_NAME]); 4643 err = -EEXIST; 4644 } 4645 4646 for (i = 0; i < num_exprs; i++) 4647 nft_expr_destroy(&ctx, exprs[i]); 4648 4649 if (err < 0) 4650 return err; 4651 4652 return __nft_trans_set_add(&ctx, NFT_MSG_NEWSET, set, &desc); 4653 } 4654 4655 if (!(info->nlh->nlmsg_flags & NLM_F_CREATE)) 4656 return -ENOENT; 4657 4658 ops = nft_select_set_ops(&ctx, nla, &desc); 4659 if (IS_ERR(ops)) 4660 return PTR_ERR(ops); 4661 4662 udlen = 0; 4663 if (nla[NFTA_SET_USERDATA]) 4664 udlen = nla_len(nla[NFTA_SET_USERDATA]); 4665 4666 size = 0; 4667 if (ops->privsize != NULL) 4668 size = ops->privsize(nla, &desc); 4669 alloc_size = sizeof(*set) + size + udlen; 4670 if (alloc_size < size || alloc_size > INT_MAX) 4671 return -ENOMEM; 4672 set = kvzalloc(alloc_size, GFP_KERNEL_ACCOUNT); 4673 if (!set) 4674 return -ENOMEM; 4675 4676 name = nla_strdup(nla[NFTA_SET_NAME], GFP_KERNEL_ACCOUNT); 4677 if (!name) { 4678 err = -ENOMEM; 4679 goto err_set_name; 4680 } 4681 4682 err = nf_tables_set_alloc_name(&ctx, set, name); 4683 kfree(name); 4684 if (err < 0) 4685 goto err_set_name; 4686 4687 udata = NULL; 4688 if (udlen) { 4689 udata = set->data + size; 4690 nla_memcpy(udata, nla[NFTA_SET_USERDATA], udlen); 4691 } 4692 4693 INIT_LIST_HEAD(&set->bindings); 4694 INIT_LIST_HEAD(&set->catchall_list); 4695 set->table = table; 4696 write_pnet(&set->net, net); 4697 set->ops = ops; 4698 set->ktype = desc.ktype; 4699 set->klen = desc.klen; 4700 set->dtype = desc.dtype; 4701 set->objtype = desc.objtype; 4702 set->dlen = desc.dlen; 4703 set->flags = flags; 4704 set->size = desc.size; 4705 set->policy = desc.policy; 4706 set->udlen = udlen; 4707 set->udata = udata; 4708 set->timeout = desc.timeout; 4709 set->gc_int = desc.gc_int; 4710 4711 set->field_count = desc.field_count; 4712 for (i = 0; i < desc.field_count; i++) 4713 set->field_len[i] = desc.field_len[i]; 4714 4715 err = ops->init(set, &desc, nla); 4716 if (err < 0) 4717 goto err_set_init; 4718 4719 err = nft_set_expr_alloc(&ctx, set, nla, set->exprs, &num_exprs, flags); 4720 if (err < 0) 4721 goto err_set_destroy; 4722 4723 set->num_exprs = num_exprs; 4724 set->handle = nf_tables_alloc_handle(table); 4725 4726 err = nft_trans_set_add(&ctx, NFT_MSG_NEWSET, set); 4727 if (err < 0) 4728 goto err_set_expr_alloc; 4729 4730 list_add_tail_rcu(&set->list, &table->sets); 4731 table->use++; 4732 return 0; 4733 4734 err_set_expr_alloc: 4735 for (i = 0; i < set->num_exprs; i++) 4736 nft_expr_destroy(&ctx, set->exprs[i]); 4737 err_set_destroy: 4738 ops->destroy(set); 4739 err_set_init: 4740 kfree(set->name); 4741 err_set_name: 4742 kvfree(set); 4743 return err; 4744 } 4745 4746 struct nft_set_elem_catchall { 4747 struct list_head list; 4748 struct rcu_head rcu; 4749 void *elem; 4750 }; 4751 4752 static void nft_set_catchall_destroy(const struct nft_ctx *ctx, 4753 struct nft_set *set) 4754 { 4755 struct nft_set_elem_catchall *next, *catchall; 4756 4757 list_for_each_entry_safe(catchall, next, &set->catchall_list, list) { 4758 list_del_rcu(&catchall->list); 4759 nft_set_elem_destroy(set, catchall->elem, true); 4760 kfree_rcu(catchall, rcu); 4761 } 4762 } 4763 4764 static void nft_set_destroy(const struct nft_ctx *ctx, struct nft_set *set) 4765 { 4766 int i; 4767 4768 if (WARN_ON(set->use > 0)) 4769 return; 4770 4771 for (i = 0; i < set->num_exprs; i++) 4772 nft_expr_destroy(ctx, set->exprs[i]); 4773 4774 set->ops->destroy(set); 4775 nft_set_catchall_destroy(ctx, set); 4776 kfree(set->name); 4777 kvfree(set); 4778 } 4779 4780 static int nf_tables_delset(struct sk_buff *skb, const struct nfnl_info *info, 4781 const struct nlattr * const nla[]) 4782 { 4783 struct netlink_ext_ack *extack = info->extack; 4784 u8 genmask = nft_genmask_next(info->net); 4785 u8 family = info->nfmsg->nfgen_family; 4786 struct net *net = info->net; 4787 const struct nlattr *attr; 4788 struct nft_table *table; 4789 struct nft_set *set; 4790 struct nft_ctx ctx; 4791 4792 if (info->nfmsg->nfgen_family == NFPROTO_UNSPEC) 4793 return -EAFNOSUPPORT; 4794 4795 table = nft_table_lookup(net, nla[NFTA_SET_TABLE], family, 4796 genmask, NETLINK_CB(skb).portid); 4797 if (IS_ERR(table)) { 4798 NL_SET_BAD_ATTR(extack, nla[NFTA_SET_TABLE]); 4799 return PTR_ERR(table); 4800 } 4801 4802 if (nla[NFTA_SET_HANDLE]) { 4803 attr = nla[NFTA_SET_HANDLE]; 4804 set = nft_set_lookup_byhandle(table, attr, genmask); 4805 } else { 4806 attr = nla[NFTA_SET_NAME]; 4807 set = nft_set_lookup(table, attr, genmask); 4808 } 4809 4810 if (IS_ERR(set)) { 4811 NL_SET_BAD_ATTR(extack, attr); 4812 return PTR_ERR(set); 4813 } 4814 if (set->use || 4815 (info->nlh->nlmsg_flags & NLM_F_NONREC && 4816 atomic_read(&set->nelems) > 0)) { 4817 NL_SET_BAD_ATTR(extack, attr); 4818 return -EBUSY; 4819 } 4820 4821 nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla); 4822 4823 return nft_delset(&ctx, set); 4824 } 4825 4826 static int nft_validate_register_store(const struct nft_ctx *ctx, 4827 enum nft_registers reg, 4828 const struct nft_data *data, 4829 enum nft_data_types type, 4830 unsigned int len); 4831 4832 static int nft_setelem_data_validate(const struct nft_ctx *ctx, 4833 struct nft_set *set, 4834 struct nft_set_elem *elem) 4835 { 4836 const struct nft_set_ext *ext = nft_set_elem_ext(set, elem->priv); 4837 enum nft_registers dreg; 4838 4839 dreg = nft_type_to_reg(set->dtype); 4840 return nft_validate_register_store(ctx, dreg, nft_set_ext_data(ext), 4841 set->dtype == NFT_DATA_VERDICT ? 4842 NFT_DATA_VERDICT : NFT_DATA_VALUE, 4843 set->dlen); 4844 } 4845 4846 static int nf_tables_bind_check_setelem(const struct nft_ctx *ctx, 4847 struct nft_set *set, 4848 const struct nft_set_iter *iter, 4849 struct nft_set_elem *elem) 4850 { 4851 return nft_setelem_data_validate(ctx, set, elem); 4852 } 4853 4854 static int nft_set_catchall_bind_check(const struct nft_ctx *ctx, 4855 struct nft_set *set) 4856 { 4857 u8 genmask = nft_genmask_next(ctx->net); 4858 struct nft_set_elem_catchall *catchall; 4859 struct nft_set_elem elem; 4860 struct nft_set_ext *ext; 4861 int ret = 0; 4862 4863 list_for_each_entry_rcu(catchall, &set->catchall_list, list) { 4864 ext = nft_set_elem_ext(set, catchall->elem); 4865 if (!nft_set_elem_active(ext, genmask)) 4866 continue; 4867 4868 elem.priv = catchall->elem; 4869 ret = nft_setelem_data_validate(ctx, set, &elem); 4870 if (ret < 0) 4871 break; 4872 } 4873 4874 return ret; 4875 } 4876 4877 int nf_tables_bind_set(const struct nft_ctx *ctx, struct nft_set *set, 4878 struct nft_set_binding *binding) 4879 { 4880 struct nft_set_binding *i; 4881 struct nft_set_iter iter; 4882 4883 if (set->use == UINT_MAX) 4884 return -EOVERFLOW; 4885 4886 if (!list_empty(&set->bindings) && nft_set_is_anonymous(set)) 4887 return -EBUSY; 4888 4889 if (binding->flags & NFT_SET_MAP) { 4890 /* If the set is already bound to the same chain all 4891 * jumps are already validated for that chain. 4892 */ 4893 list_for_each_entry(i, &set->bindings, list) { 4894 if (i->flags & NFT_SET_MAP && 4895 i->chain == binding->chain) 4896 goto bind; 4897 } 4898 4899 iter.genmask = nft_genmask_next(ctx->net); 4900 iter.skip = 0; 4901 iter.count = 0; 4902 iter.err = 0; 4903 iter.fn = nf_tables_bind_check_setelem; 4904 4905 set->ops->walk(ctx, set, &iter); 4906 if (!iter.err) 4907 iter.err = nft_set_catchall_bind_check(ctx, set); 4908 4909 if (iter.err < 0) 4910 return iter.err; 4911 } 4912 bind: 4913 binding->chain = ctx->chain; 4914 list_add_tail_rcu(&binding->list, &set->bindings); 4915 nft_set_trans_bind(ctx, set); 4916 set->use++; 4917 4918 return 0; 4919 } 4920 EXPORT_SYMBOL_GPL(nf_tables_bind_set); 4921 4922 static void nf_tables_unbind_set(const struct nft_ctx *ctx, struct nft_set *set, 4923 struct nft_set_binding *binding, bool event) 4924 { 4925 list_del_rcu(&binding->list); 4926 4927 if (list_empty(&set->bindings) && nft_set_is_anonymous(set)) { 4928 list_del_rcu(&set->list); 4929 if (event) 4930 nf_tables_set_notify(ctx, set, NFT_MSG_DELSET, 4931 GFP_KERNEL); 4932 } 4933 } 4934 4935 void nf_tables_deactivate_set(const struct nft_ctx *ctx, struct nft_set *set, 4936 struct nft_set_binding *binding, 4937 enum nft_trans_phase phase) 4938 { 4939 switch (phase) { 4940 case NFT_TRANS_PREPARE: 4941 set->use--; 4942 return; 4943 case NFT_TRANS_ABORT: 4944 case NFT_TRANS_RELEASE: 4945 set->use--; 4946 fallthrough; 4947 default: 4948 nf_tables_unbind_set(ctx, set, binding, 4949 phase == NFT_TRANS_COMMIT); 4950 } 4951 } 4952 EXPORT_SYMBOL_GPL(nf_tables_deactivate_set); 4953 4954 void nf_tables_destroy_set(const struct nft_ctx *ctx, struct nft_set *set) 4955 { 4956 if (list_empty(&set->bindings) && nft_set_is_anonymous(set)) 4957 nft_set_destroy(ctx, set); 4958 } 4959 EXPORT_SYMBOL_GPL(nf_tables_destroy_set); 4960 4961 const struct nft_set_ext_type nft_set_ext_types[] = { 4962 [NFT_SET_EXT_KEY] = { 4963 .align = __alignof__(u32), 4964 }, 4965 [NFT_SET_EXT_DATA] = { 4966 .align = __alignof__(u32), 4967 }, 4968 [NFT_SET_EXT_EXPRESSIONS] = { 4969 .align = __alignof__(struct nft_set_elem_expr), 4970 }, 4971 [NFT_SET_EXT_OBJREF] = { 4972 .len = sizeof(struct nft_object *), 4973 .align = __alignof__(struct nft_object *), 4974 }, 4975 [NFT_SET_EXT_FLAGS] = { 4976 .len = sizeof(u8), 4977 .align = __alignof__(u8), 4978 }, 4979 [NFT_SET_EXT_TIMEOUT] = { 4980 .len = sizeof(u64), 4981 .align = __alignof__(u64), 4982 }, 4983 [NFT_SET_EXT_EXPIRATION] = { 4984 .len = sizeof(u64), 4985 .align = __alignof__(u64), 4986 }, 4987 [NFT_SET_EXT_USERDATA] = { 4988 .len = sizeof(struct nft_userdata), 4989 .align = __alignof__(struct nft_userdata), 4990 }, 4991 [NFT_SET_EXT_KEY_END] = { 4992 .align = __alignof__(u32), 4993 }, 4994 }; 4995 4996 /* 4997 * Set elements 4998 */ 4999 5000 static const struct nla_policy nft_set_elem_policy[NFTA_SET_ELEM_MAX + 1] = { 5001 [NFTA_SET_ELEM_KEY] = { .type = NLA_NESTED }, 5002 [NFTA_SET_ELEM_DATA] = { .type = NLA_NESTED }, 5003 [NFTA_SET_ELEM_FLAGS] = { .type = NLA_U32 }, 5004 [NFTA_SET_ELEM_TIMEOUT] = { .type = NLA_U64 }, 5005 [NFTA_SET_ELEM_EXPIRATION] = { .type = NLA_U64 }, 5006 [NFTA_SET_ELEM_USERDATA] = { .type = NLA_BINARY, 5007 .len = NFT_USERDATA_MAXLEN }, 5008 [NFTA_SET_ELEM_EXPR] = { .type = NLA_NESTED }, 5009 [NFTA_SET_ELEM_OBJREF] = { .type = NLA_STRING, 5010 .len = NFT_OBJ_MAXNAMELEN - 1 }, 5011 [NFTA_SET_ELEM_KEY_END] = { .type = NLA_NESTED }, 5012 [NFTA_SET_ELEM_EXPRESSIONS] = { .type = NLA_NESTED }, 5013 }; 5014 5015 static const struct nla_policy nft_set_elem_list_policy[NFTA_SET_ELEM_LIST_MAX + 1] = { 5016 [NFTA_SET_ELEM_LIST_TABLE] = { .type = NLA_STRING, 5017 .len = NFT_TABLE_MAXNAMELEN - 1 }, 5018 [NFTA_SET_ELEM_LIST_SET] = { .type = NLA_STRING, 5019 .len = NFT_SET_MAXNAMELEN - 1 }, 5020 [NFTA_SET_ELEM_LIST_ELEMENTS] = { .type = NLA_NESTED }, 5021 [NFTA_SET_ELEM_LIST_SET_ID] = { .type = NLA_U32 }, 5022 }; 5023 5024 static int nft_set_elem_expr_dump(struct sk_buff *skb, 5025 const struct nft_set *set, 5026 const struct nft_set_ext *ext) 5027 { 5028 struct nft_set_elem_expr *elem_expr; 5029 u32 size, num_exprs = 0; 5030 struct nft_expr *expr; 5031 struct nlattr *nest; 5032 5033 elem_expr = nft_set_ext_expr(ext); 5034 nft_setelem_expr_foreach(expr, elem_expr, size) 5035 num_exprs++; 5036 5037 if (num_exprs == 1) { 5038 expr = nft_setelem_expr_at(elem_expr, 0); 5039 if (nft_expr_dump(skb, NFTA_SET_ELEM_EXPR, expr, false) < 0) 5040 return -1; 5041 5042 return 0; 5043 } else if (num_exprs > 1) { 5044 nest = nla_nest_start_noflag(skb, NFTA_SET_ELEM_EXPRESSIONS); 5045 if (nest == NULL) 5046 goto nla_put_failure; 5047 5048 nft_setelem_expr_foreach(expr, elem_expr, size) { 5049 expr = nft_setelem_expr_at(elem_expr, size); 5050 if (nft_expr_dump(skb, NFTA_LIST_ELEM, expr, false) < 0) 5051 goto nla_put_failure; 5052 } 5053 nla_nest_end(skb, nest); 5054 } 5055 return 0; 5056 5057 nla_put_failure: 5058 return -1; 5059 } 5060 5061 static int nf_tables_fill_setelem(struct sk_buff *skb, 5062 const struct nft_set *set, 5063 const struct nft_set_elem *elem) 5064 { 5065 const struct nft_set_ext *ext = nft_set_elem_ext(set, elem->priv); 5066 unsigned char *b = skb_tail_pointer(skb); 5067 struct nlattr *nest; 5068 5069 nest = nla_nest_start_noflag(skb, NFTA_LIST_ELEM); 5070 if (nest == NULL) 5071 goto nla_put_failure; 5072 5073 if (nft_set_ext_exists(ext, NFT_SET_EXT_KEY) && 5074 nft_data_dump(skb, NFTA_SET_ELEM_KEY, nft_set_ext_key(ext), 5075 NFT_DATA_VALUE, set->klen) < 0) 5076 goto nla_put_failure; 5077 5078 if (nft_set_ext_exists(ext, NFT_SET_EXT_KEY_END) && 5079 nft_data_dump(skb, NFTA_SET_ELEM_KEY_END, nft_set_ext_key_end(ext), 5080 NFT_DATA_VALUE, set->klen) < 0) 5081 goto nla_put_failure; 5082 5083 if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA) && 5084 nft_data_dump(skb, NFTA_SET_ELEM_DATA, nft_set_ext_data(ext), 5085 set->dtype == NFT_DATA_VERDICT ? NFT_DATA_VERDICT : NFT_DATA_VALUE, 5086 set->dlen) < 0) 5087 goto nla_put_failure; 5088 5089 if (nft_set_ext_exists(ext, NFT_SET_EXT_EXPRESSIONS) && 5090 nft_set_elem_expr_dump(skb, set, ext)) 5091 goto nla_put_failure; 5092 5093 if (nft_set_ext_exists(ext, NFT_SET_EXT_OBJREF) && 5094 nla_put_string(skb, NFTA_SET_ELEM_OBJREF, 5095 (*nft_set_ext_obj(ext))->key.name) < 0) 5096 goto nla_put_failure; 5097 5098 if (nft_set_ext_exists(ext, NFT_SET_EXT_FLAGS) && 5099 nla_put_be32(skb, NFTA_SET_ELEM_FLAGS, 5100 htonl(*nft_set_ext_flags(ext)))) 5101 goto nla_put_failure; 5102 5103 if (nft_set_ext_exists(ext, NFT_SET_EXT_TIMEOUT) && 5104 nla_put_be64(skb, NFTA_SET_ELEM_TIMEOUT, 5105 nf_jiffies64_to_msecs(*nft_set_ext_timeout(ext)), 5106 NFTA_SET_ELEM_PAD)) 5107 goto nla_put_failure; 5108 5109 if (nft_set_ext_exists(ext, NFT_SET_EXT_EXPIRATION)) { 5110 u64 expires, now = get_jiffies_64(); 5111 5112 expires = *nft_set_ext_expiration(ext); 5113 if (time_before64(now, expires)) 5114 expires -= now; 5115 else 5116 expires = 0; 5117 5118 if (nla_put_be64(skb, NFTA_SET_ELEM_EXPIRATION, 5119 nf_jiffies64_to_msecs(expires), 5120 NFTA_SET_ELEM_PAD)) 5121 goto nla_put_failure; 5122 } 5123 5124 if (nft_set_ext_exists(ext, NFT_SET_EXT_USERDATA)) { 5125 struct nft_userdata *udata; 5126 5127 udata = nft_set_ext_userdata(ext); 5128 if (nla_put(skb, NFTA_SET_ELEM_USERDATA, 5129 udata->len + 1, udata->data)) 5130 goto nla_put_failure; 5131 } 5132 5133 nla_nest_end(skb, nest); 5134 return 0; 5135 5136 nla_put_failure: 5137 nlmsg_trim(skb, b); 5138 return -EMSGSIZE; 5139 } 5140 5141 struct nft_set_dump_args { 5142 const struct netlink_callback *cb; 5143 struct nft_set_iter iter; 5144 struct sk_buff *skb; 5145 }; 5146 5147 static int nf_tables_dump_setelem(const struct nft_ctx *ctx, 5148 struct nft_set *set, 5149 const struct nft_set_iter *iter, 5150 struct nft_set_elem *elem) 5151 { 5152 struct nft_set_dump_args *args; 5153 5154 args = container_of(iter, struct nft_set_dump_args, iter); 5155 return nf_tables_fill_setelem(args->skb, set, elem); 5156 } 5157 5158 struct nft_set_dump_ctx { 5159 const struct nft_set *set; 5160 struct nft_ctx ctx; 5161 }; 5162 5163 static int nft_set_catchall_dump(struct net *net, struct sk_buff *skb, 5164 const struct nft_set *set) 5165 { 5166 struct nft_set_elem_catchall *catchall; 5167 u8 genmask = nft_genmask_cur(net); 5168 struct nft_set_elem elem; 5169 struct nft_set_ext *ext; 5170 int ret = 0; 5171 5172 list_for_each_entry_rcu(catchall, &set->catchall_list, list) { 5173 ext = nft_set_elem_ext(set, catchall->elem); 5174 if (!nft_set_elem_active(ext, genmask) || 5175 nft_set_elem_expired(ext)) 5176 continue; 5177 5178 elem.priv = catchall->elem; 5179 ret = nf_tables_fill_setelem(skb, set, &elem); 5180 break; 5181 } 5182 5183 return ret; 5184 } 5185 5186 static int nf_tables_dump_set(struct sk_buff *skb, struct netlink_callback *cb) 5187 { 5188 struct nft_set_dump_ctx *dump_ctx = cb->data; 5189 struct net *net = sock_net(skb->sk); 5190 struct nftables_pernet *nft_net; 5191 struct nft_table *table; 5192 struct nft_set *set; 5193 struct nft_set_dump_args args; 5194 bool set_found = false; 5195 struct nlmsghdr *nlh; 5196 struct nlattr *nest; 5197 u32 portid, seq; 5198 int event; 5199 5200 rcu_read_lock(); 5201 nft_net = nft_pernet(net); 5202 cb->seq = READ_ONCE(nft_net->base_seq); 5203 5204 list_for_each_entry_rcu(table, &nft_net->tables, list) { 5205 if (dump_ctx->ctx.family != NFPROTO_UNSPEC && 5206 dump_ctx->ctx.family != table->family) 5207 continue; 5208 5209 if (table != dump_ctx->ctx.table) 5210 continue; 5211 5212 list_for_each_entry_rcu(set, &table->sets, list) { 5213 if (set == dump_ctx->set) { 5214 set_found = true; 5215 break; 5216 } 5217 } 5218 break; 5219 } 5220 5221 if (!set_found) { 5222 rcu_read_unlock(); 5223 return -ENOENT; 5224 } 5225 5226 event = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, NFT_MSG_NEWSETELEM); 5227 portid = NETLINK_CB(cb->skb).portid; 5228 seq = cb->nlh->nlmsg_seq; 5229 5230 nlh = nfnl_msg_put(skb, portid, seq, event, NLM_F_MULTI, 5231 table->family, NFNETLINK_V0, nft_base_seq(net)); 5232 if (!nlh) 5233 goto nla_put_failure; 5234 5235 if (nla_put_string(skb, NFTA_SET_ELEM_LIST_TABLE, table->name)) 5236 goto nla_put_failure; 5237 if (nla_put_string(skb, NFTA_SET_ELEM_LIST_SET, set->name)) 5238 goto nla_put_failure; 5239 5240 nest = nla_nest_start_noflag(skb, NFTA_SET_ELEM_LIST_ELEMENTS); 5241 if (nest == NULL) 5242 goto nla_put_failure; 5243 5244 args.cb = cb; 5245 args.skb = skb; 5246 args.iter.genmask = nft_genmask_cur(net); 5247 args.iter.skip = cb->args[0]; 5248 args.iter.count = 0; 5249 args.iter.err = 0; 5250 args.iter.fn = nf_tables_dump_setelem; 5251 set->ops->walk(&dump_ctx->ctx, set, &args.iter); 5252 5253 if (!args.iter.err && args.iter.count == cb->args[0]) 5254 args.iter.err = nft_set_catchall_dump(net, skb, set); 5255 rcu_read_unlock(); 5256 5257 nla_nest_end(skb, nest); 5258 nlmsg_end(skb, nlh); 5259 5260 if (args.iter.err && args.iter.err != -EMSGSIZE) 5261 return args.iter.err; 5262 if (args.iter.count == cb->args[0]) 5263 return 0; 5264 5265 cb->args[0] = args.iter.count; 5266 return skb->len; 5267 5268 nla_put_failure: 5269 rcu_read_unlock(); 5270 return -ENOSPC; 5271 } 5272 5273 static int nf_tables_dump_set_start(struct netlink_callback *cb) 5274 { 5275 struct nft_set_dump_ctx *dump_ctx = cb->data; 5276 5277 cb->data = kmemdup(dump_ctx, sizeof(*dump_ctx), GFP_ATOMIC); 5278 5279 return cb->data ? 0 : -ENOMEM; 5280 } 5281 5282 static int nf_tables_dump_set_done(struct netlink_callback *cb) 5283 { 5284 kfree(cb->data); 5285 return 0; 5286 } 5287 5288 static int nf_tables_fill_setelem_info(struct sk_buff *skb, 5289 const struct nft_ctx *ctx, u32 seq, 5290 u32 portid, int event, u16 flags, 5291 const struct nft_set *set, 5292 const struct nft_set_elem *elem) 5293 { 5294 struct nlmsghdr *nlh; 5295 struct nlattr *nest; 5296 int err; 5297 5298 event = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event); 5299 nlh = nfnl_msg_put(skb, portid, seq, event, flags, ctx->family, 5300 NFNETLINK_V0, nft_base_seq(ctx->net)); 5301 if (!nlh) 5302 goto nla_put_failure; 5303 5304 if (nla_put_string(skb, NFTA_SET_TABLE, ctx->table->name)) 5305 goto nla_put_failure; 5306 if (nla_put_string(skb, NFTA_SET_NAME, set->name)) 5307 goto nla_put_failure; 5308 5309 nest = nla_nest_start_noflag(skb, NFTA_SET_ELEM_LIST_ELEMENTS); 5310 if (nest == NULL) 5311 goto nla_put_failure; 5312 5313 err = nf_tables_fill_setelem(skb, set, elem); 5314 if (err < 0) 5315 goto nla_put_failure; 5316 5317 nla_nest_end(skb, nest); 5318 5319 nlmsg_end(skb, nlh); 5320 return 0; 5321 5322 nla_put_failure: 5323 nlmsg_trim(skb, nlh); 5324 return -1; 5325 } 5326 5327 static int nft_setelem_parse_flags(const struct nft_set *set, 5328 const struct nlattr *attr, u32 *flags) 5329 { 5330 if (attr == NULL) 5331 return 0; 5332 5333 *flags = ntohl(nla_get_be32(attr)); 5334 if (*flags & ~(NFT_SET_ELEM_INTERVAL_END | NFT_SET_ELEM_CATCHALL)) 5335 return -EOPNOTSUPP; 5336 if (!(set->flags & NFT_SET_INTERVAL) && 5337 *flags & NFT_SET_ELEM_INTERVAL_END) 5338 return -EINVAL; 5339 if ((*flags & (NFT_SET_ELEM_INTERVAL_END | NFT_SET_ELEM_CATCHALL)) == 5340 (NFT_SET_ELEM_INTERVAL_END | NFT_SET_ELEM_CATCHALL)) 5341 return -EINVAL; 5342 5343 return 0; 5344 } 5345 5346 static int nft_setelem_parse_key(struct nft_ctx *ctx, struct nft_set *set, 5347 struct nft_data *key, struct nlattr *attr) 5348 { 5349 struct nft_data_desc desc = { 5350 .type = NFT_DATA_VALUE, 5351 .size = NFT_DATA_VALUE_MAXLEN, 5352 .len = set->klen, 5353 }; 5354 5355 return nft_data_init(ctx, key, &desc, attr); 5356 } 5357 5358 static int nft_setelem_parse_data(struct nft_ctx *ctx, struct nft_set *set, 5359 struct nft_data_desc *desc, 5360 struct nft_data *data, 5361 struct nlattr *attr) 5362 { 5363 u32 dtype; 5364 5365 if (set->dtype == NFT_DATA_VERDICT) 5366 dtype = NFT_DATA_VERDICT; 5367 else 5368 dtype = NFT_DATA_VALUE; 5369 5370 desc->type = dtype; 5371 desc->size = NFT_DATA_VALUE_MAXLEN; 5372 desc->len = set->dlen; 5373 desc->flags = NFT_DATA_DESC_SETELEM; 5374 5375 return nft_data_init(ctx, data, desc, attr); 5376 } 5377 5378 static void *nft_setelem_catchall_get(const struct net *net, 5379 const struct nft_set *set) 5380 { 5381 struct nft_set_elem_catchall *catchall; 5382 u8 genmask = nft_genmask_cur(net); 5383 struct nft_set_ext *ext; 5384 void *priv = NULL; 5385 5386 list_for_each_entry_rcu(catchall, &set->catchall_list, list) { 5387 ext = nft_set_elem_ext(set, catchall->elem); 5388 if (!nft_set_elem_active(ext, genmask) || 5389 nft_set_elem_expired(ext)) 5390 continue; 5391 5392 priv = catchall->elem; 5393 break; 5394 } 5395 5396 return priv; 5397 } 5398 5399 static int nft_setelem_get(struct nft_ctx *ctx, struct nft_set *set, 5400 struct nft_set_elem *elem, u32 flags) 5401 { 5402 void *priv; 5403 5404 if (!(flags & NFT_SET_ELEM_CATCHALL)) { 5405 priv = set->ops->get(ctx->net, set, elem, flags); 5406 if (IS_ERR(priv)) 5407 return PTR_ERR(priv); 5408 } else { 5409 priv = nft_setelem_catchall_get(ctx->net, set); 5410 if (!priv) 5411 return -ENOENT; 5412 } 5413 elem->priv = priv; 5414 5415 return 0; 5416 } 5417 5418 static int nft_get_set_elem(struct nft_ctx *ctx, struct nft_set *set, 5419 const struct nlattr *attr) 5420 { 5421 struct nlattr *nla[NFTA_SET_ELEM_MAX + 1]; 5422 struct nft_set_elem elem; 5423 struct sk_buff *skb; 5424 uint32_t flags = 0; 5425 int err; 5426 5427 err = nla_parse_nested_deprecated(nla, NFTA_SET_ELEM_MAX, attr, 5428 nft_set_elem_policy, NULL); 5429 if (err < 0) 5430 return err; 5431 5432 err = nft_setelem_parse_flags(set, nla[NFTA_SET_ELEM_FLAGS], &flags); 5433 if (err < 0) 5434 return err; 5435 5436 if (!nla[NFTA_SET_ELEM_KEY] && !(flags & NFT_SET_ELEM_CATCHALL)) 5437 return -EINVAL; 5438 5439 if (nla[NFTA_SET_ELEM_KEY]) { 5440 err = nft_setelem_parse_key(ctx, set, &elem.key.val, 5441 nla[NFTA_SET_ELEM_KEY]); 5442 if (err < 0) 5443 return err; 5444 } 5445 5446 if (nla[NFTA_SET_ELEM_KEY_END]) { 5447 err = nft_setelem_parse_key(ctx, set, &elem.key_end.val, 5448 nla[NFTA_SET_ELEM_KEY_END]); 5449 if (err < 0) 5450 return err; 5451 } 5452 5453 err = nft_setelem_get(ctx, set, &elem, flags); 5454 if (err < 0) 5455 return err; 5456 5457 err = -ENOMEM; 5458 skb = nlmsg_new(NLMSG_GOODSIZE, GFP_ATOMIC); 5459 if (skb == NULL) 5460 return err; 5461 5462 err = nf_tables_fill_setelem_info(skb, ctx, ctx->seq, ctx->portid, 5463 NFT_MSG_NEWSETELEM, 0, set, &elem); 5464 if (err < 0) 5465 goto err_fill_setelem; 5466 5467 return nfnetlink_unicast(skb, ctx->net, ctx->portid); 5468 5469 err_fill_setelem: 5470 kfree_skb(skb); 5471 return err; 5472 } 5473 5474 /* called with rcu_read_lock held */ 5475 static int nf_tables_getsetelem(struct sk_buff *skb, 5476 const struct nfnl_info *info, 5477 const struct nlattr * const nla[]) 5478 { 5479 struct netlink_ext_ack *extack = info->extack; 5480 u8 genmask = nft_genmask_cur(info->net); 5481 u8 family = info->nfmsg->nfgen_family; 5482 struct net *net = info->net; 5483 struct nft_table *table; 5484 struct nft_set *set; 5485 struct nlattr *attr; 5486 struct nft_ctx ctx; 5487 int rem, err = 0; 5488 5489 table = nft_table_lookup(net, nla[NFTA_SET_ELEM_LIST_TABLE], family, 5490 genmask, NETLINK_CB(skb).portid); 5491 if (IS_ERR(table)) { 5492 NL_SET_BAD_ATTR(extack, nla[NFTA_SET_ELEM_LIST_TABLE]); 5493 return PTR_ERR(table); 5494 } 5495 5496 set = nft_set_lookup(table, nla[NFTA_SET_ELEM_LIST_SET], genmask); 5497 if (IS_ERR(set)) 5498 return PTR_ERR(set); 5499 5500 nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla); 5501 5502 if (info->nlh->nlmsg_flags & NLM_F_DUMP) { 5503 struct netlink_dump_control c = { 5504 .start = nf_tables_dump_set_start, 5505 .dump = nf_tables_dump_set, 5506 .done = nf_tables_dump_set_done, 5507 .module = THIS_MODULE, 5508 }; 5509 struct nft_set_dump_ctx dump_ctx = { 5510 .set = set, 5511 .ctx = ctx, 5512 }; 5513 5514 c.data = &dump_ctx; 5515 return nft_netlink_dump_start_rcu(info->sk, skb, info->nlh, &c); 5516 } 5517 5518 if (!nla[NFTA_SET_ELEM_LIST_ELEMENTS]) 5519 return -EINVAL; 5520 5521 nla_for_each_nested(attr, nla[NFTA_SET_ELEM_LIST_ELEMENTS], rem) { 5522 err = nft_get_set_elem(&ctx, set, attr); 5523 if (err < 0) { 5524 NL_SET_BAD_ATTR(extack, attr); 5525 break; 5526 } 5527 } 5528 5529 return err; 5530 } 5531 5532 static void nf_tables_setelem_notify(const struct nft_ctx *ctx, 5533 const struct nft_set *set, 5534 const struct nft_set_elem *elem, 5535 int event) 5536 { 5537 struct nftables_pernet *nft_net; 5538 struct net *net = ctx->net; 5539 u32 portid = ctx->portid; 5540 struct sk_buff *skb; 5541 u16 flags = 0; 5542 int err; 5543 5544 if (!ctx->report && !nfnetlink_has_listeners(net, NFNLGRP_NFTABLES)) 5545 return; 5546 5547 skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL); 5548 if (skb == NULL) 5549 goto err; 5550 5551 if (ctx->flags & (NLM_F_CREATE | NLM_F_EXCL)) 5552 flags |= ctx->flags & (NLM_F_CREATE | NLM_F_EXCL); 5553 5554 err = nf_tables_fill_setelem_info(skb, ctx, 0, portid, event, flags, 5555 set, elem); 5556 if (err < 0) { 5557 kfree_skb(skb); 5558 goto err; 5559 } 5560 5561 nft_net = nft_pernet(net); 5562 nft_notify_enqueue(skb, ctx->report, &nft_net->notify_list); 5563 return; 5564 err: 5565 nfnetlink_set_err(net, portid, NFNLGRP_NFTABLES, -ENOBUFS); 5566 } 5567 5568 static struct nft_trans *nft_trans_elem_alloc(struct nft_ctx *ctx, 5569 int msg_type, 5570 struct nft_set *set) 5571 { 5572 struct nft_trans *trans; 5573 5574 trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_elem)); 5575 if (trans == NULL) 5576 return NULL; 5577 5578 nft_trans_elem_set(trans) = set; 5579 return trans; 5580 } 5581 5582 struct nft_expr *nft_set_elem_expr_alloc(const struct nft_ctx *ctx, 5583 const struct nft_set *set, 5584 const struct nlattr *attr) 5585 { 5586 struct nft_expr *expr; 5587 int err; 5588 5589 expr = nft_expr_init(ctx, attr); 5590 if (IS_ERR(expr)) 5591 return expr; 5592 5593 err = -EOPNOTSUPP; 5594 if (expr->ops->type->flags & NFT_EXPR_GC) { 5595 if (set->flags & NFT_SET_TIMEOUT) 5596 goto err_set_elem_expr; 5597 if (!set->ops->gc_init) 5598 goto err_set_elem_expr; 5599 set->ops->gc_init(set); 5600 } 5601 5602 return expr; 5603 5604 err_set_elem_expr: 5605 nft_expr_destroy(ctx, expr); 5606 return ERR_PTR(err); 5607 } 5608 5609 static int nft_set_ext_check(const struct nft_set_ext_tmpl *tmpl, u8 id, u32 len) 5610 { 5611 len += nft_set_ext_types[id].len; 5612 if (len > tmpl->ext_len[id] || 5613 len > U8_MAX) 5614 return -1; 5615 5616 return 0; 5617 } 5618 5619 static int nft_set_ext_memcpy(const struct nft_set_ext_tmpl *tmpl, u8 id, 5620 void *to, const void *from, u32 len) 5621 { 5622 if (nft_set_ext_check(tmpl, id, len) < 0) 5623 return -1; 5624 5625 memcpy(to, from, len); 5626 5627 return 0; 5628 } 5629 5630 void *nft_set_elem_init(const struct nft_set *set, 5631 const struct nft_set_ext_tmpl *tmpl, 5632 const u32 *key, const u32 *key_end, 5633 const u32 *data, u64 timeout, u64 expiration, gfp_t gfp) 5634 { 5635 struct nft_set_ext *ext; 5636 void *elem; 5637 5638 elem = kzalloc(set->ops->elemsize + tmpl->len, gfp); 5639 if (elem == NULL) 5640 return ERR_PTR(-ENOMEM); 5641 5642 ext = nft_set_elem_ext(set, elem); 5643 nft_set_ext_init(ext, tmpl); 5644 5645 if (nft_set_ext_exists(ext, NFT_SET_EXT_KEY) && 5646 nft_set_ext_memcpy(tmpl, NFT_SET_EXT_KEY, 5647 nft_set_ext_key(ext), key, set->klen) < 0) 5648 goto err_ext_check; 5649 5650 if (nft_set_ext_exists(ext, NFT_SET_EXT_KEY_END) && 5651 nft_set_ext_memcpy(tmpl, NFT_SET_EXT_KEY_END, 5652 nft_set_ext_key_end(ext), key_end, set->klen) < 0) 5653 goto err_ext_check; 5654 5655 if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA) && 5656 nft_set_ext_memcpy(tmpl, NFT_SET_EXT_DATA, 5657 nft_set_ext_data(ext), data, set->dlen) < 0) 5658 goto err_ext_check; 5659 5660 if (nft_set_ext_exists(ext, NFT_SET_EXT_EXPIRATION)) { 5661 *nft_set_ext_expiration(ext) = get_jiffies_64() + expiration; 5662 if (expiration == 0) 5663 *nft_set_ext_expiration(ext) += timeout; 5664 } 5665 if (nft_set_ext_exists(ext, NFT_SET_EXT_TIMEOUT)) 5666 *nft_set_ext_timeout(ext) = timeout; 5667 5668 return elem; 5669 5670 err_ext_check: 5671 kfree(elem); 5672 5673 return ERR_PTR(-EINVAL); 5674 } 5675 5676 static void __nft_set_elem_expr_destroy(const struct nft_ctx *ctx, 5677 struct nft_expr *expr) 5678 { 5679 if (expr->ops->destroy_clone) { 5680 expr->ops->destroy_clone(ctx, expr); 5681 module_put(expr->ops->type->owner); 5682 } else { 5683 nf_tables_expr_destroy(ctx, expr); 5684 } 5685 } 5686 5687 static void nft_set_elem_expr_destroy(const struct nft_ctx *ctx, 5688 struct nft_set_elem_expr *elem_expr) 5689 { 5690 struct nft_expr *expr; 5691 u32 size; 5692 5693 nft_setelem_expr_foreach(expr, elem_expr, size) 5694 __nft_set_elem_expr_destroy(ctx, expr); 5695 } 5696 5697 void nft_set_elem_destroy(const struct nft_set *set, void *elem, 5698 bool destroy_expr) 5699 { 5700 struct nft_set_ext *ext = nft_set_elem_ext(set, elem); 5701 struct nft_ctx ctx = { 5702 .net = read_pnet(&set->net), 5703 .family = set->table->family, 5704 }; 5705 5706 nft_data_release(nft_set_ext_key(ext), NFT_DATA_VALUE); 5707 if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA)) 5708 nft_data_release(nft_set_ext_data(ext), set->dtype); 5709 if (destroy_expr && nft_set_ext_exists(ext, NFT_SET_EXT_EXPRESSIONS)) 5710 nft_set_elem_expr_destroy(&ctx, nft_set_ext_expr(ext)); 5711 5712 if (nft_set_ext_exists(ext, NFT_SET_EXT_OBJREF)) 5713 (*nft_set_ext_obj(ext))->use--; 5714 kfree(elem); 5715 } 5716 EXPORT_SYMBOL_GPL(nft_set_elem_destroy); 5717 5718 /* Only called from commit path, nft_setelem_data_deactivate() already deals 5719 * with the refcounting from the preparation phase. 5720 */ 5721 static void nf_tables_set_elem_destroy(const struct nft_ctx *ctx, 5722 const struct nft_set *set, void *elem) 5723 { 5724 struct nft_set_ext *ext = nft_set_elem_ext(set, elem); 5725 5726 if (nft_set_ext_exists(ext, NFT_SET_EXT_EXPRESSIONS)) 5727 nft_set_elem_expr_destroy(ctx, nft_set_ext_expr(ext)); 5728 5729 kfree(elem); 5730 } 5731 5732 int nft_set_elem_expr_clone(const struct nft_ctx *ctx, struct nft_set *set, 5733 struct nft_expr *expr_array[]) 5734 { 5735 struct nft_expr *expr; 5736 int err, i, k; 5737 5738 for (i = 0; i < set->num_exprs; i++) { 5739 expr = kzalloc(set->exprs[i]->ops->size, GFP_KERNEL_ACCOUNT); 5740 if (!expr) 5741 goto err_expr; 5742 5743 err = nft_expr_clone(expr, set->exprs[i]); 5744 if (err < 0) { 5745 kfree(expr); 5746 goto err_expr; 5747 } 5748 expr_array[i] = expr; 5749 } 5750 5751 return 0; 5752 5753 err_expr: 5754 for (k = i - 1; k >= 0; k--) 5755 nft_expr_destroy(ctx, expr_array[k]); 5756 5757 return -ENOMEM; 5758 } 5759 5760 static int nft_set_elem_expr_setup(struct nft_ctx *ctx, 5761 const struct nft_set_ext_tmpl *tmpl, 5762 const struct nft_set_ext *ext, 5763 struct nft_expr *expr_array[], 5764 u32 num_exprs) 5765 { 5766 struct nft_set_elem_expr *elem_expr = nft_set_ext_expr(ext); 5767 u32 len = sizeof(struct nft_set_elem_expr); 5768 struct nft_expr *expr; 5769 int i, err; 5770 5771 if (num_exprs == 0) 5772 return 0; 5773 5774 for (i = 0; i < num_exprs; i++) 5775 len += expr_array[i]->ops->size; 5776 5777 if (nft_set_ext_check(tmpl, NFT_SET_EXT_EXPRESSIONS, len) < 0) 5778 return -EINVAL; 5779 5780 for (i = 0; i < num_exprs; i++) { 5781 expr = nft_setelem_expr_at(elem_expr, elem_expr->size); 5782 err = nft_expr_clone(expr, expr_array[i]); 5783 if (err < 0) 5784 goto err_elem_expr_setup; 5785 5786 elem_expr->size += expr_array[i]->ops->size; 5787 nft_expr_destroy(ctx, expr_array[i]); 5788 expr_array[i] = NULL; 5789 } 5790 5791 return 0; 5792 5793 err_elem_expr_setup: 5794 for (; i < num_exprs; i++) { 5795 nft_expr_destroy(ctx, expr_array[i]); 5796 expr_array[i] = NULL; 5797 } 5798 5799 return -ENOMEM; 5800 } 5801 5802 struct nft_set_ext *nft_set_catchall_lookup(const struct net *net, 5803 const struct nft_set *set) 5804 { 5805 struct nft_set_elem_catchall *catchall; 5806 u8 genmask = nft_genmask_cur(net); 5807 struct nft_set_ext *ext; 5808 5809 list_for_each_entry_rcu(catchall, &set->catchall_list, list) { 5810 ext = nft_set_elem_ext(set, catchall->elem); 5811 if (nft_set_elem_active(ext, genmask) && 5812 !nft_set_elem_expired(ext)) 5813 return ext; 5814 } 5815 5816 return NULL; 5817 } 5818 EXPORT_SYMBOL_GPL(nft_set_catchall_lookup); 5819 5820 void *nft_set_catchall_gc(const struct nft_set *set) 5821 { 5822 struct nft_set_elem_catchall *catchall, *next; 5823 struct nft_set_ext *ext; 5824 void *elem = NULL; 5825 5826 list_for_each_entry_safe(catchall, next, &set->catchall_list, list) { 5827 ext = nft_set_elem_ext(set, catchall->elem); 5828 5829 if (!nft_set_elem_expired(ext) || 5830 nft_set_elem_mark_busy(ext)) 5831 continue; 5832 5833 elem = catchall->elem; 5834 list_del_rcu(&catchall->list); 5835 kfree_rcu(catchall, rcu); 5836 break; 5837 } 5838 5839 return elem; 5840 } 5841 EXPORT_SYMBOL_GPL(nft_set_catchall_gc); 5842 5843 static int nft_setelem_catchall_insert(const struct net *net, 5844 struct nft_set *set, 5845 const struct nft_set_elem *elem, 5846 struct nft_set_ext **pext) 5847 { 5848 struct nft_set_elem_catchall *catchall; 5849 u8 genmask = nft_genmask_next(net); 5850 struct nft_set_ext *ext; 5851 5852 list_for_each_entry(catchall, &set->catchall_list, list) { 5853 ext = nft_set_elem_ext(set, catchall->elem); 5854 if (nft_set_elem_active(ext, genmask)) { 5855 *pext = ext; 5856 return -EEXIST; 5857 } 5858 } 5859 5860 catchall = kmalloc(sizeof(*catchall), GFP_KERNEL); 5861 if (!catchall) 5862 return -ENOMEM; 5863 5864 catchall->elem = elem->priv; 5865 list_add_tail_rcu(&catchall->list, &set->catchall_list); 5866 5867 return 0; 5868 } 5869 5870 static int nft_setelem_insert(const struct net *net, 5871 struct nft_set *set, 5872 const struct nft_set_elem *elem, 5873 struct nft_set_ext **ext, unsigned int flags) 5874 { 5875 int ret; 5876 5877 if (flags & NFT_SET_ELEM_CATCHALL) 5878 ret = nft_setelem_catchall_insert(net, set, elem, ext); 5879 else 5880 ret = set->ops->insert(net, set, elem, ext); 5881 5882 return ret; 5883 } 5884 5885 static bool nft_setelem_is_catchall(const struct nft_set *set, 5886 const struct nft_set_elem *elem) 5887 { 5888 struct nft_set_ext *ext = nft_set_elem_ext(set, elem->priv); 5889 5890 if (nft_set_ext_exists(ext, NFT_SET_EXT_FLAGS) && 5891 *nft_set_ext_flags(ext) & NFT_SET_ELEM_CATCHALL) 5892 return true; 5893 5894 return false; 5895 } 5896 5897 static void nft_setelem_activate(struct net *net, struct nft_set *set, 5898 struct nft_set_elem *elem) 5899 { 5900 struct nft_set_ext *ext = nft_set_elem_ext(set, elem->priv); 5901 5902 if (nft_setelem_is_catchall(set, elem)) { 5903 nft_set_elem_change_active(net, set, ext); 5904 nft_set_elem_clear_busy(ext); 5905 } else { 5906 set->ops->activate(net, set, elem); 5907 } 5908 } 5909 5910 static int nft_setelem_catchall_deactivate(const struct net *net, 5911 struct nft_set *set, 5912 struct nft_set_elem *elem) 5913 { 5914 struct nft_set_elem_catchall *catchall; 5915 struct nft_set_ext *ext; 5916 5917 list_for_each_entry(catchall, &set->catchall_list, list) { 5918 ext = nft_set_elem_ext(set, catchall->elem); 5919 if (!nft_is_active(net, ext) || 5920 nft_set_elem_mark_busy(ext)) 5921 continue; 5922 5923 kfree(elem->priv); 5924 elem->priv = catchall->elem; 5925 nft_set_elem_change_active(net, set, ext); 5926 return 0; 5927 } 5928 5929 return -ENOENT; 5930 } 5931 5932 static int __nft_setelem_deactivate(const struct net *net, 5933 struct nft_set *set, 5934 struct nft_set_elem *elem) 5935 { 5936 void *priv; 5937 5938 priv = set->ops->deactivate(net, set, elem); 5939 if (!priv) 5940 return -ENOENT; 5941 5942 kfree(elem->priv); 5943 elem->priv = priv; 5944 set->ndeact++; 5945 5946 return 0; 5947 } 5948 5949 static int nft_setelem_deactivate(const struct net *net, 5950 struct nft_set *set, 5951 struct nft_set_elem *elem, u32 flags) 5952 { 5953 int ret; 5954 5955 if (flags & NFT_SET_ELEM_CATCHALL) 5956 ret = nft_setelem_catchall_deactivate(net, set, elem); 5957 else 5958 ret = __nft_setelem_deactivate(net, set, elem); 5959 5960 return ret; 5961 } 5962 5963 static void nft_setelem_catchall_remove(const struct net *net, 5964 const struct nft_set *set, 5965 const struct nft_set_elem *elem) 5966 { 5967 struct nft_set_elem_catchall *catchall, *next; 5968 5969 list_for_each_entry_safe(catchall, next, &set->catchall_list, list) { 5970 if (catchall->elem == elem->priv) { 5971 list_del_rcu(&catchall->list); 5972 kfree_rcu(catchall, rcu); 5973 break; 5974 } 5975 } 5976 } 5977 5978 static void nft_setelem_remove(const struct net *net, 5979 const struct nft_set *set, 5980 const struct nft_set_elem *elem) 5981 { 5982 if (nft_setelem_is_catchall(set, elem)) 5983 nft_setelem_catchall_remove(net, set, elem); 5984 else 5985 set->ops->remove(net, set, elem); 5986 } 5987 5988 static bool nft_setelem_valid_key_end(const struct nft_set *set, 5989 struct nlattr **nla, u32 flags) 5990 { 5991 if ((set->flags & (NFT_SET_CONCAT | NFT_SET_INTERVAL)) == 5992 (NFT_SET_CONCAT | NFT_SET_INTERVAL)) { 5993 if (flags & NFT_SET_ELEM_INTERVAL_END) 5994 return false; 5995 5996 if (nla[NFTA_SET_ELEM_KEY_END] && 5997 flags & NFT_SET_ELEM_CATCHALL) 5998 return false; 5999 } else { 6000 if (nla[NFTA_SET_ELEM_KEY_END]) 6001 return false; 6002 } 6003 6004 return true; 6005 } 6006 6007 static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set, 6008 const struct nlattr *attr, u32 nlmsg_flags) 6009 { 6010 struct nft_expr *expr_array[NFT_SET_EXPR_MAX] = {}; 6011 struct nlattr *nla[NFTA_SET_ELEM_MAX + 1]; 6012 u8 genmask = nft_genmask_next(ctx->net); 6013 u32 flags = 0, size = 0, num_exprs = 0; 6014 struct nft_set_ext_tmpl tmpl; 6015 struct nft_set_ext *ext, *ext2; 6016 struct nft_set_elem elem; 6017 struct nft_set_binding *binding; 6018 struct nft_object *obj = NULL; 6019 struct nft_userdata *udata; 6020 struct nft_data_desc desc; 6021 enum nft_registers dreg; 6022 struct nft_trans *trans; 6023 u64 timeout; 6024 u64 expiration; 6025 int err, i; 6026 u8 ulen; 6027 6028 err = nla_parse_nested_deprecated(nla, NFTA_SET_ELEM_MAX, attr, 6029 nft_set_elem_policy, NULL); 6030 if (err < 0) 6031 return err; 6032 6033 nft_set_ext_prepare(&tmpl); 6034 6035 err = nft_setelem_parse_flags(set, nla[NFTA_SET_ELEM_FLAGS], &flags); 6036 if (err < 0) 6037 return err; 6038 6039 if (!nla[NFTA_SET_ELEM_KEY] && !(flags & NFT_SET_ELEM_CATCHALL)) 6040 return -EINVAL; 6041 6042 if (flags != 0) { 6043 err = nft_set_ext_add(&tmpl, NFT_SET_EXT_FLAGS); 6044 if (err < 0) 6045 return err; 6046 } 6047 6048 if (set->flags & NFT_SET_MAP) { 6049 if (nla[NFTA_SET_ELEM_DATA] == NULL && 6050 !(flags & NFT_SET_ELEM_INTERVAL_END)) 6051 return -EINVAL; 6052 } else { 6053 if (nla[NFTA_SET_ELEM_DATA] != NULL) 6054 return -EINVAL; 6055 } 6056 6057 if (set->flags & NFT_SET_OBJECT) { 6058 if (!nla[NFTA_SET_ELEM_OBJREF] && 6059 !(flags & NFT_SET_ELEM_INTERVAL_END)) 6060 return -EINVAL; 6061 } else { 6062 if (nla[NFTA_SET_ELEM_OBJREF]) 6063 return -EINVAL; 6064 } 6065 6066 if (!nft_setelem_valid_key_end(set, nla, flags)) 6067 return -EINVAL; 6068 6069 if ((flags & NFT_SET_ELEM_INTERVAL_END) && 6070 (nla[NFTA_SET_ELEM_DATA] || 6071 nla[NFTA_SET_ELEM_OBJREF] || 6072 nla[NFTA_SET_ELEM_TIMEOUT] || 6073 nla[NFTA_SET_ELEM_EXPIRATION] || 6074 nla[NFTA_SET_ELEM_USERDATA] || 6075 nla[NFTA_SET_ELEM_EXPR] || 6076 nla[NFTA_SET_ELEM_KEY_END] || 6077 nla[NFTA_SET_ELEM_EXPRESSIONS])) 6078 return -EINVAL; 6079 6080 timeout = 0; 6081 if (nla[NFTA_SET_ELEM_TIMEOUT] != NULL) { 6082 if (!(set->flags & NFT_SET_TIMEOUT)) 6083 return -EINVAL; 6084 err = nf_msecs_to_jiffies64(nla[NFTA_SET_ELEM_TIMEOUT], 6085 &timeout); 6086 if (err) 6087 return err; 6088 } else if (set->flags & NFT_SET_TIMEOUT && 6089 !(flags & NFT_SET_ELEM_INTERVAL_END)) { 6090 timeout = READ_ONCE(set->timeout); 6091 } 6092 6093 expiration = 0; 6094 if (nla[NFTA_SET_ELEM_EXPIRATION] != NULL) { 6095 if (!(set->flags & NFT_SET_TIMEOUT)) 6096 return -EINVAL; 6097 err = nf_msecs_to_jiffies64(nla[NFTA_SET_ELEM_EXPIRATION], 6098 &expiration); 6099 if (err) 6100 return err; 6101 } 6102 6103 if (nla[NFTA_SET_ELEM_EXPR]) { 6104 struct nft_expr *expr; 6105 6106 if (set->num_exprs && set->num_exprs != 1) 6107 return -EOPNOTSUPP; 6108 6109 expr = nft_set_elem_expr_alloc(ctx, set, 6110 nla[NFTA_SET_ELEM_EXPR]); 6111 if (IS_ERR(expr)) 6112 return PTR_ERR(expr); 6113 6114 expr_array[0] = expr; 6115 num_exprs = 1; 6116 6117 if (set->num_exprs && set->exprs[0]->ops != expr->ops) { 6118 err = -EOPNOTSUPP; 6119 goto err_set_elem_expr; 6120 } 6121 } else if (nla[NFTA_SET_ELEM_EXPRESSIONS]) { 6122 struct nft_expr *expr; 6123 struct nlattr *tmp; 6124 int left; 6125 6126 i = 0; 6127 nla_for_each_nested(tmp, nla[NFTA_SET_ELEM_EXPRESSIONS], left) { 6128 if (i == NFT_SET_EXPR_MAX || 6129 (set->num_exprs && set->num_exprs == i)) { 6130 err = -E2BIG; 6131 goto err_set_elem_expr; 6132 } 6133 if (nla_type(tmp) != NFTA_LIST_ELEM) { 6134 err = -EINVAL; 6135 goto err_set_elem_expr; 6136 } 6137 expr = nft_set_elem_expr_alloc(ctx, set, tmp); 6138 if (IS_ERR(expr)) { 6139 err = PTR_ERR(expr); 6140 goto err_set_elem_expr; 6141 } 6142 expr_array[i] = expr; 6143 num_exprs++; 6144 6145 if (set->num_exprs && expr->ops != set->exprs[i]->ops) { 6146 err = -EOPNOTSUPP; 6147 goto err_set_elem_expr; 6148 } 6149 i++; 6150 } 6151 if (set->num_exprs && set->num_exprs != i) { 6152 err = -EOPNOTSUPP; 6153 goto err_set_elem_expr; 6154 } 6155 } else if (set->num_exprs > 0 && 6156 !(flags & NFT_SET_ELEM_INTERVAL_END)) { 6157 err = nft_set_elem_expr_clone(ctx, set, expr_array); 6158 if (err < 0) 6159 goto err_set_elem_expr_clone; 6160 6161 num_exprs = set->num_exprs; 6162 } 6163 6164 if (nla[NFTA_SET_ELEM_KEY]) { 6165 err = nft_setelem_parse_key(ctx, set, &elem.key.val, 6166 nla[NFTA_SET_ELEM_KEY]); 6167 if (err < 0) 6168 goto err_set_elem_expr; 6169 6170 err = nft_set_ext_add_length(&tmpl, NFT_SET_EXT_KEY, set->klen); 6171 if (err < 0) 6172 goto err_parse_key; 6173 } 6174 6175 if (nla[NFTA_SET_ELEM_KEY_END]) { 6176 err = nft_setelem_parse_key(ctx, set, &elem.key_end.val, 6177 nla[NFTA_SET_ELEM_KEY_END]); 6178 if (err < 0) 6179 goto err_parse_key; 6180 6181 err = nft_set_ext_add_length(&tmpl, NFT_SET_EXT_KEY_END, set->klen); 6182 if (err < 0) 6183 goto err_parse_key_end; 6184 } 6185 6186 if (timeout > 0) { 6187 err = nft_set_ext_add(&tmpl, NFT_SET_EXT_EXPIRATION); 6188 if (err < 0) 6189 goto err_parse_key_end; 6190 6191 if (timeout != READ_ONCE(set->timeout)) { 6192 err = nft_set_ext_add(&tmpl, NFT_SET_EXT_TIMEOUT); 6193 if (err < 0) 6194 goto err_parse_key_end; 6195 } 6196 } 6197 6198 if (num_exprs) { 6199 for (i = 0; i < num_exprs; i++) 6200 size += expr_array[i]->ops->size; 6201 6202 err = nft_set_ext_add_length(&tmpl, NFT_SET_EXT_EXPRESSIONS, 6203 sizeof(struct nft_set_elem_expr) + size); 6204 if (err < 0) 6205 goto err_parse_key_end; 6206 } 6207 6208 if (nla[NFTA_SET_ELEM_OBJREF] != NULL) { 6209 obj = nft_obj_lookup(ctx->net, ctx->table, 6210 nla[NFTA_SET_ELEM_OBJREF], 6211 set->objtype, genmask); 6212 if (IS_ERR(obj)) { 6213 err = PTR_ERR(obj); 6214 goto err_parse_key_end; 6215 } 6216 err = nft_set_ext_add(&tmpl, NFT_SET_EXT_OBJREF); 6217 if (err < 0) 6218 goto err_parse_key_end; 6219 } 6220 6221 if (nla[NFTA_SET_ELEM_DATA] != NULL) { 6222 err = nft_setelem_parse_data(ctx, set, &desc, &elem.data.val, 6223 nla[NFTA_SET_ELEM_DATA]); 6224 if (err < 0) 6225 goto err_parse_key_end; 6226 6227 dreg = nft_type_to_reg(set->dtype); 6228 list_for_each_entry(binding, &set->bindings, list) { 6229 struct nft_ctx bind_ctx = { 6230 .net = ctx->net, 6231 .family = ctx->family, 6232 .table = ctx->table, 6233 .chain = (struct nft_chain *)binding->chain, 6234 }; 6235 6236 if (!(binding->flags & NFT_SET_MAP)) 6237 continue; 6238 6239 err = nft_validate_register_store(&bind_ctx, dreg, 6240 &elem.data.val, 6241 desc.type, desc.len); 6242 if (err < 0) 6243 goto err_parse_data; 6244 6245 if (desc.type == NFT_DATA_VERDICT && 6246 (elem.data.val.verdict.code == NFT_GOTO || 6247 elem.data.val.verdict.code == NFT_JUMP)) 6248 nft_validate_state_update(ctx->net, 6249 NFT_VALIDATE_NEED); 6250 } 6251 6252 err = nft_set_ext_add_length(&tmpl, NFT_SET_EXT_DATA, desc.len); 6253 if (err < 0) 6254 goto err_parse_data; 6255 } 6256 6257 /* The full maximum length of userdata can exceed the maximum 6258 * offset value (U8_MAX) for following extensions, therefor it 6259 * must be the last extension added. 6260 */ 6261 ulen = 0; 6262 if (nla[NFTA_SET_ELEM_USERDATA] != NULL) { 6263 ulen = nla_len(nla[NFTA_SET_ELEM_USERDATA]); 6264 if (ulen > 0) { 6265 err = nft_set_ext_add_length(&tmpl, NFT_SET_EXT_USERDATA, 6266 ulen); 6267 if (err < 0) 6268 goto err_parse_data; 6269 } 6270 } 6271 6272 elem.priv = nft_set_elem_init(set, &tmpl, elem.key.val.data, 6273 elem.key_end.val.data, elem.data.val.data, 6274 timeout, expiration, GFP_KERNEL_ACCOUNT); 6275 if (IS_ERR(elem.priv)) { 6276 err = PTR_ERR(elem.priv); 6277 goto err_parse_data; 6278 } 6279 6280 ext = nft_set_elem_ext(set, elem.priv); 6281 if (flags) 6282 *nft_set_ext_flags(ext) = flags; 6283 6284 if (ulen > 0) { 6285 if (nft_set_ext_check(&tmpl, NFT_SET_EXT_USERDATA, ulen) < 0) { 6286 err = -EINVAL; 6287 goto err_elem_userdata; 6288 } 6289 udata = nft_set_ext_userdata(ext); 6290 udata->len = ulen - 1; 6291 nla_memcpy(&udata->data, nla[NFTA_SET_ELEM_USERDATA], ulen); 6292 } 6293 if (obj) { 6294 *nft_set_ext_obj(ext) = obj; 6295 obj->use++; 6296 } 6297 err = nft_set_elem_expr_setup(ctx, &tmpl, ext, expr_array, num_exprs); 6298 if (err < 0) 6299 goto err_elem_free; 6300 6301 trans = nft_trans_elem_alloc(ctx, NFT_MSG_NEWSETELEM, set); 6302 if (trans == NULL) { 6303 err = -ENOMEM; 6304 goto err_elem_free; 6305 } 6306 6307 ext->genmask = nft_genmask_cur(ctx->net) | NFT_SET_ELEM_BUSY_MASK; 6308 6309 err = nft_setelem_insert(ctx->net, set, &elem, &ext2, flags); 6310 if (err) { 6311 if (err == -EEXIST) { 6312 if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA) ^ 6313 nft_set_ext_exists(ext2, NFT_SET_EXT_DATA) || 6314 nft_set_ext_exists(ext, NFT_SET_EXT_OBJREF) ^ 6315 nft_set_ext_exists(ext2, NFT_SET_EXT_OBJREF)) 6316 goto err_element_clash; 6317 if ((nft_set_ext_exists(ext, NFT_SET_EXT_DATA) && 6318 nft_set_ext_exists(ext2, NFT_SET_EXT_DATA) && 6319 memcmp(nft_set_ext_data(ext), 6320 nft_set_ext_data(ext2), set->dlen) != 0) || 6321 (nft_set_ext_exists(ext, NFT_SET_EXT_OBJREF) && 6322 nft_set_ext_exists(ext2, NFT_SET_EXT_OBJREF) && 6323 *nft_set_ext_obj(ext) != *nft_set_ext_obj(ext2))) 6324 goto err_element_clash; 6325 else if (!(nlmsg_flags & NLM_F_EXCL)) 6326 err = 0; 6327 } else if (err == -ENOTEMPTY) { 6328 /* ENOTEMPTY reports overlapping between this element 6329 * and an existing one. 6330 */ 6331 err = -EEXIST; 6332 } 6333 goto err_element_clash; 6334 } 6335 6336 if (!(flags & NFT_SET_ELEM_CATCHALL) && set->size && 6337 !atomic_add_unless(&set->nelems, 1, set->size + set->ndeact)) { 6338 err = -ENFILE; 6339 goto err_set_full; 6340 } 6341 6342 nft_trans_elem(trans) = elem; 6343 nft_trans_commit_list_add_tail(ctx->net, trans); 6344 return 0; 6345 6346 err_set_full: 6347 nft_setelem_remove(ctx->net, set, &elem); 6348 err_element_clash: 6349 kfree(trans); 6350 err_elem_free: 6351 if (obj) 6352 obj->use--; 6353 err_elem_userdata: 6354 nf_tables_set_elem_destroy(ctx, set, elem.priv); 6355 err_parse_data: 6356 if (nla[NFTA_SET_ELEM_DATA] != NULL) 6357 nft_data_release(&elem.data.val, desc.type); 6358 err_parse_key_end: 6359 nft_data_release(&elem.key_end.val, NFT_DATA_VALUE); 6360 err_parse_key: 6361 nft_data_release(&elem.key.val, NFT_DATA_VALUE); 6362 err_set_elem_expr: 6363 for (i = 0; i < num_exprs && expr_array[i]; i++) 6364 nft_expr_destroy(ctx, expr_array[i]); 6365 err_set_elem_expr_clone: 6366 return err; 6367 } 6368 6369 static int nf_tables_newsetelem(struct sk_buff *skb, 6370 const struct nfnl_info *info, 6371 const struct nlattr * const nla[]) 6372 { 6373 struct nftables_pernet *nft_net = nft_pernet(info->net); 6374 struct netlink_ext_ack *extack = info->extack; 6375 u8 genmask = nft_genmask_next(info->net); 6376 u8 family = info->nfmsg->nfgen_family; 6377 struct net *net = info->net; 6378 const struct nlattr *attr; 6379 struct nft_table *table; 6380 struct nft_set *set; 6381 struct nft_ctx ctx; 6382 int rem, err; 6383 6384 if (nla[NFTA_SET_ELEM_LIST_ELEMENTS] == NULL) 6385 return -EINVAL; 6386 6387 table = nft_table_lookup(net, nla[NFTA_SET_ELEM_LIST_TABLE], family, 6388 genmask, NETLINK_CB(skb).portid); 6389 if (IS_ERR(table)) { 6390 NL_SET_BAD_ATTR(extack, nla[NFTA_SET_ELEM_LIST_TABLE]); 6391 return PTR_ERR(table); 6392 } 6393 6394 set = nft_set_lookup_global(net, table, nla[NFTA_SET_ELEM_LIST_SET], 6395 nla[NFTA_SET_ELEM_LIST_SET_ID], genmask); 6396 if (IS_ERR(set)) 6397 return PTR_ERR(set); 6398 6399 if (!list_empty(&set->bindings) && set->flags & NFT_SET_CONSTANT) 6400 return -EBUSY; 6401 6402 nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla); 6403 6404 nla_for_each_nested(attr, nla[NFTA_SET_ELEM_LIST_ELEMENTS], rem) { 6405 err = nft_add_set_elem(&ctx, set, attr, info->nlh->nlmsg_flags); 6406 if (err < 0) { 6407 NL_SET_BAD_ATTR(extack, attr); 6408 return err; 6409 } 6410 } 6411 6412 if (nft_net->validate_state == NFT_VALIDATE_DO) 6413 return nft_table_validate(net, table); 6414 6415 return 0; 6416 } 6417 6418 /** 6419 * nft_data_hold - hold a nft_data item 6420 * 6421 * @data: struct nft_data to release 6422 * @type: type of data 6423 * 6424 * Hold a nft_data item. NFT_DATA_VALUE types can be silently discarded, 6425 * NFT_DATA_VERDICT bumps the reference to chains in case of NFT_JUMP and 6426 * NFT_GOTO verdicts. This function must be called on active data objects 6427 * from the second phase of the commit protocol. 6428 */ 6429 void nft_data_hold(const struct nft_data *data, enum nft_data_types type) 6430 { 6431 struct nft_chain *chain; 6432 struct nft_rule *rule; 6433 6434 if (type == NFT_DATA_VERDICT) { 6435 switch (data->verdict.code) { 6436 case NFT_JUMP: 6437 case NFT_GOTO: 6438 chain = data->verdict.chain; 6439 chain->use++; 6440 6441 if (!nft_chain_is_bound(chain)) 6442 break; 6443 6444 chain->table->use++; 6445 list_for_each_entry(rule, &chain->rules, list) 6446 chain->use++; 6447 6448 nft_chain_add(chain->table, chain); 6449 break; 6450 } 6451 } 6452 } 6453 6454 static void nft_setelem_data_activate(const struct net *net, 6455 const struct nft_set *set, 6456 struct nft_set_elem *elem) 6457 { 6458 const struct nft_set_ext *ext = nft_set_elem_ext(set, elem->priv); 6459 6460 if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA)) 6461 nft_data_hold(nft_set_ext_data(ext), set->dtype); 6462 if (nft_set_ext_exists(ext, NFT_SET_EXT_OBJREF)) 6463 (*nft_set_ext_obj(ext))->use++; 6464 } 6465 6466 static void nft_setelem_data_deactivate(const struct net *net, 6467 const struct nft_set *set, 6468 struct nft_set_elem *elem) 6469 { 6470 const struct nft_set_ext *ext = nft_set_elem_ext(set, elem->priv); 6471 6472 if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA)) 6473 nft_data_release(nft_set_ext_data(ext), set->dtype); 6474 if (nft_set_ext_exists(ext, NFT_SET_EXT_OBJREF)) 6475 (*nft_set_ext_obj(ext))->use--; 6476 } 6477 6478 static int nft_del_setelem(struct nft_ctx *ctx, struct nft_set *set, 6479 const struct nlattr *attr) 6480 { 6481 struct nlattr *nla[NFTA_SET_ELEM_MAX + 1]; 6482 struct nft_set_ext_tmpl tmpl; 6483 struct nft_set_elem elem; 6484 struct nft_set_ext *ext; 6485 struct nft_trans *trans; 6486 u32 flags = 0; 6487 int err; 6488 6489 err = nla_parse_nested_deprecated(nla, NFTA_SET_ELEM_MAX, attr, 6490 nft_set_elem_policy, NULL); 6491 if (err < 0) 6492 return err; 6493 6494 err = nft_setelem_parse_flags(set, nla[NFTA_SET_ELEM_FLAGS], &flags); 6495 if (err < 0) 6496 return err; 6497 6498 if (!nla[NFTA_SET_ELEM_KEY] && !(flags & NFT_SET_ELEM_CATCHALL)) 6499 return -EINVAL; 6500 6501 if (!nft_setelem_valid_key_end(set, nla, flags)) 6502 return -EINVAL; 6503 6504 nft_set_ext_prepare(&tmpl); 6505 6506 if (flags != 0) { 6507 err = nft_set_ext_add(&tmpl, NFT_SET_EXT_FLAGS); 6508 if (err < 0) 6509 return err; 6510 } 6511 6512 if (nla[NFTA_SET_ELEM_KEY]) { 6513 err = nft_setelem_parse_key(ctx, set, &elem.key.val, 6514 nla[NFTA_SET_ELEM_KEY]); 6515 if (err < 0) 6516 return err; 6517 6518 err = nft_set_ext_add_length(&tmpl, NFT_SET_EXT_KEY, set->klen); 6519 if (err < 0) 6520 goto fail_elem; 6521 } 6522 6523 if (nla[NFTA_SET_ELEM_KEY_END]) { 6524 err = nft_setelem_parse_key(ctx, set, &elem.key_end.val, 6525 nla[NFTA_SET_ELEM_KEY_END]); 6526 if (err < 0) 6527 goto fail_elem; 6528 6529 err = nft_set_ext_add_length(&tmpl, NFT_SET_EXT_KEY_END, set->klen); 6530 if (err < 0) 6531 goto fail_elem_key_end; 6532 } 6533 6534 err = -ENOMEM; 6535 elem.priv = nft_set_elem_init(set, &tmpl, elem.key.val.data, 6536 elem.key_end.val.data, NULL, 0, 0, 6537 GFP_KERNEL_ACCOUNT); 6538 if (IS_ERR(elem.priv)) { 6539 err = PTR_ERR(elem.priv); 6540 goto fail_elem_key_end; 6541 } 6542 6543 ext = nft_set_elem_ext(set, elem.priv); 6544 if (flags) 6545 *nft_set_ext_flags(ext) = flags; 6546 6547 trans = nft_trans_elem_alloc(ctx, NFT_MSG_DELSETELEM, set); 6548 if (trans == NULL) 6549 goto fail_trans; 6550 6551 err = nft_setelem_deactivate(ctx->net, set, &elem, flags); 6552 if (err < 0) 6553 goto fail_ops; 6554 6555 nft_setelem_data_deactivate(ctx->net, set, &elem); 6556 6557 nft_trans_elem(trans) = elem; 6558 nft_trans_commit_list_add_tail(ctx->net, trans); 6559 return 0; 6560 6561 fail_ops: 6562 kfree(trans); 6563 fail_trans: 6564 kfree(elem.priv); 6565 fail_elem_key_end: 6566 nft_data_release(&elem.key_end.val, NFT_DATA_VALUE); 6567 fail_elem: 6568 nft_data_release(&elem.key.val, NFT_DATA_VALUE); 6569 return err; 6570 } 6571 6572 static int nft_setelem_flush(const struct nft_ctx *ctx, 6573 struct nft_set *set, 6574 const struct nft_set_iter *iter, 6575 struct nft_set_elem *elem) 6576 { 6577 struct nft_trans *trans; 6578 int err; 6579 6580 trans = nft_trans_alloc_gfp(ctx, NFT_MSG_DELSETELEM, 6581 sizeof(struct nft_trans_elem), GFP_ATOMIC); 6582 if (!trans) 6583 return -ENOMEM; 6584 6585 if (!set->ops->flush(ctx->net, set, elem->priv)) { 6586 err = -ENOENT; 6587 goto err1; 6588 } 6589 set->ndeact++; 6590 6591 nft_setelem_data_deactivate(ctx->net, set, elem); 6592 nft_trans_elem_set(trans) = set; 6593 nft_trans_elem(trans) = *elem; 6594 nft_trans_commit_list_add_tail(ctx->net, trans); 6595 6596 return 0; 6597 err1: 6598 kfree(trans); 6599 return err; 6600 } 6601 6602 static int __nft_set_catchall_flush(const struct nft_ctx *ctx, 6603 struct nft_set *set, 6604 struct nft_set_elem *elem) 6605 { 6606 struct nft_trans *trans; 6607 6608 trans = nft_trans_alloc_gfp(ctx, NFT_MSG_DELSETELEM, 6609 sizeof(struct nft_trans_elem), GFP_KERNEL); 6610 if (!trans) 6611 return -ENOMEM; 6612 6613 nft_setelem_data_deactivate(ctx->net, set, elem); 6614 nft_trans_elem_set(trans) = set; 6615 nft_trans_elem(trans) = *elem; 6616 nft_trans_commit_list_add_tail(ctx->net, trans); 6617 6618 return 0; 6619 } 6620 6621 static int nft_set_catchall_flush(const struct nft_ctx *ctx, 6622 struct nft_set *set) 6623 { 6624 u8 genmask = nft_genmask_next(ctx->net); 6625 struct nft_set_elem_catchall *catchall; 6626 struct nft_set_elem elem; 6627 struct nft_set_ext *ext; 6628 int ret = 0; 6629 6630 list_for_each_entry_rcu(catchall, &set->catchall_list, list) { 6631 ext = nft_set_elem_ext(set, catchall->elem); 6632 if (!nft_set_elem_active(ext, genmask) || 6633 nft_set_elem_mark_busy(ext)) 6634 continue; 6635 6636 elem.priv = catchall->elem; 6637 ret = __nft_set_catchall_flush(ctx, set, &elem); 6638 if (ret < 0) 6639 break; 6640 } 6641 6642 return ret; 6643 } 6644 6645 static int nft_set_flush(struct nft_ctx *ctx, struct nft_set *set, u8 genmask) 6646 { 6647 struct nft_set_iter iter = { 6648 .genmask = genmask, 6649 .fn = nft_setelem_flush, 6650 }; 6651 6652 set->ops->walk(ctx, set, &iter); 6653 if (!iter.err) 6654 iter.err = nft_set_catchall_flush(ctx, set); 6655 6656 return iter.err; 6657 } 6658 6659 static int nf_tables_delsetelem(struct sk_buff *skb, 6660 const struct nfnl_info *info, 6661 const struct nlattr * const nla[]) 6662 { 6663 struct netlink_ext_ack *extack = info->extack; 6664 u8 genmask = nft_genmask_next(info->net); 6665 u8 family = info->nfmsg->nfgen_family; 6666 struct net *net = info->net; 6667 const struct nlattr *attr; 6668 struct nft_table *table; 6669 struct nft_set *set; 6670 struct nft_ctx ctx; 6671 int rem, err = 0; 6672 6673 table = nft_table_lookup(net, nla[NFTA_SET_ELEM_LIST_TABLE], family, 6674 genmask, NETLINK_CB(skb).portid); 6675 if (IS_ERR(table)) { 6676 NL_SET_BAD_ATTR(extack, nla[NFTA_SET_ELEM_LIST_TABLE]); 6677 return PTR_ERR(table); 6678 } 6679 6680 set = nft_set_lookup(table, nla[NFTA_SET_ELEM_LIST_SET], genmask); 6681 if (IS_ERR(set)) 6682 return PTR_ERR(set); 6683 if (!list_empty(&set->bindings) && set->flags & NFT_SET_CONSTANT) 6684 return -EBUSY; 6685 6686 nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla); 6687 6688 if (!nla[NFTA_SET_ELEM_LIST_ELEMENTS]) 6689 return nft_set_flush(&ctx, set, genmask); 6690 6691 nla_for_each_nested(attr, nla[NFTA_SET_ELEM_LIST_ELEMENTS], rem) { 6692 err = nft_del_setelem(&ctx, set, attr); 6693 if (err < 0) { 6694 NL_SET_BAD_ATTR(extack, attr); 6695 break; 6696 } 6697 } 6698 return err; 6699 } 6700 6701 void nft_set_gc_batch_release(struct rcu_head *rcu) 6702 { 6703 struct nft_set_gc_batch *gcb; 6704 unsigned int i; 6705 6706 gcb = container_of(rcu, struct nft_set_gc_batch, head.rcu); 6707 for (i = 0; i < gcb->head.cnt; i++) 6708 nft_set_elem_destroy(gcb->head.set, gcb->elems[i], true); 6709 kfree(gcb); 6710 } 6711 6712 struct nft_set_gc_batch *nft_set_gc_batch_alloc(const struct nft_set *set, 6713 gfp_t gfp) 6714 { 6715 struct nft_set_gc_batch *gcb; 6716 6717 gcb = kzalloc(sizeof(*gcb), gfp); 6718 if (gcb == NULL) 6719 return gcb; 6720 gcb->head.set = set; 6721 return gcb; 6722 } 6723 6724 /* 6725 * Stateful objects 6726 */ 6727 6728 /** 6729 * nft_register_obj- register nf_tables stateful object type 6730 * @obj_type: object type 6731 * 6732 * Registers the object type for use with nf_tables. Returns zero on 6733 * success or a negative errno code otherwise. 6734 */ 6735 int nft_register_obj(struct nft_object_type *obj_type) 6736 { 6737 if (obj_type->type == NFT_OBJECT_UNSPEC) 6738 return -EINVAL; 6739 6740 nfnl_lock(NFNL_SUBSYS_NFTABLES); 6741 list_add_rcu(&obj_type->list, &nf_tables_objects); 6742 nfnl_unlock(NFNL_SUBSYS_NFTABLES); 6743 return 0; 6744 } 6745 EXPORT_SYMBOL_GPL(nft_register_obj); 6746 6747 /** 6748 * nft_unregister_obj - unregister nf_tables object type 6749 * @obj_type: object type 6750 * 6751 * Unregisters the object type for use with nf_tables. 6752 */ 6753 void nft_unregister_obj(struct nft_object_type *obj_type) 6754 { 6755 nfnl_lock(NFNL_SUBSYS_NFTABLES); 6756 list_del_rcu(&obj_type->list); 6757 nfnl_unlock(NFNL_SUBSYS_NFTABLES); 6758 } 6759 EXPORT_SYMBOL_GPL(nft_unregister_obj); 6760 6761 struct nft_object *nft_obj_lookup(const struct net *net, 6762 const struct nft_table *table, 6763 const struct nlattr *nla, u32 objtype, 6764 u8 genmask) 6765 { 6766 struct nft_object_hash_key k = { .table = table }; 6767 char search[NFT_OBJ_MAXNAMELEN]; 6768 struct rhlist_head *tmp, *list; 6769 struct nft_object *obj; 6770 6771 nla_strscpy(search, nla, sizeof(search)); 6772 k.name = search; 6773 6774 WARN_ON_ONCE(!rcu_read_lock_held() && 6775 !lockdep_commit_lock_is_held(net)); 6776 6777 rcu_read_lock(); 6778 list = rhltable_lookup(&nft_objname_ht, &k, nft_objname_ht_params); 6779 if (!list) 6780 goto out; 6781 6782 rhl_for_each_entry_rcu(obj, tmp, list, rhlhead) { 6783 if (objtype == obj->ops->type->type && 6784 nft_active_genmask(obj, genmask)) { 6785 rcu_read_unlock(); 6786 return obj; 6787 } 6788 } 6789 out: 6790 rcu_read_unlock(); 6791 return ERR_PTR(-ENOENT); 6792 } 6793 EXPORT_SYMBOL_GPL(nft_obj_lookup); 6794 6795 static struct nft_object *nft_obj_lookup_byhandle(const struct nft_table *table, 6796 const struct nlattr *nla, 6797 u32 objtype, u8 genmask) 6798 { 6799 struct nft_object *obj; 6800 6801 list_for_each_entry(obj, &table->objects, list) { 6802 if (be64_to_cpu(nla_get_be64(nla)) == obj->handle && 6803 objtype == obj->ops->type->type && 6804 nft_active_genmask(obj, genmask)) 6805 return obj; 6806 } 6807 return ERR_PTR(-ENOENT); 6808 } 6809 6810 static const struct nla_policy nft_obj_policy[NFTA_OBJ_MAX + 1] = { 6811 [NFTA_OBJ_TABLE] = { .type = NLA_STRING, 6812 .len = NFT_TABLE_MAXNAMELEN - 1 }, 6813 [NFTA_OBJ_NAME] = { .type = NLA_STRING, 6814 .len = NFT_OBJ_MAXNAMELEN - 1 }, 6815 [NFTA_OBJ_TYPE] = { .type = NLA_U32 }, 6816 [NFTA_OBJ_DATA] = { .type = NLA_NESTED }, 6817 [NFTA_OBJ_HANDLE] = { .type = NLA_U64}, 6818 [NFTA_OBJ_USERDATA] = { .type = NLA_BINARY, 6819 .len = NFT_USERDATA_MAXLEN }, 6820 }; 6821 6822 static struct nft_object *nft_obj_init(const struct nft_ctx *ctx, 6823 const struct nft_object_type *type, 6824 const struct nlattr *attr) 6825 { 6826 struct nlattr **tb; 6827 const struct nft_object_ops *ops; 6828 struct nft_object *obj; 6829 int err = -ENOMEM; 6830 6831 tb = kmalloc_array(type->maxattr + 1, sizeof(*tb), GFP_KERNEL); 6832 if (!tb) 6833 goto err1; 6834 6835 if (attr) { 6836 err = nla_parse_nested_deprecated(tb, type->maxattr, attr, 6837 type->policy, NULL); 6838 if (err < 0) 6839 goto err2; 6840 } else { 6841 memset(tb, 0, sizeof(tb[0]) * (type->maxattr + 1)); 6842 } 6843 6844 if (type->select_ops) { 6845 ops = type->select_ops(ctx, (const struct nlattr * const *)tb); 6846 if (IS_ERR(ops)) { 6847 err = PTR_ERR(ops); 6848 goto err2; 6849 } 6850 } else { 6851 ops = type->ops; 6852 } 6853 6854 err = -ENOMEM; 6855 obj = kzalloc(sizeof(*obj) + ops->size, GFP_KERNEL_ACCOUNT); 6856 if (!obj) 6857 goto err2; 6858 6859 err = ops->init(ctx, (const struct nlattr * const *)tb, obj); 6860 if (err < 0) 6861 goto err3; 6862 6863 obj->ops = ops; 6864 6865 kfree(tb); 6866 return obj; 6867 err3: 6868 kfree(obj); 6869 err2: 6870 kfree(tb); 6871 err1: 6872 return ERR_PTR(err); 6873 } 6874 6875 static int nft_object_dump(struct sk_buff *skb, unsigned int attr, 6876 struct nft_object *obj, bool reset) 6877 { 6878 struct nlattr *nest; 6879 6880 nest = nla_nest_start_noflag(skb, attr); 6881 if (!nest) 6882 goto nla_put_failure; 6883 if (obj->ops->dump(skb, obj, reset) < 0) 6884 goto nla_put_failure; 6885 nla_nest_end(skb, nest); 6886 return 0; 6887 6888 nla_put_failure: 6889 return -1; 6890 } 6891 6892 static const struct nft_object_type *__nft_obj_type_get(u32 objtype) 6893 { 6894 const struct nft_object_type *type; 6895 6896 list_for_each_entry(type, &nf_tables_objects, list) { 6897 if (objtype == type->type) 6898 return type; 6899 } 6900 return NULL; 6901 } 6902 6903 static const struct nft_object_type * 6904 nft_obj_type_get(struct net *net, u32 objtype) 6905 { 6906 const struct nft_object_type *type; 6907 6908 type = __nft_obj_type_get(objtype); 6909 if (type != NULL && try_module_get(type->owner)) 6910 return type; 6911 6912 lockdep_nfnl_nft_mutex_not_held(); 6913 #ifdef CONFIG_MODULES 6914 if (type == NULL) { 6915 if (nft_request_module(net, "nft-obj-%u", objtype) == -EAGAIN) 6916 return ERR_PTR(-EAGAIN); 6917 } 6918 #endif 6919 return ERR_PTR(-ENOENT); 6920 } 6921 6922 static int nf_tables_updobj(const struct nft_ctx *ctx, 6923 const struct nft_object_type *type, 6924 const struct nlattr *attr, 6925 struct nft_object *obj) 6926 { 6927 struct nft_object *newobj; 6928 struct nft_trans *trans; 6929 int err = -ENOMEM; 6930 6931 if (!try_module_get(type->owner)) 6932 return -ENOENT; 6933 6934 trans = nft_trans_alloc(ctx, NFT_MSG_NEWOBJ, 6935 sizeof(struct nft_trans_obj)); 6936 if (!trans) 6937 goto err_trans; 6938 6939 newobj = nft_obj_init(ctx, type, attr); 6940 if (IS_ERR(newobj)) { 6941 err = PTR_ERR(newobj); 6942 goto err_free_trans; 6943 } 6944 6945 nft_trans_obj(trans) = obj; 6946 nft_trans_obj_update(trans) = true; 6947 nft_trans_obj_newobj(trans) = newobj; 6948 nft_trans_commit_list_add_tail(ctx->net, trans); 6949 6950 return 0; 6951 6952 err_free_trans: 6953 kfree(trans); 6954 err_trans: 6955 module_put(type->owner); 6956 return err; 6957 } 6958 6959 static int nf_tables_newobj(struct sk_buff *skb, const struct nfnl_info *info, 6960 const struct nlattr * const nla[]) 6961 { 6962 struct netlink_ext_ack *extack = info->extack; 6963 u8 genmask = nft_genmask_next(info->net); 6964 u8 family = info->nfmsg->nfgen_family; 6965 const struct nft_object_type *type; 6966 struct net *net = info->net; 6967 struct nft_table *table; 6968 struct nft_object *obj; 6969 struct nft_ctx ctx; 6970 u32 objtype; 6971 int err; 6972 6973 if (!nla[NFTA_OBJ_TYPE] || 6974 !nla[NFTA_OBJ_NAME] || 6975 !nla[NFTA_OBJ_DATA]) 6976 return -EINVAL; 6977 6978 table = nft_table_lookup(net, nla[NFTA_OBJ_TABLE], family, genmask, 6979 NETLINK_CB(skb).portid); 6980 if (IS_ERR(table)) { 6981 NL_SET_BAD_ATTR(extack, nla[NFTA_OBJ_TABLE]); 6982 return PTR_ERR(table); 6983 } 6984 6985 objtype = ntohl(nla_get_be32(nla[NFTA_OBJ_TYPE])); 6986 obj = nft_obj_lookup(net, table, nla[NFTA_OBJ_NAME], objtype, genmask); 6987 if (IS_ERR(obj)) { 6988 err = PTR_ERR(obj); 6989 if (err != -ENOENT) { 6990 NL_SET_BAD_ATTR(extack, nla[NFTA_OBJ_NAME]); 6991 return err; 6992 } 6993 } else { 6994 if (info->nlh->nlmsg_flags & NLM_F_EXCL) { 6995 NL_SET_BAD_ATTR(extack, nla[NFTA_OBJ_NAME]); 6996 return -EEXIST; 6997 } 6998 if (info->nlh->nlmsg_flags & NLM_F_REPLACE) 6999 return -EOPNOTSUPP; 7000 7001 type = __nft_obj_type_get(objtype); 7002 nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla); 7003 7004 return nf_tables_updobj(&ctx, type, nla[NFTA_OBJ_DATA], obj); 7005 } 7006 7007 nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla); 7008 7009 type = nft_obj_type_get(net, objtype); 7010 if (IS_ERR(type)) 7011 return PTR_ERR(type); 7012 7013 obj = nft_obj_init(&ctx, type, nla[NFTA_OBJ_DATA]); 7014 if (IS_ERR(obj)) { 7015 err = PTR_ERR(obj); 7016 goto err_init; 7017 } 7018 obj->key.table = table; 7019 obj->handle = nf_tables_alloc_handle(table); 7020 7021 obj->key.name = nla_strdup(nla[NFTA_OBJ_NAME], GFP_KERNEL_ACCOUNT); 7022 if (!obj->key.name) { 7023 err = -ENOMEM; 7024 goto err_strdup; 7025 } 7026 7027 if (nla[NFTA_OBJ_USERDATA]) { 7028 obj->udata = nla_memdup(nla[NFTA_OBJ_USERDATA], GFP_KERNEL); 7029 if (obj->udata == NULL) 7030 goto err_userdata; 7031 7032 obj->udlen = nla_len(nla[NFTA_OBJ_USERDATA]); 7033 } 7034 7035 err = nft_trans_obj_add(&ctx, NFT_MSG_NEWOBJ, obj); 7036 if (err < 0) 7037 goto err_trans; 7038 7039 err = rhltable_insert(&nft_objname_ht, &obj->rhlhead, 7040 nft_objname_ht_params); 7041 if (err < 0) 7042 goto err_obj_ht; 7043 7044 list_add_tail_rcu(&obj->list, &table->objects); 7045 table->use++; 7046 return 0; 7047 err_obj_ht: 7048 /* queued in transaction log */ 7049 INIT_LIST_HEAD(&obj->list); 7050 return err; 7051 err_trans: 7052 kfree(obj->udata); 7053 err_userdata: 7054 kfree(obj->key.name); 7055 err_strdup: 7056 if (obj->ops->destroy) 7057 obj->ops->destroy(&ctx, obj); 7058 kfree(obj); 7059 err_init: 7060 module_put(type->owner); 7061 return err; 7062 } 7063 7064 static int nf_tables_fill_obj_info(struct sk_buff *skb, struct net *net, 7065 u32 portid, u32 seq, int event, u32 flags, 7066 int family, const struct nft_table *table, 7067 struct nft_object *obj, bool reset) 7068 { 7069 struct nlmsghdr *nlh; 7070 7071 event = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event); 7072 nlh = nfnl_msg_put(skb, portid, seq, event, flags, family, 7073 NFNETLINK_V0, nft_base_seq(net)); 7074 if (!nlh) 7075 goto nla_put_failure; 7076 7077 if (nla_put_string(skb, NFTA_OBJ_TABLE, table->name) || 7078 nla_put_string(skb, NFTA_OBJ_NAME, obj->key.name) || 7079 nla_put_be32(skb, NFTA_OBJ_TYPE, htonl(obj->ops->type->type)) || 7080 nla_put_be32(skb, NFTA_OBJ_USE, htonl(obj->use)) || 7081 nft_object_dump(skb, NFTA_OBJ_DATA, obj, reset) || 7082 nla_put_be64(skb, NFTA_OBJ_HANDLE, cpu_to_be64(obj->handle), 7083 NFTA_OBJ_PAD)) 7084 goto nla_put_failure; 7085 7086 if (obj->udata && 7087 nla_put(skb, NFTA_OBJ_USERDATA, obj->udlen, obj->udata)) 7088 goto nla_put_failure; 7089 7090 nlmsg_end(skb, nlh); 7091 return 0; 7092 7093 nla_put_failure: 7094 nlmsg_trim(skb, nlh); 7095 return -1; 7096 } 7097 7098 struct nft_obj_filter { 7099 char *table; 7100 u32 type; 7101 }; 7102 7103 static int nf_tables_dump_obj(struct sk_buff *skb, struct netlink_callback *cb) 7104 { 7105 const struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh); 7106 const struct nft_table *table; 7107 unsigned int idx = 0, s_idx = cb->args[0]; 7108 struct nft_obj_filter *filter = cb->data; 7109 struct net *net = sock_net(skb->sk); 7110 int family = nfmsg->nfgen_family; 7111 struct nftables_pernet *nft_net; 7112 struct nft_object *obj; 7113 bool reset = false; 7114 7115 if (NFNL_MSG_TYPE(cb->nlh->nlmsg_type) == NFT_MSG_GETOBJ_RESET) 7116 reset = true; 7117 7118 rcu_read_lock(); 7119 nft_net = nft_pernet(net); 7120 cb->seq = READ_ONCE(nft_net->base_seq); 7121 7122 list_for_each_entry_rcu(table, &nft_net->tables, list) { 7123 if (family != NFPROTO_UNSPEC && family != table->family) 7124 continue; 7125 7126 list_for_each_entry_rcu(obj, &table->objects, list) { 7127 if (!nft_is_active(net, obj)) 7128 goto cont; 7129 if (idx < s_idx) 7130 goto cont; 7131 if (idx > s_idx) 7132 memset(&cb->args[1], 0, 7133 sizeof(cb->args) - sizeof(cb->args[0])); 7134 if (filter && filter->table && 7135 strcmp(filter->table, table->name)) 7136 goto cont; 7137 if (filter && 7138 filter->type != NFT_OBJECT_UNSPEC && 7139 obj->ops->type->type != filter->type) 7140 goto cont; 7141 if (reset) { 7142 char *buf = kasprintf(GFP_ATOMIC, 7143 "%s:%u", 7144 table->name, 7145 nft_net->base_seq); 7146 7147 audit_log_nfcfg(buf, 7148 family, 7149 obj->handle, 7150 AUDIT_NFT_OP_OBJ_RESET, 7151 GFP_ATOMIC); 7152 kfree(buf); 7153 } 7154 7155 if (nf_tables_fill_obj_info(skb, net, NETLINK_CB(cb->skb).portid, 7156 cb->nlh->nlmsg_seq, 7157 NFT_MSG_NEWOBJ, 7158 NLM_F_MULTI | NLM_F_APPEND, 7159 table->family, table, 7160 obj, reset) < 0) 7161 goto done; 7162 7163 nl_dump_check_consistent(cb, nlmsg_hdr(skb)); 7164 cont: 7165 idx++; 7166 } 7167 } 7168 done: 7169 rcu_read_unlock(); 7170 7171 cb->args[0] = idx; 7172 return skb->len; 7173 } 7174 7175 static int nf_tables_dump_obj_start(struct netlink_callback *cb) 7176 { 7177 const struct nlattr * const *nla = cb->data; 7178 struct nft_obj_filter *filter = NULL; 7179 7180 if (nla[NFTA_OBJ_TABLE] || nla[NFTA_OBJ_TYPE]) { 7181 filter = kzalloc(sizeof(*filter), GFP_ATOMIC); 7182 if (!filter) 7183 return -ENOMEM; 7184 7185 if (nla[NFTA_OBJ_TABLE]) { 7186 filter->table = nla_strdup(nla[NFTA_OBJ_TABLE], GFP_ATOMIC); 7187 if (!filter->table) { 7188 kfree(filter); 7189 return -ENOMEM; 7190 } 7191 } 7192 7193 if (nla[NFTA_OBJ_TYPE]) 7194 filter->type = ntohl(nla_get_be32(nla[NFTA_OBJ_TYPE])); 7195 } 7196 7197 cb->data = filter; 7198 return 0; 7199 } 7200 7201 static int nf_tables_dump_obj_done(struct netlink_callback *cb) 7202 { 7203 struct nft_obj_filter *filter = cb->data; 7204 7205 if (filter) { 7206 kfree(filter->table); 7207 kfree(filter); 7208 } 7209 7210 return 0; 7211 } 7212 7213 /* called with rcu_read_lock held */ 7214 static int nf_tables_getobj(struct sk_buff *skb, const struct nfnl_info *info, 7215 const struct nlattr * const nla[]) 7216 { 7217 struct netlink_ext_ack *extack = info->extack; 7218 u8 genmask = nft_genmask_cur(info->net); 7219 u8 family = info->nfmsg->nfgen_family; 7220 const struct nft_table *table; 7221 struct net *net = info->net; 7222 struct nft_object *obj; 7223 struct sk_buff *skb2; 7224 bool reset = false; 7225 u32 objtype; 7226 int err; 7227 7228 if (info->nlh->nlmsg_flags & NLM_F_DUMP) { 7229 struct netlink_dump_control c = { 7230 .start = nf_tables_dump_obj_start, 7231 .dump = nf_tables_dump_obj, 7232 .done = nf_tables_dump_obj_done, 7233 .module = THIS_MODULE, 7234 .data = (void *)nla, 7235 }; 7236 7237 return nft_netlink_dump_start_rcu(info->sk, skb, info->nlh, &c); 7238 } 7239 7240 if (!nla[NFTA_OBJ_NAME] || 7241 !nla[NFTA_OBJ_TYPE]) 7242 return -EINVAL; 7243 7244 table = nft_table_lookup(net, nla[NFTA_OBJ_TABLE], family, genmask, 0); 7245 if (IS_ERR(table)) { 7246 NL_SET_BAD_ATTR(extack, nla[NFTA_OBJ_TABLE]); 7247 return PTR_ERR(table); 7248 } 7249 7250 objtype = ntohl(nla_get_be32(nla[NFTA_OBJ_TYPE])); 7251 obj = nft_obj_lookup(net, table, nla[NFTA_OBJ_NAME], objtype, genmask); 7252 if (IS_ERR(obj)) { 7253 NL_SET_BAD_ATTR(extack, nla[NFTA_OBJ_NAME]); 7254 return PTR_ERR(obj); 7255 } 7256 7257 skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC); 7258 if (!skb2) 7259 return -ENOMEM; 7260 7261 if (NFNL_MSG_TYPE(info->nlh->nlmsg_type) == NFT_MSG_GETOBJ_RESET) 7262 reset = true; 7263 7264 if (reset) { 7265 const struct nftables_pernet *nft_net; 7266 char *buf; 7267 7268 nft_net = nft_pernet(net); 7269 buf = kasprintf(GFP_ATOMIC, "%s:%u", table->name, nft_net->base_seq); 7270 7271 audit_log_nfcfg(buf, 7272 family, 7273 obj->handle, 7274 AUDIT_NFT_OP_OBJ_RESET, 7275 GFP_ATOMIC); 7276 kfree(buf); 7277 } 7278 7279 err = nf_tables_fill_obj_info(skb2, net, NETLINK_CB(skb).portid, 7280 info->nlh->nlmsg_seq, NFT_MSG_NEWOBJ, 0, 7281 family, table, obj, reset); 7282 if (err < 0) 7283 goto err_fill_obj_info; 7284 7285 return nfnetlink_unicast(skb2, net, NETLINK_CB(skb).portid); 7286 7287 err_fill_obj_info: 7288 kfree_skb(skb2); 7289 return err; 7290 } 7291 7292 static void nft_obj_destroy(const struct nft_ctx *ctx, struct nft_object *obj) 7293 { 7294 if (obj->ops->destroy) 7295 obj->ops->destroy(ctx, obj); 7296 7297 module_put(obj->ops->type->owner); 7298 kfree(obj->key.name); 7299 kfree(obj->udata); 7300 kfree(obj); 7301 } 7302 7303 static int nf_tables_delobj(struct sk_buff *skb, const struct nfnl_info *info, 7304 const struct nlattr * const nla[]) 7305 { 7306 struct netlink_ext_ack *extack = info->extack; 7307 u8 genmask = nft_genmask_next(info->net); 7308 u8 family = info->nfmsg->nfgen_family; 7309 struct net *net = info->net; 7310 const struct nlattr *attr; 7311 struct nft_table *table; 7312 struct nft_object *obj; 7313 struct nft_ctx ctx; 7314 u32 objtype; 7315 7316 if (!nla[NFTA_OBJ_TYPE] || 7317 (!nla[NFTA_OBJ_NAME] && !nla[NFTA_OBJ_HANDLE])) 7318 return -EINVAL; 7319 7320 table = nft_table_lookup(net, nla[NFTA_OBJ_TABLE], family, genmask, 7321 NETLINK_CB(skb).portid); 7322 if (IS_ERR(table)) { 7323 NL_SET_BAD_ATTR(extack, nla[NFTA_OBJ_TABLE]); 7324 return PTR_ERR(table); 7325 } 7326 7327 objtype = ntohl(nla_get_be32(nla[NFTA_OBJ_TYPE])); 7328 if (nla[NFTA_OBJ_HANDLE]) { 7329 attr = nla[NFTA_OBJ_HANDLE]; 7330 obj = nft_obj_lookup_byhandle(table, attr, objtype, genmask); 7331 } else { 7332 attr = nla[NFTA_OBJ_NAME]; 7333 obj = nft_obj_lookup(net, table, attr, objtype, genmask); 7334 } 7335 7336 if (IS_ERR(obj)) { 7337 NL_SET_BAD_ATTR(extack, attr); 7338 return PTR_ERR(obj); 7339 } 7340 if (obj->use > 0) { 7341 NL_SET_BAD_ATTR(extack, attr); 7342 return -EBUSY; 7343 } 7344 7345 nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla); 7346 7347 return nft_delobj(&ctx, obj); 7348 } 7349 7350 void nft_obj_notify(struct net *net, const struct nft_table *table, 7351 struct nft_object *obj, u32 portid, u32 seq, int event, 7352 u16 flags, int family, int report, gfp_t gfp) 7353 { 7354 struct nftables_pernet *nft_net = nft_pernet(net); 7355 struct sk_buff *skb; 7356 int err; 7357 char *buf = kasprintf(gfp, "%s:%u", 7358 table->name, nft_net->base_seq); 7359 7360 audit_log_nfcfg(buf, 7361 family, 7362 obj->handle, 7363 event == NFT_MSG_NEWOBJ ? 7364 AUDIT_NFT_OP_OBJ_REGISTER : 7365 AUDIT_NFT_OP_OBJ_UNREGISTER, 7366 gfp); 7367 kfree(buf); 7368 7369 if (!report && 7370 !nfnetlink_has_listeners(net, NFNLGRP_NFTABLES)) 7371 return; 7372 7373 skb = nlmsg_new(NLMSG_GOODSIZE, gfp); 7374 if (skb == NULL) 7375 goto err; 7376 7377 err = nf_tables_fill_obj_info(skb, net, portid, seq, event, 7378 flags & (NLM_F_CREATE | NLM_F_EXCL), 7379 family, table, obj, false); 7380 if (err < 0) { 7381 kfree_skb(skb); 7382 goto err; 7383 } 7384 7385 nft_notify_enqueue(skb, report, &nft_net->notify_list); 7386 return; 7387 err: 7388 nfnetlink_set_err(net, portid, NFNLGRP_NFTABLES, -ENOBUFS); 7389 } 7390 EXPORT_SYMBOL_GPL(nft_obj_notify); 7391 7392 static void nf_tables_obj_notify(const struct nft_ctx *ctx, 7393 struct nft_object *obj, int event) 7394 { 7395 nft_obj_notify(ctx->net, ctx->table, obj, ctx->portid, ctx->seq, event, 7396 ctx->flags, ctx->family, ctx->report, GFP_KERNEL); 7397 } 7398 7399 /* 7400 * Flow tables 7401 */ 7402 void nft_register_flowtable_type(struct nf_flowtable_type *type) 7403 { 7404 nfnl_lock(NFNL_SUBSYS_NFTABLES); 7405 list_add_tail_rcu(&type->list, &nf_tables_flowtables); 7406 nfnl_unlock(NFNL_SUBSYS_NFTABLES); 7407 } 7408 EXPORT_SYMBOL_GPL(nft_register_flowtable_type); 7409 7410 void nft_unregister_flowtable_type(struct nf_flowtable_type *type) 7411 { 7412 nfnl_lock(NFNL_SUBSYS_NFTABLES); 7413 list_del_rcu(&type->list); 7414 nfnl_unlock(NFNL_SUBSYS_NFTABLES); 7415 } 7416 EXPORT_SYMBOL_GPL(nft_unregister_flowtable_type); 7417 7418 static const struct nla_policy nft_flowtable_policy[NFTA_FLOWTABLE_MAX + 1] = { 7419 [NFTA_FLOWTABLE_TABLE] = { .type = NLA_STRING, 7420 .len = NFT_NAME_MAXLEN - 1 }, 7421 [NFTA_FLOWTABLE_NAME] = { .type = NLA_STRING, 7422 .len = NFT_NAME_MAXLEN - 1 }, 7423 [NFTA_FLOWTABLE_HOOK] = { .type = NLA_NESTED }, 7424 [NFTA_FLOWTABLE_HANDLE] = { .type = NLA_U64 }, 7425 [NFTA_FLOWTABLE_FLAGS] = { .type = NLA_U32 }, 7426 }; 7427 7428 struct nft_flowtable *nft_flowtable_lookup(const struct nft_table *table, 7429 const struct nlattr *nla, u8 genmask) 7430 { 7431 struct nft_flowtable *flowtable; 7432 7433 list_for_each_entry_rcu(flowtable, &table->flowtables, list) { 7434 if (!nla_strcmp(nla, flowtable->name) && 7435 nft_active_genmask(flowtable, genmask)) 7436 return flowtable; 7437 } 7438 return ERR_PTR(-ENOENT); 7439 } 7440 EXPORT_SYMBOL_GPL(nft_flowtable_lookup); 7441 7442 void nf_tables_deactivate_flowtable(const struct nft_ctx *ctx, 7443 struct nft_flowtable *flowtable, 7444 enum nft_trans_phase phase) 7445 { 7446 switch (phase) { 7447 case NFT_TRANS_PREPARE: 7448 case NFT_TRANS_ABORT: 7449 case NFT_TRANS_RELEASE: 7450 flowtable->use--; 7451 fallthrough; 7452 default: 7453 return; 7454 } 7455 } 7456 EXPORT_SYMBOL_GPL(nf_tables_deactivate_flowtable); 7457 7458 static struct nft_flowtable * 7459 nft_flowtable_lookup_byhandle(const struct nft_table *table, 7460 const struct nlattr *nla, u8 genmask) 7461 { 7462 struct nft_flowtable *flowtable; 7463 7464 list_for_each_entry(flowtable, &table->flowtables, list) { 7465 if (be64_to_cpu(nla_get_be64(nla)) == flowtable->handle && 7466 nft_active_genmask(flowtable, genmask)) 7467 return flowtable; 7468 } 7469 return ERR_PTR(-ENOENT); 7470 } 7471 7472 struct nft_flowtable_hook { 7473 u32 num; 7474 int priority; 7475 struct list_head list; 7476 }; 7477 7478 static const struct nla_policy nft_flowtable_hook_policy[NFTA_FLOWTABLE_HOOK_MAX + 1] = { 7479 [NFTA_FLOWTABLE_HOOK_NUM] = { .type = NLA_U32 }, 7480 [NFTA_FLOWTABLE_HOOK_PRIORITY] = { .type = NLA_U32 }, 7481 [NFTA_FLOWTABLE_HOOK_DEVS] = { .type = NLA_NESTED }, 7482 }; 7483 7484 static int nft_flowtable_parse_hook(const struct nft_ctx *ctx, 7485 const struct nlattr *attr, 7486 struct nft_flowtable_hook *flowtable_hook, 7487 struct nft_flowtable *flowtable, bool add) 7488 { 7489 struct nlattr *tb[NFTA_FLOWTABLE_HOOK_MAX + 1]; 7490 struct nft_hook *hook; 7491 int hooknum, priority; 7492 int err; 7493 7494 INIT_LIST_HEAD(&flowtable_hook->list); 7495 7496 err = nla_parse_nested_deprecated(tb, NFTA_FLOWTABLE_HOOK_MAX, attr, 7497 nft_flowtable_hook_policy, NULL); 7498 if (err < 0) 7499 return err; 7500 7501 if (add) { 7502 if (!tb[NFTA_FLOWTABLE_HOOK_NUM] || 7503 !tb[NFTA_FLOWTABLE_HOOK_PRIORITY]) 7504 return -EINVAL; 7505 7506 hooknum = ntohl(nla_get_be32(tb[NFTA_FLOWTABLE_HOOK_NUM])); 7507 if (hooknum != NF_NETDEV_INGRESS) 7508 return -EOPNOTSUPP; 7509 7510 priority = ntohl(nla_get_be32(tb[NFTA_FLOWTABLE_HOOK_PRIORITY])); 7511 7512 flowtable_hook->priority = priority; 7513 flowtable_hook->num = hooknum; 7514 } else { 7515 if (tb[NFTA_FLOWTABLE_HOOK_NUM]) { 7516 hooknum = ntohl(nla_get_be32(tb[NFTA_FLOWTABLE_HOOK_NUM])); 7517 if (hooknum != flowtable->hooknum) 7518 return -EOPNOTSUPP; 7519 } 7520 7521 if (tb[NFTA_FLOWTABLE_HOOK_PRIORITY]) { 7522 priority = ntohl(nla_get_be32(tb[NFTA_FLOWTABLE_HOOK_PRIORITY])); 7523 if (priority != flowtable->data.priority) 7524 return -EOPNOTSUPP; 7525 } 7526 7527 flowtable_hook->priority = flowtable->data.priority; 7528 flowtable_hook->num = flowtable->hooknum; 7529 } 7530 7531 if (tb[NFTA_FLOWTABLE_HOOK_DEVS]) { 7532 err = nf_tables_parse_netdev_hooks(ctx->net, 7533 tb[NFTA_FLOWTABLE_HOOK_DEVS], 7534 &flowtable_hook->list); 7535 if (err < 0) 7536 return err; 7537 } 7538 7539 list_for_each_entry(hook, &flowtable_hook->list, list) { 7540 hook->ops.pf = NFPROTO_NETDEV; 7541 hook->ops.hooknum = flowtable_hook->num; 7542 hook->ops.priority = flowtable_hook->priority; 7543 hook->ops.priv = &flowtable->data; 7544 hook->ops.hook = flowtable->data.type->hook; 7545 } 7546 7547 return err; 7548 } 7549 7550 static const struct nf_flowtable_type *__nft_flowtable_type_get(u8 family) 7551 { 7552 const struct nf_flowtable_type *type; 7553 7554 list_for_each_entry(type, &nf_tables_flowtables, list) { 7555 if (family == type->family) 7556 return type; 7557 } 7558 return NULL; 7559 } 7560 7561 static const struct nf_flowtable_type * 7562 nft_flowtable_type_get(struct net *net, u8 family) 7563 { 7564 const struct nf_flowtable_type *type; 7565 7566 type = __nft_flowtable_type_get(family); 7567 if (type != NULL && try_module_get(type->owner)) 7568 return type; 7569 7570 lockdep_nfnl_nft_mutex_not_held(); 7571 #ifdef CONFIG_MODULES 7572 if (type == NULL) { 7573 if (nft_request_module(net, "nf-flowtable-%u", family) == -EAGAIN) 7574 return ERR_PTR(-EAGAIN); 7575 } 7576 #endif 7577 return ERR_PTR(-ENOENT); 7578 } 7579 7580 /* Only called from error and netdev event paths. */ 7581 static void nft_unregister_flowtable_hook(struct net *net, 7582 struct nft_flowtable *flowtable, 7583 struct nft_hook *hook) 7584 { 7585 nf_unregister_net_hook(net, &hook->ops); 7586 flowtable->data.type->setup(&flowtable->data, hook->ops.dev, 7587 FLOW_BLOCK_UNBIND); 7588 } 7589 7590 static void __nft_unregister_flowtable_net_hooks(struct net *net, 7591 struct list_head *hook_list, 7592 bool release_netdev) 7593 { 7594 struct nft_hook *hook, *next; 7595 7596 list_for_each_entry_safe(hook, next, hook_list, list) { 7597 nf_unregister_net_hook(net, &hook->ops); 7598 if (release_netdev) { 7599 list_del(&hook->list); 7600 kfree_rcu(hook, rcu); 7601 } 7602 } 7603 } 7604 7605 static void nft_unregister_flowtable_net_hooks(struct net *net, 7606 struct list_head *hook_list) 7607 { 7608 __nft_unregister_flowtable_net_hooks(net, hook_list, false); 7609 } 7610 7611 static int nft_register_flowtable_net_hooks(struct net *net, 7612 struct nft_table *table, 7613 struct list_head *hook_list, 7614 struct nft_flowtable *flowtable) 7615 { 7616 struct nft_hook *hook, *hook2, *next; 7617 struct nft_flowtable *ft; 7618 int err, i = 0; 7619 7620 list_for_each_entry(hook, hook_list, list) { 7621 list_for_each_entry(ft, &table->flowtables, list) { 7622 if (!nft_is_active_next(net, ft)) 7623 continue; 7624 7625 list_for_each_entry(hook2, &ft->hook_list, list) { 7626 if (hook->ops.dev == hook2->ops.dev && 7627 hook->ops.pf == hook2->ops.pf) { 7628 err = -EEXIST; 7629 goto err_unregister_net_hooks; 7630 } 7631 } 7632 } 7633 7634 err = flowtable->data.type->setup(&flowtable->data, 7635 hook->ops.dev, 7636 FLOW_BLOCK_BIND); 7637 if (err < 0) 7638 goto err_unregister_net_hooks; 7639 7640 err = nf_register_net_hook(net, &hook->ops); 7641 if (err < 0) { 7642 flowtable->data.type->setup(&flowtable->data, 7643 hook->ops.dev, 7644 FLOW_BLOCK_UNBIND); 7645 goto err_unregister_net_hooks; 7646 } 7647 7648 i++; 7649 } 7650 7651 return 0; 7652 7653 err_unregister_net_hooks: 7654 list_for_each_entry_safe(hook, next, hook_list, list) { 7655 if (i-- <= 0) 7656 break; 7657 7658 nft_unregister_flowtable_hook(net, flowtable, hook); 7659 list_del_rcu(&hook->list); 7660 kfree_rcu(hook, rcu); 7661 } 7662 7663 return err; 7664 } 7665 7666 static void nft_flowtable_hooks_destroy(struct list_head *hook_list) 7667 { 7668 struct nft_hook *hook, *next; 7669 7670 list_for_each_entry_safe(hook, next, hook_list, list) { 7671 list_del_rcu(&hook->list); 7672 kfree_rcu(hook, rcu); 7673 } 7674 } 7675 7676 static int nft_flowtable_update(struct nft_ctx *ctx, const struct nlmsghdr *nlh, 7677 struct nft_flowtable *flowtable) 7678 { 7679 const struct nlattr * const *nla = ctx->nla; 7680 struct nft_flowtable_hook flowtable_hook; 7681 struct nft_hook *hook, *next; 7682 struct nft_trans *trans; 7683 bool unregister = false; 7684 u32 flags; 7685 int err; 7686 7687 err = nft_flowtable_parse_hook(ctx, nla[NFTA_FLOWTABLE_HOOK], 7688 &flowtable_hook, flowtable, false); 7689 if (err < 0) 7690 return err; 7691 7692 list_for_each_entry_safe(hook, next, &flowtable_hook.list, list) { 7693 if (nft_hook_list_find(&flowtable->hook_list, hook)) { 7694 list_del(&hook->list); 7695 kfree(hook); 7696 } 7697 } 7698 7699 if (nla[NFTA_FLOWTABLE_FLAGS]) { 7700 flags = ntohl(nla_get_be32(nla[NFTA_FLOWTABLE_FLAGS])); 7701 if (flags & ~NFT_FLOWTABLE_MASK) { 7702 err = -EOPNOTSUPP; 7703 goto err_flowtable_update_hook; 7704 } 7705 if ((flowtable->data.flags & NFT_FLOWTABLE_HW_OFFLOAD) ^ 7706 (flags & NFT_FLOWTABLE_HW_OFFLOAD)) { 7707 err = -EOPNOTSUPP; 7708 goto err_flowtable_update_hook; 7709 } 7710 } else { 7711 flags = flowtable->data.flags; 7712 } 7713 7714 err = nft_register_flowtable_net_hooks(ctx->net, ctx->table, 7715 &flowtable_hook.list, flowtable); 7716 if (err < 0) 7717 goto err_flowtable_update_hook; 7718 7719 trans = nft_trans_alloc(ctx, NFT_MSG_NEWFLOWTABLE, 7720 sizeof(struct nft_trans_flowtable)); 7721 if (!trans) { 7722 unregister = true; 7723 err = -ENOMEM; 7724 goto err_flowtable_update_hook; 7725 } 7726 7727 nft_trans_flowtable_flags(trans) = flags; 7728 nft_trans_flowtable(trans) = flowtable; 7729 nft_trans_flowtable_update(trans) = true; 7730 INIT_LIST_HEAD(&nft_trans_flowtable_hooks(trans)); 7731 list_splice(&flowtable_hook.list, &nft_trans_flowtable_hooks(trans)); 7732 7733 nft_trans_commit_list_add_tail(ctx->net, trans); 7734 7735 return 0; 7736 7737 err_flowtable_update_hook: 7738 list_for_each_entry_safe(hook, next, &flowtable_hook.list, list) { 7739 if (unregister) 7740 nft_unregister_flowtable_hook(ctx->net, flowtable, hook); 7741 list_del_rcu(&hook->list); 7742 kfree_rcu(hook, rcu); 7743 } 7744 7745 return err; 7746 7747 } 7748 7749 static int nf_tables_newflowtable(struct sk_buff *skb, 7750 const struct nfnl_info *info, 7751 const struct nlattr * const nla[]) 7752 { 7753 struct netlink_ext_ack *extack = info->extack; 7754 struct nft_flowtable_hook flowtable_hook; 7755 u8 genmask = nft_genmask_next(info->net); 7756 u8 family = info->nfmsg->nfgen_family; 7757 const struct nf_flowtable_type *type; 7758 struct nft_flowtable *flowtable; 7759 struct nft_hook *hook, *next; 7760 struct net *net = info->net; 7761 struct nft_table *table; 7762 struct nft_ctx ctx; 7763 int err; 7764 7765 if (!nla[NFTA_FLOWTABLE_TABLE] || 7766 !nla[NFTA_FLOWTABLE_NAME] || 7767 !nla[NFTA_FLOWTABLE_HOOK]) 7768 return -EINVAL; 7769 7770 table = nft_table_lookup(net, nla[NFTA_FLOWTABLE_TABLE], family, 7771 genmask, NETLINK_CB(skb).portid); 7772 if (IS_ERR(table)) { 7773 NL_SET_BAD_ATTR(extack, nla[NFTA_FLOWTABLE_TABLE]); 7774 return PTR_ERR(table); 7775 } 7776 7777 flowtable = nft_flowtable_lookup(table, nla[NFTA_FLOWTABLE_NAME], 7778 genmask); 7779 if (IS_ERR(flowtable)) { 7780 err = PTR_ERR(flowtable); 7781 if (err != -ENOENT) { 7782 NL_SET_BAD_ATTR(extack, nla[NFTA_FLOWTABLE_NAME]); 7783 return err; 7784 } 7785 } else { 7786 if (info->nlh->nlmsg_flags & NLM_F_EXCL) { 7787 NL_SET_BAD_ATTR(extack, nla[NFTA_FLOWTABLE_NAME]); 7788 return -EEXIST; 7789 } 7790 7791 nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla); 7792 7793 return nft_flowtable_update(&ctx, info->nlh, flowtable); 7794 } 7795 7796 nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla); 7797 7798 flowtable = kzalloc(sizeof(*flowtable), GFP_KERNEL_ACCOUNT); 7799 if (!flowtable) 7800 return -ENOMEM; 7801 7802 flowtable->table = table; 7803 flowtable->handle = nf_tables_alloc_handle(table); 7804 INIT_LIST_HEAD(&flowtable->hook_list); 7805 7806 flowtable->name = nla_strdup(nla[NFTA_FLOWTABLE_NAME], GFP_KERNEL_ACCOUNT); 7807 if (!flowtable->name) { 7808 err = -ENOMEM; 7809 goto err1; 7810 } 7811 7812 type = nft_flowtable_type_get(net, family); 7813 if (IS_ERR(type)) { 7814 err = PTR_ERR(type); 7815 goto err2; 7816 } 7817 7818 if (nla[NFTA_FLOWTABLE_FLAGS]) { 7819 flowtable->data.flags = 7820 ntohl(nla_get_be32(nla[NFTA_FLOWTABLE_FLAGS])); 7821 if (flowtable->data.flags & ~NFT_FLOWTABLE_MASK) { 7822 err = -EOPNOTSUPP; 7823 goto err3; 7824 } 7825 } 7826 7827 write_pnet(&flowtable->data.net, net); 7828 flowtable->data.type = type; 7829 err = type->init(&flowtable->data); 7830 if (err < 0) 7831 goto err3; 7832 7833 err = nft_flowtable_parse_hook(&ctx, nla[NFTA_FLOWTABLE_HOOK], 7834 &flowtable_hook, flowtable, true); 7835 if (err < 0) 7836 goto err4; 7837 7838 list_splice(&flowtable_hook.list, &flowtable->hook_list); 7839 flowtable->data.priority = flowtable_hook.priority; 7840 flowtable->hooknum = flowtable_hook.num; 7841 7842 err = nft_register_flowtable_net_hooks(ctx.net, table, 7843 &flowtable->hook_list, 7844 flowtable); 7845 if (err < 0) { 7846 nft_flowtable_hooks_destroy(&flowtable->hook_list); 7847 goto err4; 7848 } 7849 7850 err = nft_trans_flowtable_add(&ctx, NFT_MSG_NEWFLOWTABLE, flowtable); 7851 if (err < 0) 7852 goto err5; 7853 7854 list_add_tail_rcu(&flowtable->list, &table->flowtables); 7855 table->use++; 7856 7857 return 0; 7858 err5: 7859 list_for_each_entry_safe(hook, next, &flowtable->hook_list, list) { 7860 nft_unregister_flowtable_hook(net, flowtable, hook); 7861 list_del_rcu(&hook->list); 7862 kfree_rcu(hook, rcu); 7863 } 7864 err4: 7865 flowtable->data.type->free(&flowtable->data); 7866 err3: 7867 module_put(type->owner); 7868 err2: 7869 kfree(flowtable->name); 7870 err1: 7871 kfree(flowtable); 7872 return err; 7873 } 7874 7875 static void nft_flowtable_hook_release(struct nft_flowtable_hook *flowtable_hook) 7876 { 7877 struct nft_hook *this, *next; 7878 7879 list_for_each_entry_safe(this, next, &flowtable_hook->list, list) { 7880 list_del(&this->list); 7881 kfree(this); 7882 } 7883 } 7884 7885 static int nft_delflowtable_hook(struct nft_ctx *ctx, 7886 struct nft_flowtable *flowtable) 7887 { 7888 const struct nlattr * const *nla = ctx->nla; 7889 struct nft_flowtable_hook flowtable_hook; 7890 LIST_HEAD(flowtable_del_list); 7891 struct nft_hook *this, *hook; 7892 struct nft_trans *trans; 7893 int err; 7894 7895 err = nft_flowtable_parse_hook(ctx, nla[NFTA_FLOWTABLE_HOOK], 7896 &flowtable_hook, flowtable, false); 7897 if (err < 0) 7898 return err; 7899 7900 list_for_each_entry(this, &flowtable_hook.list, list) { 7901 hook = nft_hook_list_find(&flowtable->hook_list, this); 7902 if (!hook) { 7903 err = -ENOENT; 7904 goto err_flowtable_del_hook; 7905 } 7906 list_move(&hook->list, &flowtable_del_list); 7907 } 7908 7909 trans = nft_trans_alloc(ctx, NFT_MSG_DELFLOWTABLE, 7910 sizeof(struct nft_trans_flowtable)); 7911 if (!trans) { 7912 err = -ENOMEM; 7913 goto err_flowtable_del_hook; 7914 } 7915 7916 nft_trans_flowtable(trans) = flowtable; 7917 nft_trans_flowtable_update(trans) = true; 7918 INIT_LIST_HEAD(&nft_trans_flowtable_hooks(trans)); 7919 list_splice(&flowtable_del_list, &nft_trans_flowtable_hooks(trans)); 7920 nft_flowtable_hook_release(&flowtable_hook); 7921 7922 nft_trans_commit_list_add_tail(ctx->net, trans); 7923 7924 return 0; 7925 7926 err_flowtable_del_hook: 7927 list_splice(&flowtable_del_list, &flowtable->hook_list); 7928 nft_flowtable_hook_release(&flowtable_hook); 7929 7930 return err; 7931 } 7932 7933 static int nf_tables_delflowtable(struct sk_buff *skb, 7934 const struct nfnl_info *info, 7935 const struct nlattr * const nla[]) 7936 { 7937 struct netlink_ext_ack *extack = info->extack; 7938 u8 genmask = nft_genmask_next(info->net); 7939 u8 family = info->nfmsg->nfgen_family; 7940 struct nft_flowtable *flowtable; 7941 struct net *net = info->net; 7942 const struct nlattr *attr; 7943 struct nft_table *table; 7944 struct nft_ctx ctx; 7945 7946 if (!nla[NFTA_FLOWTABLE_TABLE] || 7947 (!nla[NFTA_FLOWTABLE_NAME] && 7948 !nla[NFTA_FLOWTABLE_HANDLE])) 7949 return -EINVAL; 7950 7951 table = nft_table_lookup(net, nla[NFTA_FLOWTABLE_TABLE], family, 7952 genmask, NETLINK_CB(skb).portid); 7953 if (IS_ERR(table)) { 7954 NL_SET_BAD_ATTR(extack, nla[NFTA_FLOWTABLE_TABLE]); 7955 return PTR_ERR(table); 7956 } 7957 7958 if (nla[NFTA_FLOWTABLE_HANDLE]) { 7959 attr = nla[NFTA_FLOWTABLE_HANDLE]; 7960 flowtable = nft_flowtable_lookup_byhandle(table, attr, genmask); 7961 } else { 7962 attr = nla[NFTA_FLOWTABLE_NAME]; 7963 flowtable = nft_flowtable_lookup(table, attr, genmask); 7964 } 7965 7966 if (IS_ERR(flowtable)) { 7967 NL_SET_BAD_ATTR(extack, attr); 7968 return PTR_ERR(flowtable); 7969 } 7970 7971 nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla); 7972 7973 if (nla[NFTA_FLOWTABLE_HOOK]) 7974 return nft_delflowtable_hook(&ctx, flowtable); 7975 7976 if (flowtable->use > 0) { 7977 NL_SET_BAD_ATTR(extack, attr); 7978 return -EBUSY; 7979 } 7980 7981 return nft_delflowtable(&ctx, flowtable); 7982 } 7983 7984 static int nf_tables_fill_flowtable_info(struct sk_buff *skb, struct net *net, 7985 u32 portid, u32 seq, int event, 7986 u32 flags, int family, 7987 struct nft_flowtable *flowtable, 7988 struct list_head *hook_list) 7989 { 7990 struct nlattr *nest, *nest_devs; 7991 struct nft_hook *hook; 7992 struct nlmsghdr *nlh; 7993 7994 event = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event); 7995 nlh = nfnl_msg_put(skb, portid, seq, event, flags, family, 7996 NFNETLINK_V0, nft_base_seq(net)); 7997 if (!nlh) 7998 goto nla_put_failure; 7999 8000 if (nla_put_string(skb, NFTA_FLOWTABLE_TABLE, flowtable->table->name) || 8001 nla_put_string(skb, NFTA_FLOWTABLE_NAME, flowtable->name) || 8002 nla_put_be32(skb, NFTA_FLOWTABLE_USE, htonl(flowtable->use)) || 8003 nla_put_be64(skb, NFTA_FLOWTABLE_HANDLE, cpu_to_be64(flowtable->handle), 8004 NFTA_FLOWTABLE_PAD) || 8005 nla_put_be32(skb, NFTA_FLOWTABLE_FLAGS, htonl(flowtable->data.flags))) 8006 goto nla_put_failure; 8007 8008 nest = nla_nest_start_noflag(skb, NFTA_FLOWTABLE_HOOK); 8009 if (!nest) 8010 goto nla_put_failure; 8011 if (nla_put_be32(skb, NFTA_FLOWTABLE_HOOK_NUM, htonl(flowtable->hooknum)) || 8012 nla_put_be32(skb, NFTA_FLOWTABLE_HOOK_PRIORITY, htonl(flowtable->data.priority))) 8013 goto nla_put_failure; 8014 8015 nest_devs = nla_nest_start_noflag(skb, NFTA_FLOWTABLE_HOOK_DEVS); 8016 if (!nest_devs) 8017 goto nla_put_failure; 8018 8019 list_for_each_entry_rcu(hook, hook_list, list) { 8020 if (nla_put_string(skb, NFTA_DEVICE_NAME, hook->ops.dev->name)) 8021 goto nla_put_failure; 8022 } 8023 nla_nest_end(skb, nest_devs); 8024 nla_nest_end(skb, nest); 8025 8026 nlmsg_end(skb, nlh); 8027 return 0; 8028 8029 nla_put_failure: 8030 nlmsg_trim(skb, nlh); 8031 return -1; 8032 } 8033 8034 struct nft_flowtable_filter { 8035 char *table; 8036 }; 8037 8038 static int nf_tables_dump_flowtable(struct sk_buff *skb, 8039 struct netlink_callback *cb) 8040 { 8041 const struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh); 8042 struct nft_flowtable_filter *filter = cb->data; 8043 unsigned int idx = 0, s_idx = cb->args[0]; 8044 struct net *net = sock_net(skb->sk); 8045 int family = nfmsg->nfgen_family; 8046 struct nft_flowtable *flowtable; 8047 struct nftables_pernet *nft_net; 8048 const struct nft_table *table; 8049 8050 rcu_read_lock(); 8051 nft_net = nft_pernet(net); 8052 cb->seq = READ_ONCE(nft_net->base_seq); 8053 8054 list_for_each_entry_rcu(table, &nft_net->tables, list) { 8055 if (family != NFPROTO_UNSPEC && family != table->family) 8056 continue; 8057 8058 list_for_each_entry_rcu(flowtable, &table->flowtables, list) { 8059 if (!nft_is_active(net, flowtable)) 8060 goto cont; 8061 if (idx < s_idx) 8062 goto cont; 8063 if (idx > s_idx) 8064 memset(&cb->args[1], 0, 8065 sizeof(cb->args) - sizeof(cb->args[0])); 8066 if (filter && filter->table && 8067 strcmp(filter->table, table->name)) 8068 goto cont; 8069 8070 if (nf_tables_fill_flowtable_info(skb, net, NETLINK_CB(cb->skb).portid, 8071 cb->nlh->nlmsg_seq, 8072 NFT_MSG_NEWFLOWTABLE, 8073 NLM_F_MULTI | NLM_F_APPEND, 8074 table->family, 8075 flowtable, 8076 &flowtable->hook_list) < 0) 8077 goto done; 8078 8079 nl_dump_check_consistent(cb, nlmsg_hdr(skb)); 8080 cont: 8081 idx++; 8082 } 8083 } 8084 done: 8085 rcu_read_unlock(); 8086 8087 cb->args[0] = idx; 8088 return skb->len; 8089 } 8090 8091 static int nf_tables_dump_flowtable_start(struct netlink_callback *cb) 8092 { 8093 const struct nlattr * const *nla = cb->data; 8094 struct nft_flowtable_filter *filter = NULL; 8095 8096 if (nla[NFTA_FLOWTABLE_TABLE]) { 8097 filter = kzalloc(sizeof(*filter), GFP_ATOMIC); 8098 if (!filter) 8099 return -ENOMEM; 8100 8101 filter->table = nla_strdup(nla[NFTA_FLOWTABLE_TABLE], 8102 GFP_ATOMIC); 8103 if (!filter->table) { 8104 kfree(filter); 8105 return -ENOMEM; 8106 } 8107 } 8108 8109 cb->data = filter; 8110 return 0; 8111 } 8112 8113 static int nf_tables_dump_flowtable_done(struct netlink_callback *cb) 8114 { 8115 struct nft_flowtable_filter *filter = cb->data; 8116 8117 if (!filter) 8118 return 0; 8119 8120 kfree(filter->table); 8121 kfree(filter); 8122 8123 return 0; 8124 } 8125 8126 /* called with rcu_read_lock held */ 8127 static int nf_tables_getflowtable(struct sk_buff *skb, 8128 const struct nfnl_info *info, 8129 const struct nlattr * const nla[]) 8130 { 8131 u8 genmask = nft_genmask_cur(info->net); 8132 u8 family = info->nfmsg->nfgen_family; 8133 struct nft_flowtable *flowtable; 8134 const struct nft_table *table; 8135 struct net *net = info->net; 8136 struct sk_buff *skb2; 8137 int err; 8138 8139 if (info->nlh->nlmsg_flags & NLM_F_DUMP) { 8140 struct netlink_dump_control c = { 8141 .start = nf_tables_dump_flowtable_start, 8142 .dump = nf_tables_dump_flowtable, 8143 .done = nf_tables_dump_flowtable_done, 8144 .module = THIS_MODULE, 8145 .data = (void *)nla, 8146 }; 8147 8148 return nft_netlink_dump_start_rcu(info->sk, skb, info->nlh, &c); 8149 } 8150 8151 if (!nla[NFTA_FLOWTABLE_NAME]) 8152 return -EINVAL; 8153 8154 table = nft_table_lookup(net, nla[NFTA_FLOWTABLE_TABLE], family, 8155 genmask, 0); 8156 if (IS_ERR(table)) 8157 return PTR_ERR(table); 8158 8159 flowtable = nft_flowtable_lookup(table, nla[NFTA_FLOWTABLE_NAME], 8160 genmask); 8161 if (IS_ERR(flowtable)) 8162 return PTR_ERR(flowtable); 8163 8164 skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC); 8165 if (!skb2) 8166 return -ENOMEM; 8167 8168 err = nf_tables_fill_flowtable_info(skb2, net, NETLINK_CB(skb).portid, 8169 info->nlh->nlmsg_seq, 8170 NFT_MSG_NEWFLOWTABLE, 0, family, 8171 flowtable, &flowtable->hook_list); 8172 if (err < 0) 8173 goto err_fill_flowtable_info; 8174 8175 return nfnetlink_unicast(skb2, net, NETLINK_CB(skb).portid); 8176 8177 err_fill_flowtable_info: 8178 kfree_skb(skb2); 8179 return err; 8180 } 8181 8182 static void nf_tables_flowtable_notify(struct nft_ctx *ctx, 8183 struct nft_flowtable *flowtable, 8184 struct list_head *hook_list, 8185 int event) 8186 { 8187 struct nftables_pernet *nft_net = nft_pernet(ctx->net); 8188 struct sk_buff *skb; 8189 u16 flags = 0; 8190 int err; 8191 8192 if (!ctx->report && 8193 !nfnetlink_has_listeners(ctx->net, NFNLGRP_NFTABLES)) 8194 return; 8195 8196 skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL); 8197 if (skb == NULL) 8198 goto err; 8199 8200 if (ctx->flags & (NLM_F_CREATE | NLM_F_EXCL)) 8201 flags |= ctx->flags & (NLM_F_CREATE | NLM_F_EXCL); 8202 8203 err = nf_tables_fill_flowtable_info(skb, ctx->net, ctx->portid, 8204 ctx->seq, event, flags, 8205 ctx->family, flowtable, hook_list); 8206 if (err < 0) { 8207 kfree_skb(skb); 8208 goto err; 8209 } 8210 8211 nft_notify_enqueue(skb, ctx->report, &nft_net->notify_list); 8212 return; 8213 err: 8214 nfnetlink_set_err(ctx->net, ctx->portid, NFNLGRP_NFTABLES, -ENOBUFS); 8215 } 8216 8217 static void nf_tables_flowtable_destroy(struct nft_flowtable *flowtable) 8218 { 8219 struct nft_hook *hook, *next; 8220 8221 flowtable->data.type->free(&flowtable->data); 8222 list_for_each_entry_safe(hook, next, &flowtable->hook_list, list) { 8223 flowtable->data.type->setup(&flowtable->data, hook->ops.dev, 8224 FLOW_BLOCK_UNBIND); 8225 list_del_rcu(&hook->list); 8226 kfree(hook); 8227 } 8228 kfree(flowtable->name); 8229 module_put(flowtable->data.type->owner); 8230 kfree(flowtable); 8231 } 8232 8233 static int nf_tables_fill_gen_info(struct sk_buff *skb, struct net *net, 8234 u32 portid, u32 seq) 8235 { 8236 struct nftables_pernet *nft_net = nft_pernet(net); 8237 struct nlmsghdr *nlh; 8238 char buf[TASK_COMM_LEN]; 8239 int event = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, NFT_MSG_NEWGEN); 8240 8241 nlh = nfnl_msg_put(skb, portid, seq, event, 0, AF_UNSPEC, 8242 NFNETLINK_V0, nft_base_seq(net)); 8243 if (!nlh) 8244 goto nla_put_failure; 8245 8246 if (nla_put_be32(skb, NFTA_GEN_ID, htonl(nft_net->base_seq)) || 8247 nla_put_be32(skb, NFTA_GEN_PROC_PID, htonl(task_pid_nr(current))) || 8248 nla_put_string(skb, NFTA_GEN_PROC_NAME, get_task_comm(buf, current))) 8249 goto nla_put_failure; 8250 8251 nlmsg_end(skb, nlh); 8252 return 0; 8253 8254 nla_put_failure: 8255 nlmsg_trim(skb, nlh); 8256 return -EMSGSIZE; 8257 } 8258 8259 static void nft_flowtable_event(unsigned long event, struct net_device *dev, 8260 struct nft_flowtable *flowtable) 8261 { 8262 struct nft_hook *hook; 8263 8264 list_for_each_entry(hook, &flowtable->hook_list, list) { 8265 if (hook->ops.dev != dev) 8266 continue; 8267 8268 /* flow_offload_netdev_event() cleans up entries for us. */ 8269 nft_unregister_flowtable_hook(dev_net(dev), flowtable, hook); 8270 list_del_rcu(&hook->list); 8271 kfree_rcu(hook, rcu); 8272 break; 8273 } 8274 } 8275 8276 static int nf_tables_flowtable_event(struct notifier_block *this, 8277 unsigned long event, void *ptr) 8278 { 8279 struct net_device *dev = netdev_notifier_info_to_dev(ptr); 8280 struct nft_flowtable *flowtable; 8281 struct nftables_pernet *nft_net; 8282 struct nft_table *table; 8283 struct net *net; 8284 8285 if (event != NETDEV_UNREGISTER) 8286 return 0; 8287 8288 net = dev_net(dev); 8289 nft_net = nft_pernet(net); 8290 mutex_lock(&nft_net->commit_mutex); 8291 list_for_each_entry(table, &nft_net->tables, list) { 8292 list_for_each_entry(flowtable, &table->flowtables, list) { 8293 nft_flowtable_event(event, dev, flowtable); 8294 } 8295 } 8296 mutex_unlock(&nft_net->commit_mutex); 8297 8298 return NOTIFY_DONE; 8299 } 8300 8301 static struct notifier_block nf_tables_flowtable_notifier = { 8302 .notifier_call = nf_tables_flowtable_event, 8303 }; 8304 8305 static void nf_tables_gen_notify(struct net *net, struct sk_buff *skb, 8306 int event) 8307 { 8308 struct nlmsghdr *nlh = nlmsg_hdr(skb); 8309 struct sk_buff *skb2; 8310 int err; 8311 8312 if (!nlmsg_report(nlh) && 8313 !nfnetlink_has_listeners(net, NFNLGRP_NFTABLES)) 8314 return; 8315 8316 skb2 = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL); 8317 if (skb2 == NULL) 8318 goto err; 8319 8320 err = nf_tables_fill_gen_info(skb2, net, NETLINK_CB(skb).portid, 8321 nlh->nlmsg_seq); 8322 if (err < 0) { 8323 kfree_skb(skb2); 8324 goto err; 8325 } 8326 8327 nfnetlink_send(skb2, net, NETLINK_CB(skb).portid, NFNLGRP_NFTABLES, 8328 nlmsg_report(nlh), GFP_KERNEL); 8329 return; 8330 err: 8331 nfnetlink_set_err(net, NETLINK_CB(skb).portid, NFNLGRP_NFTABLES, 8332 -ENOBUFS); 8333 } 8334 8335 static int nf_tables_getgen(struct sk_buff *skb, const struct nfnl_info *info, 8336 const struct nlattr * const nla[]) 8337 { 8338 struct sk_buff *skb2; 8339 int err; 8340 8341 skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC); 8342 if (skb2 == NULL) 8343 return -ENOMEM; 8344 8345 err = nf_tables_fill_gen_info(skb2, info->net, NETLINK_CB(skb).portid, 8346 info->nlh->nlmsg_seq); 8347 if (err < 0) 8348 goto err_fill_gen_info; 8349 8350 return nfnetlink_unicast(skb2, info->net, NETLINK_CB(skb).portid); 8351 8352 err_fill_gen_info: 8353 kfree_skb(skb2); 8354 return err; 8355 } 8356 8357 static const struct nfnl_callback nf_tables_cb[NFT_MSG_MAX] = { 8358 [NFT_MSG_NEWTABLE] = { 8359 .call = nf_tables_newtable, 8360 .type = NFNL_CB_BATCH, 8361 .attr_count = NFTA_TABLE_MAX, 8362 .policy = nft_table_policy, 8363 }, 8364 [NFT_MSG_GETTABLE] = { 8365 .call = nf_tables_gettable, 8366 .type = NFNL_CB_RCU, 8367 .attr_count = NFTA_TABLE_MAX, 8368 .policy = nft_table_policy, 8369 }, 8370 [NFT_MSG_DELTABLE] = { 8371 .call = nf_tables_deltable, 8372 .type = NFNL_CB_BATCH, 8373 .attr_count = NFTA_TABLE_MAX, 8374 .policy = nft_table_policy, 8375 }, 8376 [NFT_MSG_NEWCHAIN] = { 8377 .call = nf_tables_newchain, 8378 .type = NFNL_CB_BATCH, 8379 .attr_count = NFTA_CHAIN_MAX, 8380 .policy = nft_chain_policy, 8381 }, 8382 [NFT_MSG_GETCHAIN] = { 8383 .call = nf_tables_getchain, 8384 .type = NFNL_CB_RCU, 8385 .attr_count = NFTA_CHAIN_MAX, 8386 .policy = nft_chain_policy, 8387 }, 8388 [NFT_MSG_DELCHAIN] = { 8389 .call = nf_tables_delchain, 8390 .type = NFNL_CB_BATCH, 8391 .attr_count = NFTA_CHAIN_MAX, 8392 .policy = nft_chain_policy, 8393 }, 8394 [NFT_MSG_NEWRULE] = { 8395 .call = nf_tables_newrule, 8396 .type = NFNL_CB_BATCH, 8397 .attr_count = NFTA_RULE_MAX, 8398 .policy = nft_rule_policy, 8399 }, 8400 [NFT_MSG_GETRULE] = { 8401 .call = nf_tables_getrule, 8402 .type = NFNL_CB_RCU, 8403 .attr_count = NFTA_RULE_MAX, 8404 .policy = nft_rule_policy, 8405 }, 8406 [NFT_MSG_GETRULE_RESET] = { 8407 .call = nf_tables_getrule, 8408 .type = NFNL_CB_RCU, 8409 .attr_count = NFTA_RULE_MAX, 8410 .policy = nft_rule_policy, 8411 }, 8412 [NFT_MSG_DELRULE] = { 8413 .call = nf_tables_delrule, 8414 .type = NFNL_CB_BATCH, 8415 .attr_count = NFTA_RULE_MAX, 8416 .policy = nft_rule_policy, 8417 }, 8418 [NFT_MSG_NEWSET] = { 8419 .call = nf_tables_newset, 8420 .type = NFNL_CB_BATCH, 8421 .attr_count = NFTA_SET_MAX, 8422 .policy = nft_set_policy, 8423 }, 8424 [NFT_MSG_GETSET] = { 8425 .call = nf_tables_getset, 8426 .type = NFNL_CB_RCU, 8427 .attr_count = NFTA_SET_MAX, 8428 .policy = nft_set_policy, 8429 }, 8430 [NFT_MSG_DELSET] = { 8431 .call = nf_tables_delset, 8432 .type = NFNL_CB_BATCH, 8433 .attr_count = NFTA_SET_MAX, 8434 .policy = nft_set_policy, 8435 }, 8436 [NFT_MSG_NEWSETELEM] = { 8437 .call = nf_tables_newsetelem, 8438 .type = NFNL_CB_BATCH, 8439 .attr_count = NFTA_SET_ELEM_LIST_MAX, 8440 .policy = nft_set_elem_list_policy, 8441 }, 8442 [NFT_MSG_GETSETELEM] = { 8443 .call = nf_tables_getsetelem, 8444 .type = NFNL_CB_RCU, 8445 .attr_count = NFTA_SET_ELEM_LIST_MAX, 8446 .policy = nft_set_elem_list_policy, 8447 }, 8448 [NFT_MSG_DELSETELEM] = { 8449 .call = nf_tables_delsetelem, 8450 .type = NFNL_CB_BATCH, 8451 .attr_count = NFTA_SET_ELEM_LIST_MAX, 8452 .policy = nft_set_elem_list_policy, 8453 }, 8454 [NFT_MSG_GETGEN] = { 8455 .call = nf_tables_getgen, 8456 .type = NFNL_CB_RCU, 8457 }, 8458 [NFT_MSG_NEWOBJ] = { 8459 .call = nf_tables_newobj, 8460 .type = NFNL_CB_BATCH, 8461 .attr_count = NFTA_OBJ_MAX, 8462 .policy = nft_obj_policy, 8463 }, 8464 [NFT_MSG_GETOBJ] = { 8465 .call = nf_tables_getobj, 8466 .type = NFNL_CB_RCU, 8467 .attr_count = NFTA_OBJ_MAX, 8468 .policy = nft_obj_policy, 8469 }, 8470 [NFT_MSG_DELOBJ] = { 8471 .call = nf_tables_delobj, 8472 .type = NFNL_CB_BATCH, 8473 .attr_count = NFTA_OBJ_MAX, 8474 .policy = nft_obj_policy, 8475 }, 8476 [NFT_MSG_GETOBJ_RESET] = { 8477 .call = nf_tables_getobj, 8478 .type = NFNL_CB_RCU, 8479 .attr_count = NFTA_OBJ_MAX, 8480 .policy = nft_obj_policy, 8481 }, 8482 [NFT_MSG_NEWFLOWTABLE] = { 8483 .call = nf_tables_newflowtable, 8484 .type = NFNL_CB_BATCH, 8485 .attr_count = NFTA_FLOWTABLE_MAX, 8486 .policy = nft_flowtable_policy, 8487 }, 8488 [NFT_MSG_GETFLOWTABLE] = { 8489 .call = nf_tables_getflowtable, 8490 .type = NFNL_CB_RCU, 8491 .attr_count = NFTA_FLOWTABLE_MAX, 8492 .policy = nft_flowtable_policy, 8493 }, 8494 [NFT_MSG_DELFLOWTABLE] = { 8495 .call = nf_tables_delflowtable, 8496 .type = NFNL_CB_BATCH, 8497 .attr_count = NFTA_FLOWTABLE_MAX, 8498 .policy = nft_flowtable_policy, 8499 }, 8500 }; 8501 8502 static int nf_tables_validate(struct net *net) 8503 { 8504 struct nftables_pernet *nft_net = nft_pernet(net); 8505 struct nft_table *table; 8506 8507 switch (nft_net->validate_state) { 8508 case NFT_VALIDATE_SKIP: 8509 break; 8510 case NFT_VALIDATE_NEED: 8511 nft_validate_state_update(net, NFT_VALIDATE_DO); 8512 fallthrough; 8513 case NFT_VALIDATE_DO: 8514 list_for_each_entry(table, &nft_net->tables, list) { 8515 if (nft_table_validate(net, table) < 0) 8516 return -EAGAIN; 8517 } 8518 break; 8519 } 8520 8521 return 0; 8522 } 8523 8524 /* a drop policy has to be deferred until all rules have been activated, 8525 * otherwise a large ruleset that contains a drop-policy base chain will 8526 * cause all packets to get dropped until the full transaction has been 8527 * processed. 8528 * 8529 * We defer the drop policy until the transaction has been finalized. 8530 */ 8531 static void nft_chain_commit_drop_policy(struct nft_trans *trans) 8532 { 8533 struct nft_base_chain *basechain; 8534 8535 if (nft_trans_chain_policy(trans) != NF_DROP) 8536 return; 8537 8538 if (!nft_is_base_chain(trans->ctx.chain)) 8539 return; 8540 8541 basechain = nft_base_chain(trans->ctx.chain); 8542 basechain->policy = NF_DROP; 8543 } 8544 8545 static void nft_chain_commit_update(struct nft_trans *trans) 8546 { 8547 struct nft_base_chain *basechain; 8548 8549 if (nft_trans_chain_name(trans)) { 8550 rhltable_remove(&trans->ctx.table->chains_ht, 8551 &trans->ctx.chain->rhlhead, 8552 nft_chain_ht_params); 8553 swap(trans->ctx.chain->name, nft_trans_chain_name(trans)); 8554 rhltable_insert_key(&trans->ctx.table->chains_ht, 8555 trans->ctx.chain->name, 8556 &trans->ctx.chain->rhlhead, 8557 nft_chain_ht_params); 8558 } 8559 8560 if (!nft_is_base_chain(trans->ctx.chain)) 8561 return; 8562 8563 nft_chain_stats_replace(trans); 8564 8565 basechain = nft_base_chain(trans->ctx.chain); 8566 8567 switch (nft_trans_chain_policy(trans)) { 8568 case NF_DROP: 8569 case NF_ACCEPT: 8570 basechain->policy = nft_trans_chain_policy(trans); 8571 break; 8572 } 8573 } 8574 8575 static void nft_obj_commit_update(struct nft_trans *trans) 8576 { 8577 struct nft_object *newobj; 8578 struct nft_object *obj; 8579 8580 obj = nft_trans_obj(trans); 8581 newobj = nft_trans_obj_newobj(trans); 8582 8583 if (obj->ops->update) 8584 obj->ops->update(obj, newobj); 8585 8586 nft_obj_destroy(&trans->ctx, newobj); 8587 } 8588 8589 static void nft_commit_release(struct nft_trans *trans) 8590 { 8591 switch (trans->msg_type) { 8592 case NFT_MSG_DELTABLE: 8593 nf_tables_table_destroy(&trans->ctx); 8594 break; 8595 case NFT_MSG_NEWCHAIN: 8596 free_percpu(nft_trans_chain_stats(trans)); 8597 kfree(nft_trans_chain_name(trans)); 8598 break; 8599 case NFT_MSG_DELCHAIN: 8600 nf_tables_chain_destroy(&trans->ctx); 8601 break; 8602 case NFT_MSG_DELRULE: 8603 nf_tables_rule_destroy(&trans->ctx, nft_trans_rule(trans)); 8604 break; 8605 case NFT_MSG_DELSET: 8606 nft_set_destroy(&trans->ctx, nft_trans_set(trans)); 8607 break; 8608 case NFT_MSG_DELSETELEM: 8609 nf_tables_set_elem_destroy(&trans->ctx, 8610 nft_trans_elem_set(trans), 8611 nft_trans_elem(trans).priv); 8612 break; 8613 case NFT_MSG_DELOBJ: 8614 nft_obj_destroy(&trans->ctx, nft_trans_obj(trans)); 8615 break; 8616 case NFT_MSG_DELFLOWTABLE: 8617 if (nft_trans_flowtable_update(trans)) 8618 nft_flowtable_hooks_destroy(&nft_trans_flowtable_hooks(trans)); 8619 else 8620 nf_tables_flowtable_destroy(nft_trans_flowtable(trans)); 8621 break; 8622 } 8623 8624 if (trans->put_net) 8625 put_net(trans->ctx.net); 8626 8627 kfree(trans); 8628 } 8629 8630 static void nf_tables_trans_destroy_work(struct work_struct *w) 8631 { 8632 struct nft_trans *trans, *next; 8633 LIST_HEAD(head); 8634 8635 spin_lock(&nf_tables_destroy_list_lock); 8636 list_splice_init(&nf_tables_destroy_list, &head); 8637 spin_unlock(&nf_tables_destroy_list_lock); 8638 8639 if (list_empty(&head)) 8640 return; 8641 8642 synchronize_rcu(); 8643 8644 list_for_each_entry_safe(trans, next, &head, list) { 8645 list_del(&trans->list); 8646 nft_commit_release(trans); 8647 } 8648 } 8649 8650 void nf_tables_trans_destroy_flush_work(void) 8651 { 8652 flush_work(&trans_destroy_work); 8653 } 8654 EXPORT_SYMBOL_GPL(nf_tables_trans_destroy_flush_work); 8655 8656 static bool nft_expr_reduce(struct nft_regs_track *track, 8657 const struct nft_expr *expr) 8658 { 8659 return false; 8660 } 8661 8662 static int nf_tables_commit_chain_prepare(struct net *net, struct nft_chain *chain) 8663 { 8664 const struct nft_expr *expr, *last; 8665 struct nft_regs_track track = {}; 8666 unsigned int size, data_size; 8667 void *data, *data_boundary; 8668 struct nft_rule_dp *prule; 8669 struct nft_rule *rule; 8670 8671 /* already handled or inactive chain? */ 8672 if (chain->blob_next || !nft_is_active_next(net, chain)) 8673 return 0; 8674 8675 data_size = 0; 8676 list_for_each_entry(rule, &chain->rules, list) { 8677 if (nft_is_active_next(net, rule)) { 8678 data_size += sizeof(*prule) + rule->dlen; 8679 if (data_size > INT_MAX) 8680 return -ENOMEM; 8681 } 8682 } 8683 data_size += offsetof(struct nft_rule_dp, data); /* last rule */ 8684 8685 chain->blob_next = nf_tables_chain_alloc_rules(data_size); 8686 if (!chain->blob_next) 8687 return -ENOMEM; 8688 8689 data = (void *)chain->blob_next->data; 8690 data_boundary = data + data_size; 8691 size = 0; 8692 8693 list_for_each_entry(rule, &chain->rules, list) { 8694 if (!nft_is_active_next(net, rule)) 8695 continue; 8696 8697 prule = (struct nft_rule_dp *)data; 8698 data += offsetof(struct nft_rule_dp, data); 8699 if (WARN_ON_ONCE(data > data_boundary)) 8700 return -ENOMEM; 8701 8702 size = 0; 8703 track.last = nft_expr_last(rule); 8704 nft_rule_for_each_expr(expr, last, rule) { 8705 track.cur = expr; 8706 8707 if (nft_expr_reduce(&track, expr)) { 8708 expr = track.cur; 8709 continue; 8710 } 8711 8712 if (WARN_ON_ONCE(data + expr->ops->size > data_boundary)) 8713 return -ENOMEM; 8714 8715 memcpy(data + size, expr, expr->ops->size); 8716 size += expr->ops->size; 8717 } 8718 if (WARN_ON_ONCE(size >= 1 << 12)) 8719 return -ENOMEM; 8720 8721 prule->handle = rule->handle; 8722 prule->dlen = size; 8723 prule->is_last = 0; 8724 8725 data += size; 8726 size = 0; 8727 chain->blob_next->size += (unsigned long)(data - (void *)prule); 8728 } 8729 8730 prule = (struct nft_rule_dp *)data; 8731 data += offsetof(struct nft_rule_dp, data); 8732 if (WARN_ON_ONCE(data > data_boundary)) 8733 return -ENOMEM; 8734 8735 nft_last_rule(chain->blob_next, prule); 8736 8737 return 0; 8738 } 8739 8740 static void nf_tables_commit_chain_prepare_cancel(struct net *net) 8741 { 8742 struct nftables_pernet *nft_net = nft_pernet(net); 8743 struct nft_trans *trans, *next; 8744 8745 list_for_each_entry_safe(trans, next, &nft_net->commit_list, list) { 8746 struct nft_chain *chain = trans->ctx.chain; 8747 8748 if (trans->msg_type == NFT_MSG_NEWRULE || 8749 trans->msg_type == NFT_MSG_DELRULE) { 8750 kvfree(chain->blob_next); 8751 chain->blob_next = NULL; 8752 } 8753 } 8754 } 8755 8756 static void __nf_tables_commit_chain_free_rules_old(struct rcu_head *h) 8757 { 8758 struct nft_rules_old *o = container_of(h, struct nft_rules_old, h); 8759 8760 kvfree(o->blob); 8761 } 8762 8763 static void nf_tables_commit_chain_free_rules_old(struct nft_rule_blob *blob) 8764 { 8765 struct nft_rules_old *old; 8766 8767 /* rcu_head is after end marker */ 8768 old = (void *)blob + sizeof(*blob) + blob->size; 8769 old->blob = blob; 8770 8771 call_rcu(&old->h, __nf_tables_commit_chain_free_rules_old); 8772 } 8773 8774 static void nf_tables_commit_chain(struct net *net, struct nft_chain *chain) 8775 { 8776 struct nft_rule_blob *g0, *g1; 8777 bool next_genbit; 8778 8779 next_genbit = nft_gencursor_next(net); 8780 8781 g0 = rcu_dereference_protected(chain->blob_gen_0, 8782 lockdep_commit_lock_is_held(net)); 8783 g1 = rcu_dereference_protected(chain->blob_gen_1, 8784 lockdep_commit_lock_is_held(net)); 8785 8786 /* No changes to this chain? */ 8787 if (chain->blob_next == NULL) { 8788 /* chain had no change in last or next generation */ 8789 if (g0 == g1) 8790 return; 8791 /* 8792 * chain had no change in this generation; make sure next 8793 * one uses same rules as current generation. 8794 */ 8795 if (next_genbit) { 8796 rcu_assign_pointer(chain->blob_gen_1, g0); 8797 nf_tables_commit_chain_free_rules_old(g1); 8798 } else { 8799 rcu_assign_pointer(chain->blob_gen_0, g1); 8800 nf_tables_commit_chain_free_rules_old(g0); 8801 } 8802 8803 return; 8804 } 8805 8806 if (next_genbit) 8807 rcu_assign_pointer(chain->blob_gen_1, chain->blob_next); 8808 else 8809 rcu_assign_pointer(chain->blob_gen_0, chain->blob_next); 8810 8811 chain->blob_next = NULL; 8812 8813 if (g0 == g1) 8814 return; 8815 8816 if (next_genbit) 8817 nf_tables_commit_chain_free_rules_old(g1); 8818 else 8819 nf_tables_commit_chain_free_rules_old(g0); 8820 } 8821 8822 static void nft_obj_del(struct nft_object *obj) 8823 { 8824 rhltable_remove(&nft_objname_ht, &obj->rhlhead, nft_objname_ht_params); 8825 list_del_rcu(&obj->list); 8826 } 8827 8828 void nft_chain_del(struct nft_chain *chain) 8829 { 8830 struct nft_table *table = chain->table; 8831 8832 WARN_ON_ONCE(rhltable_remove(&table->chains_ht, &chain->rhlhead, 8833 nft_chain_ht_params)); 8834 list_del_rcu(&chain->list); 8835 } 8836 8837 static void nf_tables_module_autoload_cleanup(struct net *net) 8838 { 8839 struct nftables_pernet *nft_net = nft_pernet(net); 8840 struct nft_module_request *req, *next; 8841 8842 WARN_ON_ONCE(!list_empty(&nft_net->commit_list)); 8843 list_for_each_entry_safe(req, next, &nft_net->module_list, list) { 8844 WARN_ON_ONCE(!req->done); 8845 list_del(&req->list); 8846 kfree(req); 8847 } 8848 } 8849 8850 static void nf_tables_commit_release(struct net *net) 8851 { 8852 struct nftables_pernet *nft_net = nft_pernet(net); 8853 struct nft_trans *trans; 8854 8855 /* all side effects have to be made visible. 8856 * For example, if a chain named 'foo' has been deleted, a 8857 * new transaction must not find it anymore. 8858 * 8859 * Memory reclaim happens asynchronously from work queue 8860 * to prevent expensive synchronize_rcu() in commit phase. 8861 */ 8862 if (list_empty(&nft_net->commit_list)) { 8863 nf_tables_module_autoload_cleanup(net); 8864 mutex_unlock(&nft_net->commit_mutex); 8865 return; 8866 } 8867 8868 trans = list_last_entry(&nft_net->commit_list, 8869 struct nft_trans, list); 8870 get_net(trans->ctx.net); 8871 WARN_ON_ONCE(trans->put_net); 8872 8873 trans->put_net = true; 8874 spin_lock(&nf_tables_destroy_list_lock); 8875 list_splice_tail_init(&nft_net->commit_list, &nf_tables_destroy_list); 8876 spin_unlock(&nf_tables_destroy_list_lock); 8877 8878 nf_tables_module_autoload_cleanup(net); 8879 schedule_work(&trans_destroy_work); 8880 8881 mutex_unlock(&nft_net->commit_mutex); 8882 } 8883 8884 static void nft_commit_notify(struct net *net, u32 portid) 8885 { 8886 struct nftables_pernet *nft_net = nft_pernet(net); 8887 struct sk_buff *batch_skb = NULL, *nskb, *skb; 8888 unsigned char *data; 8889 int len; 8890 8891 list_for_each_entry_safe(skb, nskb, &nft_net->notify_list, list) { 8892 if (!batch_skb) { 8893 new_batch: 8894 batch_skb = skb; 8895 len = NLMSG_GOODSIZE - skb->len; 8896 list_del(&skb->list); 8897 continue; 8898 } 8899 len -= skb->len; 8900 if (len > 0 && NFT_CB(skb).report == NFT_CB(batch_skb).report) { 8901 data = skb_put(batch_skb, skb->len); 8902 memcpy(data, skb->data, skb->len); 8903 list_del(&skb->list); 8904 kfree_skb(skb); 8905 continue; 8906 } 8907 nfnetlink_send(batch_skb, net, portid, NFNLGRP_NFTABLES, 8908 NFT_CB(batch_skb).report, GFP_KERNEL); 8909 goto new_batch; 8910 } 8911 8912 if (batch_skb) { 8913 nfnetlink_send(batch_skb, net, portid, NFNLGRP_NFTABLES, 8914 NFT_CB(batch_skb).report, GFP_KERNEL); 8915 } 8916 8917 WARN_ON_ONCE(!list_empty(&nft_net->notify_list)); 8918 } 8919 8920 static int nf_tables_commit_audit_alloc(struct list_head *adl, 8921 struct nft_table *table) 8922 { 8923 struct nft_audit_data *adp; 8924 8925 list_for_each_entry(adp, adl, list) { 8926 if (adp->table == table) 8927 return 0; 8928 } 8929 adp = kzalloc(sizeof(*adp), GFP_KERNEL); 8930 if (!adp) 8931 return -ENOMEM; 8932 adp->table = table; 8933 list_add(&adp->list, adl); 8934 return 0; 8935 } 8936 8937 static void nf_tables_commit_audit_free(struct list_head *adl) 8938 { 8939 struct nft_audit_data *adp, *adn; 8940 8941 list_for_each_entry_safe(adp, adn, adl, list) { 8942 list_del(&adp->list); 8943 kfree(adp); 8944 } 8945 } 8946 8947 static void nf_tables_commit_audit_collect(struct list_head *adl, 8948 struct nft_table *table, u32 op) 8949 { 8950 struct nft_audit_data *adp; 8951 8952 list_for_each_entry(adp, adl, list) { 8953 if (adp->table == table) 8954 goto found; 8955 } 8956 WARN_ONCE(1, "table=%s not expected in commit list", table->name); 8957 return; 8958 found: 8959 adp->entries++; 8960 if (!adp->op || adp->op > op) 8961 adp->op = op; 8962 } 8963 8964 #define AUNFTABLENAMELEN (NFT_TABLE_MAXNAMELEN + 22) 8965 8966 static void nf_tables_commit_audit_log(struct list_head *adl, u32 generation) 8967 { 8968 struct nft_audit_data *adp, *adn; 8969 char aubuf[AUNFTABLENAMELEN]; 8970 8971 list_for_each_entry_safe(adp, adn, adl, list) { 8972 snprintf(aubuf, AUNFTABLENAMELEN, "%s:%u", adp->table->name, 8973 generation); 8974 audit_log_nfcfg(aubuf, adp->table->family, adp->entries, 8975 nft2audit_op[adp->op], GFP_KERNEL); 8976 list_del(&adp->list); 8977 kfree(adp); 8978 } 8979 } 8980 8981 static int nf_tables_commit(struct net *net, struct sk_buff *skb) 8982 { 8983 struct nftables_pernet *nft_net = nft_pernet(net); 8984 struct nft_trans *trans, *next; 8985 struct nft_trans_elem *te; 8986 struct nft_chain *chain; 8987 struct nft_table *table; 8988 unsigned int base_seq; 8989 LIST_HEAD(adl); 8990 int err; 8991 8992 if (list_empty(&nft_net->commit_list)) { 8993 mutex_unlock(&nft_net->commit_mutex); 8994 return 0; 8995 } 8996 8997 /* 0. Validate ruleset, otherwise roll back for error reporting. */ 8998 if (nf_tables_validate(net) < 0) 8999 return -EAGAIN; 9000 9001 err = nft_flow_rule_offload_commit(net); 9002 if (err < 0) 9003 return err; 9004 9005 /* 1. Allocate space for next generation rules_gen_X[] */ 9006 list_for_each_entry_safe(trans, next, &nft_net->commit_list, list) { 9007 int ret; 9008 9009 ret = nf_tables_commit_audit_alloc(&adl, trans->ctx.table); 9010 if (ret) { 9011 nf_tables_commit_chain_prepare_cancel(net); 9012 nf_tables_commit_audit_free(&adl); 9013 return ret; 9014 } 9015 if (trans->msg_type == NFT_MSG_NEWRULE || 9016 trans->msg_type == NFT_MSG_DELRULE) { 9017 chain = trans->ctx.chain; 9018 9019 ret = nf_tables_commit_chain_prepare(net, chain); 9020 if (ret < 0) { 9021 nf_tables_commit_chain_prepare_cancel(net); 9022 nf_tables_commit_audit_free(&adl); 9023 return ret; 9024 } 9025 } 9026 } 9027 9028 /* step 2. Make rules_gen_X visible to packet path */ 9029 list_for_each_entry(table, &nft_net->tables, list) { 9030 list_for_each_entry(chain, &table->chains, list) 9031 nf_tables_commit_chain(net, chain); 9032 } 9033 9034 /* 9035 * Bump generation counter, invalidate any dump in progress. 9036 * Cannot fail after this point. 9037 */ 9038 base_seq = READ_ONCE(nft_net->base_seq); 9039 while (++base_seq == 0) 9040 ; 9041 9042 WRITE_ONCE(nft_net->base_seq, base_seq); 9043 9044 /* step 3. Start new generation, rules_gen_X now in use. */ 9045 net->nft.gencursor = nft_gencursor_next(net); 9046 9047 list_for_each_entry_safe(trans, next, &nft_net->commit_list, list) { 9048 nf_tables_commit_audit_collect(&adl, trans->ctx.table, 9049 trans->msg_type); 9050 switch (trans->msg_type) { 9051 case NFT_MSG_NEWTABLE: 9052 if (nft_trans_table_update(trans)) { 9053 if (!(trans->ctx.table->flags & __NFT_TABLE_F_UPDATE)) { 9054 nft_trans_destroy(trans); 9055 break; 9056 } 9057 if (trans->ctx.table->flags & NFT_TABLE_F_DORMANT) 9058 nf_tables_table_disable(net, trans->ctx.table); 9059 9060 trans->ctx.table->flags &= ~__NFT_TABLE_F_UPDATE; 9061 } else { 9062 nft_clear(net, trans->ctx.table); 9063 } 9064 nf_tables_table_notify(&trans->ctx, NFT_MSG_NEWTABLE); 9065 nft_trans_destroy(trans); 9066 break; 9067 case NFT_MSG_DELTABLE: 9068 list_del_rcu(&trans->ctx.table->list); 9069 nf_tables_table_notify(&trans->ctx, NFT_MSG_DELTABLE); 9070 break; 9071 case NFT_MSG_NEWCHAIN: 9072 if (nft_trans_chain_update(trans)) { 9073 nft_chain_commit_update(trans); 9074 nf_tables_chain_notify(&trans->ctx, NFT_MSG_NEWCHAIN); 9075 /* trans destroyed after rcu grace period */ 9076 } else { 9077 nft_chain_commit_drop_policy(trans); 9078 nft_clear(net, trans->ctx.chain); 9079 nf_tables_chain_notify(&trans->ctx, NFT_MSG_NEWCHAIN); 9080 nft_trans_destroy(trans); 9081 } 9082 break; 9083 case NFT_MSG_DELCHAIN: 9084 nft_chain_del(trans->ctx.chain); 9085 nf_tables_chain_notify(&trans->ctx, NFT_MSG_DELCHAIN); 9086 nf_tables_unregister_hook(trans->ctx.net, 9087 trans->ctx.table, 9088 trans->ctx.chain); 9089 break; 9090 case NFT_MSG_NEWRULE: 9091 nft_clear(trans->ctx.net, nft_trans_rule(trans)); 9092 nf_tables_rule_notify(&trans->ctx, 9093 nft_trans_rule(trans), 9094 NFT_MSG_NEWRULE); 9095 if (trans->ctx.chain->flags & NFT_CHAIN_HW_OFFLOAD) 9096 nft_flow_rule_destroy(nft_trans_flow_rule(trans)); 9097 9098 nft_trans_destroy(trans); 9099 break; 9100 case NFT_MSG_DELRULE: 9101 list_del_rcu(&nft_trans_rule(trans)->list); 9102 nf_tables_rule_notify(&trans->ctx, 9103 nft_trans_rule(trans), 9104 NFT_MSG_DELRULE); 9105 nft_rule_expr_deactivate(&trans->ctx, 9106 nft_trans_rule(trans), 9107 NFT_TRANS_COMMIT); 9108 9109 if (trans->ctx.chain->flags & NFT_CHAIN_HW_OFFLOAD) 9110 nft_flow_rule_destroy(nft_trans_flow_rule(trans)); 9111 break; 9112 case NFT_MSG_NEWSET: 9113 if (nft_trans_set_update(trans)) { 9114 struct nft_set *set = nft_trans_set(trans); 9115 9116 WRITE_ONCE(set->timeout, nft_trans_set_timeout(trans)); 9117 WRITE_ONCE(set->gc_int, nft_trans_set_gc_int(trans)); 9118 } else { 9119 nft_clear(net, nft_trans_set(trans)); 9120 /* This avoids hitting -EBUSY when deleting the table 9121 * from the transaction. 9122 */ 9123 if (nft_set_is_anonymous(nft_trans_set(trans)) && 9124 !list_empty(&nft_trans_set(trans)->bindings)) 9125 trans->ctx.table->use--; 9126 } 9127 nf_tables_set_notify(&trans->ctx, nft_trans_set(trans), 9128 NFT_MSG_NEWSET, GFP_KERNEL); 9129 nft_trans_destroy(trans); 9130 break; 9131 case NFT_MSG_DELSET: 9132 list_del_rcu(&nft_trans_set(trans)->list); 9133 nf_tables_set_notify(&trans->ctx, nft_trans_set(trans), 9134 NFT_MSG_DELSET, GFP_KERNEL); 9135 break; 9136 case NFT_MSG_NEWSETELEM: 9137 te = (struct nft_trans_elem *)trans->data; 9138 9139 nft_setelem_activate(net, te->set, &te->elem); 9140 nf_tables_setelem_notify(&trans->ctx, te->set, 9141 &te->elem, 9142 NFT_MSG_NEWSETELEM); 9143 nft_trans_destroy(trans); 9144 break; 9145 case NFT_MSG_DELSETELEM: 9146 te = (struct nft_trans_elem *)trans->data; 9147 9148 nf_tables_setelem_notify(&trans->ctx, te->set, 9149 &te->elem, 9150 NFT_MSG_DELSETELEM); 9151 nft_setelem_remove(net, te->set, &te->elem); 9152 if (!nft_setelem_is_catchall(te->set, &te->elem)) { 9153 atomic_dec(&te->set->nelems); 9154 te->set->ndeact--; 9155 } 9156 break; 9157 case NFT_MSG_NEWOBJ: 9158 if (nft_trans_obj_update(trans)) { 9159 nft_obj_commit_update(trans); 9160 nf_tables_obj_notify(&trans->ctx, 9161 nft_trans_obj(trans), 9162 NFT_MSG_NEWOBJ); 9163 } else { 9164 nft_clear(net, nft_trans_obj(trans)); 9165 nf_tables_obj_notify(&trans->ctx, 9166 nft_trans_obj(trans), 9167 NFT_MSG_NEWOBJ); 9168 nft_trans_destroy(trans); 9169 } 9170 break; 9171 case NFT_MSG_DELOBJ: 9172 nft_obj_del(nft_trans_obj(trans)); 9173 nf_tables_obj_notify(&trans->ctx, nft_trans_obj(trans), 9174 NFT_MSG_DELOBJ); 9175 break; 9176 case NFT_MSG_NEWFLOWTABLE: 9177 if (nft_trans_flowtable_update(trans)) { 9178 nft_trans_flowtable(trans)->data.flags = 9179 nft_trans_flowtable_flags(trans); 9180 nf_tables_flowtable_notify(&trans->ctx, 9181 nft_trans_flowtable(trans), 9182 &nft_trans_flowtable_hooks(trans), 9183 NFT_MSG_NEWFLOWTABLE); 9184 list_splice(&nft_trans_flowtable_hooks(trans), 9185 &nft_trans_flowtable(trans)->hook_list); 9186 } else { 9187 nft_clear(net, nft_trans_flowtable(trans)); 9188 nf_tables_flowtable_notify(&trans->ctx, 9189 nft_trans_flowtable(trans), 9190 &nft_trans_flowtable(trans)->hook_list, 9191 NFT_MSG_NEWFLOWTABLE); 9192 } 9193 nft_trans_destroy(trans); 9194 break; 9195 case NFT_MSG_DELFLOWTABLE: 9196 if (nft_trans_flowtable_update(trans)) { 9197 nf_tables_flowtable_notify(&trans->ctx, 9198 nft_trans_flowtable(trans), 9199 &nft_trans_flowtable_hooks(trans), 9200 NFT_MSG_DELFLOWTABLE); 9201 nft_unregister_flowtable_net_hooks(net, 9202 &nft_trans_flowtable_hooks(trans)); 9203 } else { 9204 list_del_rcu(&nft_trans_flowtable(trans)->list); 9205 nf_tables_flowtable_notify(&trans->ctx, 9206 nft_trans_flowtable(trans), 9207 &nft_trans_flowtable(trans)->hook_list, 9208 NFT_MSG_DELFLOWTABLE); 9209 nft_unregister_flowtable_net_hooks(net, 9210 &nft_trans_flowtable(trans)->hook_list); 9211 } 9212 break; 9213 } 9214 } 9215 9216 nft_commit_notify(net, NETLINK_CB(skb).portid); 9217 nf_tables_gen_notify(net, skb, NFT_MSG_NEWGEN); 9218 nf_tables_commit_audit_log(&adl, nft_net->base_seq); 9219 nf_tables_commit_release(net); 9220 9221 return 0; 9222 } 9223 9224 static void nf_tables_module_autoload(struct net *net) 9225 { 9226 struct nftables_pernet *nft_net = nft_pernet(net); 9227 struct nft_module_request *req, *next; 9228 LIST_HEAD(module_list); 9229 9230 list_splice_init(&nft_net->module_list, &module_list); 9231 mutex_unlock(&nft_net->commit_mutex); 9232 list_for_each_entry_safe(req, next, &module_list, list) { 9233 request_module("%s", req->module); 9234 req->done = true; 9235 } 9236 mutex_lock(&nft_net->commit_mutex); 9237 list_splice(&module_list, &nft_net->module_list); 9238 } 9239 9240 static void nf_tables_abort_release(struct nft_trans *trans) 9241 { 9242 switch (trans->msg_type) { 9243 case NFT_MSG_NEWTABLE: 9244 nf_tables_table_destroy(&trans->ctx); 9245 break; 9246 case NFT_MSG_NEWCHAIN: 9247 nf_tables_chain_destroy(&trans->ctx); 9248 break; 9249 case NFT_MSG_NEWRULE: 9250 nf_tables_rule_destroy(&trans->ctx, nft_trans_rule(trans)); 9251 break; 9252 case NFT_MSG_NEWSET: 9253 nft_set_destroy(&trans->ctx, nft_trans_set(trans)); 9254 break; 9255 case NFT_MSG_NEWSETELEM: 9256 nft_set_elem_destroy(nft_trans_elem_set(trans), 9257 nft_trans_elem(trans).priv, true); 9258 break; 9259 case NFT_MSG_NEWOBJ: 9260 nft_obj_destroy(&trans->ctx, nft_trans_obj(trans)); 9261 break; 9262 case NFT_MSG_NEWFLOWTABLE: 9263 if (nft_trans_flowtable_update(trans)) 9264 nft_flowtable_hooks_destroy(&nft_trans_flowtable_hooks(trans)); 9265 else 9266 nf_tables_flowtable_destroy(nft_trans_flowtable(trans)); 9267 break; 9268 } 9269 kfree(trans); 9270 } 9271 9272 static int __nf_tables_abort(struct net *net, enum nfnl_abort_action action) 9273 { 9274 struct nftables_pernet *nft_net = nft_pernet(net); 9275 struct nft_trans *trans, *next; 9276 struct nft_trans_elem *te; 9277 9278 if (action == NFNL_ABORT_VALIDATE && 9279 nf_tables_validate(net) < 0) 9280 return -EAGAIN; 9281 9282 list_for_each_entry_safe_reverse(trans, next, &nft_net->commit_list, 9283 list) { 9284 switch (trans->msg_type) { 9285 case NFT_MSG_NEWTABLE: 9286 if (nft_trans_table_update(trans)) { 9287 if (!(trans->ctx.table->flags & __NFT_TABLE_F_UPDATE)) { 9288 nft_trans_destroy(trans); 9289 break; 9290 } 9291 if (trans->ctx.table->flags & __NFT_TABLE_F_WAS_DORMANT) { 9292 nf_tables_table_disable(net, trans->ctx.table); 9293 trans->ctx.table->flags |= NFT_TABLE_F_DORMANT; 9294 } else if (trans->ctx.table->flags & __NFT_TABLE_F_WAS_AWAKEN) { 9295 trans->ctx.table->flags &= ~NFT_TABLE_F_DORMANT; 9296 } 9297 trans->ctx.table->flags &= ~__NFT_TABLE_F_UPDATE; 9298 nft_trans_destroy(trans); 9299 } else { 9300 list_del_rcu(&trans->ctx.table->list); 9301 } 9302 break; 9303 case NFT_MSG_DELTABLE: 9304 nft_clear(trans->ctx.net, trans->ctx.table); 9305 nft_trans_destroy(trans); 9306 break; 9307 case NFT_MSG_NEWCHAIN: 9308 if (nft_trans_chain_update(trans)) { 9309 free_percpu(nft_trans_chain_stats(trans)); 9310 kfree(nft_trans_chain_name(trans)); 9311 nft_trans_destroy(trans); 9312 } else { 9313 if (nft_chain_is_bound(trans->ctx.chain)) { 9314 nft_trans_destroy(trans); 9315 break; 9316 } 9317 trans->ctx.table->use--; 9318 nft_chain_del(trans->ctx.chain); 9319 nf_tables_unregister_hook(trans->ctx.net, 9320 trans->ctx.table, 9321 trans->ctx.chain); 9322 } 9323 break; 9324 case NFT_MSG_DELCHAIN: 9325 trans->ctx.table->use++; 9326 nft_clear(trans->ctx.net, trans->ctx.chain); 9327 nft_trans_destroy(trans); 9328 break; 9329 case NFT_MSG_NEWRULE: 9330 trans->ctx.chain->use--; 9331 list_del_rcu(&nft_trans_rule(trans)->list); 9332 nft_rule_expr_deactivate(&trans->ctx, 9333 nft_trans_rule(trans), 9334 NFT_TRANS_ABORT); 9335 if (trans->ctx.chain->flags & NFT_CHAIN_HW_OFFLOAD) 9336 nft_flow_rule_destroy(nft_trans_flow_rule(trans)); 9337 break; 9338 case NFT_MSG_DELRULE: 9339 trans->ctx.chain->use++; 9340 nft_clear(trans->ctx.net, nft_trans_rule(trans)); 9341 nft_rule_expr_activate(&trans->ctx, nft_trans_rule(trans)); 9342 if (trans->ctx.chain->flags & NFT_CHAIN_HW_OFFLOAD) 9343 nft_flow_rule_destroy(nft_trans_flow_rule(trans)); 9344 9345 nft_trans_destroy(trans); 9346 break; 9347 case NFT_MSG_NEWSET: 9348 if (nft_trans_set_update(trans)) { 9349 nft_trans_destroy(trans); 9350 break; 9351 } 9352 trans->ctx.table->use--; 9353 if (nft_trans_set_bound(trans)) { 9354 nft_trans_destroy(trans); 9355 break; 9356 } 9357 list_del_rcu(&nft_trans_set(trans)->list); 9358 break; 9359 case NFT_MSG_DELSET: 9360 trans->ctx.table->use++; 9361 nft_clear(trans->ctx.net, nft_trans_set(trans)); 9362 nft_trans_destroy(trans); 9363 break; 9364 case NFT_MSG_NEWSETELEM: 9365 if (nft_trans_elem_set_bound(trans)) { 9366 nft_trans_destroy(trans); 9367 break; 9368 } 9369 te = (struct nft_trans_elem *)trans->data; 9370 nft_setelem_remove(net, te->set, &te->elem); 9371 if (!nft_setelem_is_catchall(te->set, &te->elem)) 9372 atomic_dec(&te->set->nelems); 9373 break; 9374 case NFT_MSG_DELSETELEM: 9375 te = (struct nft_trans_elem *)trans->data; 9376 9377 nft_setelem_data_activate(net, te->set, &te->elem); 9378 nft_setelem_activate(net, te->set, &te->elem); 9379 if (!nft_setelem_is_catchall(te->set, &te->elem)) 9380 te->set->ndeact--; 9381 9382 nft_trans_destroy(trans); 9383 break; 9384 case NFT_MSG_NEWOBJ: 9385 if (nft_trans_obj_update(trans)) { 9386 nft_obj_destroy(&trans->ctx, nft_trans_obj_newobj(trans)); 9387 nft_trans_destroy(trans); 9388 } else { 9389 trans->ctx.table->use--; 9390 nft_obj_del(nft_trans_obj(trans)); 9391 } 9392 break; 9393 case NFT_MSG_DELOBJ: 9394 trans->ctx.table->use++; 9395 nft_clear(trans->ctx.net, nft_trans_obj(trans)); 9396 nft_trans_destroy(trans); 9397 break; 9398 case NFT_MSG_NEWFLOWTABLE: 9399 if (nft_trans_flowtable_update(trans)) { 9400 nft_unregister_flowtable_net_hooks(net, 9401 &nft_trans_flowtable_hooks(trans)); 9402 } else { 9403 trans->ctx.table->use--; 9404 list_del_rcu(&nft_trans_flowtable(trans)->list); 9405 nft_unregister_flowtable_net_hooks(net, 9406 &nft_trans_flowtable(trans)->hook_list); 9407 } 9408 break; 9409 case NFT_MSG_DELFLOWTABLE: 9410 if (nft_trans_flowtable_update(trans)) { 9411 list_splice(&nft_trans_flowtable_hooks(trans), 9412 &nft_trans_flowtable(trans)->hook_list); 9413 } else { 9414 trans->ctx.table->use++; 9415 nft_clear(trans->ctx.net, nft_trans_flowtable(trans)); 9416 } 9417 nft_trans_destroy(trans); 9418 break; 9419 } 9420 } 9421 9422 synchronize_rcu(); 9423 9424 list_for_each_entry_safe_reverse(trans, next, 9425 &nft_net->commit_list, list) { 9426 list_del(&trans->list); 9427 nf_tables_abort_release(trans); 9428 } 9429 9430 if (action == NFNL_ABORT_AUTOLOAD) 9431 nf_tables_module_autoload(net); 9432 else 9433 nf_tables_module_autoload_cleanup(net); 9434 9435 return 0; 9436 } 9437 9438 static void nf_tables_cleanup(struct net *net) 9439 { 9440 nft_validate_state_update(net, NFT_VALIDATE_SKIP); 9441 } 9442 9443 static int nf_tables_abort(struct net *net, struct sk_buff *skb, 9444 enum nfnl_abort_action action) 9445 { 9446 struct nftables_pernet *nft_net = nft_pernet(net); 9447 int ret = __nf_tables_abort(net, action); 9448 9449 mutex_unlock(&nft_net->commit_mutex); 9450 9451 return ret; 9452 } 9453 9454 static bool nf_tables_valid_genid(struct net *net, u32 genid) 9455 { 9456 struct nftables_pernet *nft_net = nft_pernet(net); 9457 bool genid_ok; 9458 9459 mutex_lock(&nft_net->commit_mutex); 9460 9461 genid_ok = genid == 0 || nft_net->base_seq == genid; 9462 if (!genid_ok) 9463 mutex_unlock(&nft_net->commit_mutex); 9464 9465 /* else, commit mutex has to be released by commit or abort function */ 9466 return genid_ok; 9467 } 9468 9469 static const struct nfnetlink_subsystem nf_tables_subsys = { 9470 .name = "nf_tables", 9471 .subsys_id = NFNL_SUBSYS_NFTABLES, 9472 .cb_count = NFT_MSG_MAX, 9473 .cb = nf_tables_cb, 9474 .commit = nf_tables_commit, 9475 .abort = nf_tables_abort, 9476 .cleanup = nf_tables_cleanup, 9477 .valid_genid = nf_tables_valid_genid, 9478 .owner = THIS_MODULE, 9479 }; 9480 9481 int nft_chain_validate_dependency(const struct nft_chain *chain, 9482 enum nft_chain_types type) 9483 { 9484 const struct nft_base_chain *basechain; 9485 9486 if (nft_is_base_chain(chain)) { 9487 basechain = nft_base_chain(chain); 9488 if (basechain->type->type != type) 9489 return -EOPNOTSUPP; 9490 } 9491 return 0; 9492 } 9493 EXPORT_SYMBOL_GPL(nft_chain_validate_dependency); 9494 9495 int nft_chain_validate_hooks(const struct nft_chain *chain, 9496 unsigned int hook_flags) 9497 { 9498 struct nft_base_chain *basechain; 9499 9500 if (nft_is_base_chain(chain)) { 9501 basechain = nft_base_chain(chain); 9502 9503 if ((1 << basechain->ops.hooknum) & hook_flags) 9504 return 0; 9505 9506 return -EOPNOTSUPP; 9507 } 9508 9509 return 0; 9510 } 9511 EXPORT_SYMBOL_GPL(nft_chain_validate_hooks); 9512 9513 /* 9514 * Loop detection - walk through the ruleset beginning at the destination chain 9515 * of a new jump until either the source chain is reached (loop) or all 9516 * reachable chains have been traversed. 9517 * 9518 * The loop check is performed whenever a new jump verdict is added to an 9519 * expression or verdict map or a verdict map is bound to a new chain. 9520 */ 9521 9522 static int nf_tables_check_loops(const struct nft_ctx *ctx, 9523 const struct nft_chain *chain); 9524 9525 static int nft_check_loops(const struct nft_ctx *ctx, 9526 const struct nft_set_ext *ext) 9527 { 9528 const struct nft_data *data; 9529 int ret; 9530 9531 data = nft_set_ext_data(ext); 9532 switch (data->verdict.code) { 9533 case NFT_JUMP: 9534 case NFT_GOTO: 9535 ret = nf_tables_check_loops(ctx, data->verdict.chain); 9536 break; 9537 default: 9538 ret = 0; 9539 break; 9540 } 9541 9542 return ret; 9543 } 9544 9545 static int nf_tables_loop_check_setelem(const struct nft_ctx *ctx, 9546 struct nft_set *set, 9547 const struct nft_set_iter *iter, 9548 struct nft_set_elem *elem) 9549 { 9550 const struct nft_set_ext *ext = nft_set_elem_ext(set, elem->priv); 9551 9552 if (nft_set_ext_exists(ext, NFT_SET_EXT_FLAGS) && 9553 *nft_set_ext_flags(ext) & NFT_SET_ELEM_INTERVAL_END) 9554 return 0; 9555 9556 return nft_check_loops(ctx, ext); 9557 } 9558 9559 static int nft_set_catchall_loops(const struct nft_ctx *ctx, 9560 struct nft_set *set) 9561 { 9562 u8 genmask = nft_genmask_next(ctx->net); 9563 struct nft_set_elem_catchall *catchall; 9564 struct nft_set_ext *ext; 9565 int ret = 0; 9566 9567 list_for_each_entry_rcu(catchall, &set->catchall_list, list) { 9568 ext = nft_set_elem_ext(set, catchall->elem); 9569 if (!nft_set_elem_active(ext, genmask)) 9570 continue; 9571 9572 ret = nft_check_loops(ctx, ext); 9573 if (ret < 0) 9574 return ret; 9575 } 9576 9577 return ret; 9578 } 9579 9580 static int nf_tables_check_loops(const struct nft_ctx *ctx, 9581 const struct nft_chain *chain) 9582 { 9583 const struct nft_rule *rule; 9584 const struct nft_expr *expr, *last; 9585 struct nft_set *set; 9586 struct nft_set_binding *binding; 9587 struct nft_set_iter iter; 9588 9589 if (ctx->chain == chain) 9590 return -ELOOP; 9591 9592 list_for_each_entry(rule, &chain->rules, list) { 9593 nft_rule_for_each_expr(expr, last, rule) { 9594 struct nft_immediate_expr *priv; 9595 const struct nft_data *data; 9596 int err; 9597 9598 if (strcmp(expr->ops->type->name, "immediate")) 9599 continue; 9600 9601 priv = nft_expr_priv(expr); 9602 if (priv->dreg != NFT_REG_VERDICT) 9603 continue; 9604 9605 data = &priv->data; 9606 switch (data->verdict.code) { 9607 case NFT_JUMP: 9608 case NFT_GOTO: 9609 err = nf_tables_check_loops(ctx, 9610 data->verdict.chain); 9611 if (err < 0) 9612 return err; 9613 break; 9614 default: 9615 break; 9616 } 9617 } 9618 } 9619 9620 list_for_each_entry(set, &ctx->table->sets, list) { 9621 if (!nft_is_active_next(ctx->net, set)) 9622 continue; 9623 if (!(set->flags & NFT_SET_MAP) || 9624 set->dtype != NFT_DATA_VERDICT) 9625 continue; 9626 9627 list_for_each_entry(binding, &set->bindings, list) { 9628 if (!(binding->flags & NFT_SET_MAP) || 9629 binding->chain != chain) 9630 continue; 9631 9632 iter.genmask = nft_genmask_next(ctx->net); 9633 iter.skip = 0; 9634 iter.count = 0; 9635 iter.err = 0; 9636 iter.fn = nf_tables_loop_check_setelem; 9637 9638 set->ops->walk(ctx, set, &iter); 9639 if (!iter.err) 9640 iter.err = nft_set_catchall_loops(ctx, set); 9641 9642 if (iter.err < 0) 9643 return iter.err; 9644 } 9645 } 9646 9647 return 0; 9648 } 9649 9650 /** 9651 * nft_parse_u32_check - fetch u32 attribute and check for maximum value 9652 * 9653 * @attr: netlink attribute to fetch value from 9654 * @max: maximum value to be stored in dest 9655 * @dest: pointer to the variable 9656 * 9657 * Parse, check and store a given u32 netlink attribute into variable. 9658 * This function returns -ERANGE if the value goes over maximum value. 9659 * Otherwise a 0 is returned and the attribute value is stored in the 9660 * destination variable. 9661 */ 9662 int nft_parse_u32_check(const struct nlattr *attr, int max, u32 *dest) 9663 { 9664 u32 val; 9665 9666 val = ntohl(nla_get_be32(attr)); 9667 if (val > max) 9668 return -ERANGE; 9669 9670 *dest = val; 9671 return 0; 9672 } 9673 EXPORT_SYMBOL_GPL(nft_parse_u32_check); 9674 9675 static int nft_parse_register(const struct nlattr *attr, u32 *preg) 9676 { 9677 unsigned int reg; 9678 9679 reg = ntohl(nla_get_be32(attr)); 9680 switch (reg) { 9681 case NFT_REG_VERDICT...NFT_REG_4: 9682 *preg = reg * NFT_REG_SIZE / NFT_REG32_SIZE; 9683 break; 9684 case NFT_REG32_00...NFT_REG32_15: 9685 *preg = reg + NFT_REG_SIZE / NFT_REG32_SIZE - NFT_REG32_00; 9686 break; 9687 default: 9688 return -ERANGE; 9689 } 9690 9691 return 0; 9692 } 9693 9694 /** 9695 * nft_dump_register - dump a register value to a netlink attribute 9696 * 9697 * @skb: socket buffer 9698 * @attr: attribute number 9699 * @reg: register number 9700 * 9701 * Construct a netlink attribute containing the register number. For 9702 * compatibility reasons, register numbers being a multiple of 4 are 9703 * translated to the corresponding 128 bit register numbers. 9704 */ 9705 int nft_dump_register(struct sk_buff *skb, unsigned int attr, unsigned int reg) 9706 { 9707 if (reg % (NFT_REG_SIZE / NFT_REG32_SIZE) == 0) 9708 reg = reg / (NFT_REG_SIZE / NFT_REG32_SIZE); 9709 else 9710 reg = reg - NFT_REG_SIZE / NFT_REG32_SIZE + NFT_REG32_00; 9711 9712 return nla_put_be32(skb, attr, htonl(reg)); 9713 } 9714 EXPORT_SYMBOL_GPL(nft_dump_register); 9715 9716 static int nft_validate_register_load(enum nft_registers reg, unsigned int len) 9717 { 9718 if (reg < NFT_REG_1 * NFT_REG_SIZE / NFT_REG32_SIZE) 9719 return -EINVAL; 9720 if (len == 0) 9721 return -EINVAL; 9722 if (reg * NFT_REG32_SIZE + len > sizeof_field(struct nft_regs, data)) 9723 return -ERANGE; 9724 9725 return 0; 9726 } 9727 9728 int nft_parse_register_load(const struct nlattr *attr, u8 *sreg, u32 len) 9729 { 9730 u32 reg; 9731 int err; 9732 9733 err = nft_parse_register(attr, ®); 9734 if (err < 0) 9735 return err; 9736 9737 err = nft_validate_register_load(reg, len); 9738 if (err < 0) 9739 return err; 9740 9741 *sreg = reg; 9742 return 0; 9743 } 9744 EXPORT_SYMBOL_GPL(nft_parse_register_load); 9745 9746 static int nft_validate_register_store(const struct nft_ctx *ctx, 9747 enum nft_registers reg, 9748 const struct nft_data *data, 9749 enum nft_data_types type, 9750 unsigned int len) 9751 { 9752 int err; 9753 9754 switch (reg) { 9755 case NFT_REG_VERDICT: 9756 if (type != NFT_DATA_VERDICT) 9757 return -EINVAL; 9758 9759 if (data != NULL && 9760 (data->verdict.code == NFT_GOTO || 9761 data->verdict.code == NFT_JUMP)) { 9762 err = nf_tables_check_loops(ctx, data->verdict.chain); 9763 if (err < 0) 9764 return err; 9765 } 9766 9767 return 0; 9768 default: 9769 if (reg < NFT_REG_1 * NFT_REG_SIZE / NFT_REG32_SIZE) 9770 return -EINVAL; 9771 if (len == 0) 9772 return -EINVAL; 9773 if (reg * NFT_REG32_SIZE + len > 9774 sizeof_field(struct nft_regs, data)) 9775 return -ERANGE; 9776 9777 if (data != NULL && type != NFT_DATA_VALUE) 9778 return -EINVAL; 9779 return 0; 9780 } 9781 } 9782 9783 int nft_parse_register_store(const struct nft_ctx *ctx, 9784 const struct nlattr *attr, u8 *dreg, 9785 const struct nft_data *data, 9786 enum nft_data_types type, unsigned int len) 9787 { 9788 int err; 9789 u32 reg; 9790 9791 err = nft_parse_register(attr, ®); 9792 if (err < 0) 9793 return err; 9794 9795 err = nft_validate_register_store(ctx, reg, data, type, len); 9796 if (err < 0) 9797 return err; 9798 9799 *dreg = reg; 9800 return 0; 9801 } 9802 EXPORT_SYMBOL_GPL(nft_parse_register_store); 9803 9804 static const struct nla_policy nft_verdict_policy[NFTA_VERDICT_MAX + 1] = { 9805 [NFTA_VERDICT_CODE] = { .type = NLA_U32 }, 9806 [NFTA_VERDICT_CHAIN] = { .type = NLA_STRING, 9807 .len = NFT_CHAIN_MAXNAMELEN - 1 }, 9808 [NFTA_VERDICT_CHAIN_ID] = { .type = NLA_U32 }, 9809 }; 9810 9811 static int nft_verdict_init(const struct nft_ctx *ctx, struct nft_data *data, 9812 struct nft_data_desc *desc, const struct nlattr *nla) 9813 { 9814 u8 genmask = nft_genmask_next(ctx->net); 9815 struct nlattr *tb[NFTA_VERDICT_MAX + 1]; 9816 struct nft_chain *chain; 9817 int err; 9818 9819 err = nla_parse_nested_deprecated(tb, NFTA_VERDICT_MAX, nla, 9820 nft_verdict_policy, NULL); 9821 if (err < 0) 9822 return err; 9823 9824 if (!tb[NFTA_VERDICT_CODE]) 9825 return -EINVAL; 9826 data->verdict.code = ntohl(nla_get_be32(tb[NFTA_VERDICT_CODE])); 9827 9828 switch (data->verdict.code) { 9829 default: 9830 switch (data->verdict.code & NF_VERDICT_MASK) { 9831 case NF_ACCEPT: 9832 case NF_DROP: 9833 case NF_QUEUE: 9834 break; 9835 default: 9836 return -EINVAL; 9837 } 9838 fallthrough; 9839 case NFT_CONTINUE: 9840 case NFT_BREAK: 9841 case NFT_RETURN: 9842 break; 9843 case NFT_JUMP: 9844 case NFT_GOTO: 9845 if (tb[NFTA_VERDICT_CHAIN]) { 9846 chain = nft_chain_lookup(ctx->net, ctx->table, 9847 tb[NFTA_VERDICT_CHAIN], 9848 genmask); 9849 } else if (tb[NFTA_VERDICT_CHAIN_ID]) { 9850 chain = nft_chain_lookup_byid(ctx->net, ctx->table, 9851 tb[NFTA_VERDICT_CHAIN_ID]); 9852 if (IS_ERR(chain)) 9853 return PTR_ERR(chain); 9854 } else { 9855 return -EINVAL; 9856 } 9857 9858 if (IS_ERR(chain)) 9859 return PTR_ERR(chain); 9860 if (nft_is_base_chain(chain)) 9861 return -EOPNOTSUPP; 9862 if (nft_chain_is_bound(chain)) 9863 return -EINVAL; 9864 if (desc->flags & NFT_DATA_DESC_SETELEM && 9865 chain->flags & NFT_CHAIN_BINDING) 9866 return -EINVAL; 9867 9868 chain->use++; 9869 data->verdict.chain = chain; 9870 break; 9871 } 9872 9873 desc->len = sizeof(data->verdict); 9874 9875 return 0; 9876 } 9877 9878 static void nft_verdict_uninit(const struct nft_data *data) 9879 { 9880 struct nft_chain *chain; 9881 struct nft_rule *rule; 9882 9883 switch (data->verdict.code) { 9884 case NFT_JUMP: 9885 case NFT_GOTO: 9886 chain = data->verdict.chain; 9887 chain->use--; 9888 9889 if (!nft_chain_is_bound(chain)) 9890 break; 9891 9892 chain->table->use--; 9893 list_for_each_entry(rule, &chain->rules, list) 9894 chain->use--; 9895 9896 nft_chain_del(chain); 9897 break; 9898 } 9899 } 9900 9901 int nft_verdict_dump(struct sk_buff *skb, int type, const struct nft_verdict *v) 9902 { 9903 struct nlattr *nest; 9904 9905 nest = nla_nest_start_noflag(skb, type); 9906 if (!nest) 9907 goto nla_put_failure; 9908 9909 if (nla_put_be32(skb, NFTA_VERDICT_CODE, htonl(v->code))) 9910 goto nla_put_failure; 9911 9912 switch (v->code) { 9913 case NFT_JUMP: 9914 case NFT_GOTO: 9915 if (nla_put_string(skb, NFTA_VERDICT_CHAIN, 9916 v->chain->name)) 9917 goto nla_put_failure; 9918 } 9919 nla_nest_end(skb, nest); 9920 return 0; 9921 9922 nla_put_failure: 9923 return -1; 9924 } 9925 9926 static int nft_value_init(const struct nft_ctx *ctx, 9927 struct nft_data *data, struct nft_data_desc *desc, 9928 const struct nlattr *nla) 9929 { 9930 unsigned int len; 9931 9932 len = nla_len(nla); 9933 if (len == 0) 9934 return -EINVAL; 9935 if (len > desc->size) 9936 return -EOVERFLOW; 9937 if (desc->len) { 9938 if (len != desc->len) 9939 return -EINVAL; 9940 } else { 9941 desc->len = len; 9942 } 9943 9944 nla_memcpy(data->data, nla, len); 9945 9946 return 0; 9947 } 9948 9949 static int nft_value_dump(struct sk_buff *skb, const struct nft_data *data, 9950 unsigned int len) 9951 { 9952 return nla_put(skb, NFTA_DATA_VALUE, len, data->data); 9953 } 9954 9955 static const struct nla_policy nft_data_policy[NFTA_DATA_MAX + 1] = { 9956 [NFTA_DATA_VALUE] = { .type = NLA_BINARY }, 9957 [NFTA_DATA_VERDICT] = { .type = NLA_NESTED }, 9958 }; 9959 9960 /** 9961 * nft_data_init - parse nf_tables data netlink attributes 9962 * 9963 * @ctx: context of the expression using the data 9964 * @data: destination struct nft_data 9965 * @desc: data description 9966 * @nla: netlink attribute containing data 9967 * 9968 * Parse the netlink data attributes and initialize a struct nft_data. 9969 * The type and length of data are returned in the data description. 9970 * 9971 * The caller can indicate that it only wants to accept data of type 9972 * NFT_DATA_VALUE by passing NULL for the ctx argument. 9973 */ 9974 int nft_data_init(const struct nft_ctx *ctx, struct nft_data *data, 9975 struct nft_data_desc *desc, const struct nlattr *nla) 9976 { 9977 struct nlattr *tb[NFTA_DATA_MAX + 1]; 9978 int err; 9979 9980 if (WARN_ON_ONCE(!desc->size)) 9981 return -EINVAL; 9982 9983 err = nla_parse_nested_deprecated(tb, NFTA_DATA_MAX, nla, 9984 nft_data_policy, NULL); 9985 if (err < 0) 9986 return err; 9987 9988 if (tb[NFTA_DATA_VALUE]) { 9989 if (desc->type != NFT_DATA_VALUE) 9990 return -EINVAL; 9991 9992 err = nft_value_init(ctx, data, desc, tb[NFTA_DATA_VALUE]); 9993 } else if (tb[NFTA_DATA_VERDICT] && ctx != NULL) { 9994 if (desc->type != NFT_DATA_VERDICT) 9995 return -EINVAL; 9996 9997 err = nft_verdict_init(ctx, data, desc, tb[NFTA_DATA_VERDICT]); 9998 } else { 9999 err = -EINVAL; 10000 } 10001 10002 return err; 10003 } 10004 EXPORT_SYMBOL_GPL(nft_data_init); 10005 10006 /** 10007 * nft_data_release - release a nft_data item 10008 * 10009 * @data: struct nft_data to release 10010 * @type: type of data 10011 * 10012 * Release a nft_data item. NFT_DATA_VALUE types can be silently discarded, 10013 * all others need to be released by calling this function. 10014 */ 10015 void nft_data_release(const struct nft_data *data, enum nft_data_types type) 10016 { 10017 if (type < NFT_DATA_VERDICT) 10018 return; 10019 switch (type) { 10020 case NFT_DATA_VERDICT: 10021 return nft_verdict_uninit(data); 10022 default: 10023 WARN_ON(1); 10024 } 10025 } 10026 EXPORT_SYMBOL_GPL(nft_data_release); 10027 10028 int nft_data_dump(struct sk_buff *skb, int attr, const struct nft_data *data, 10029 enum nft_data_types type, unsigned int len) 10030 { 10031 struct nlattr *nest; 10032 int err; 10033 10034 nest = nla_nest_start_noflag(skb, attr); 10035 if (nest == NULL) 10036 return -1; 10037 10038 switch (type) { 10039 case NFT_DATA_VALUE: 10040 err = nft_value_dump(skb, data, len); 10041 break; 10042 case NFT_DATA_VERDICT: 10043 err = nft_verdict_dump(skb, NFTA_DATA_VERDICT, &data->verdict); 10044 break; 10045 default: 10046 err = -EINVAL; 10047 WARN_ON(1); 10048 } 10049 10050 nla_nest_end(skb, nest); 10051 return err; 10052 } 10053 EXPORT_SYMBOL_GPL(nft_data_dump); 10054 10055 int __nft_release_basechain(struct nft_ctx *ctx) 10056 { 10057 struct nft_rule *rule, *nr; 10058 10059 if (WARN_ON(!nft_is_base_chain(ctx->chain))) 10060 return 0; 10061 10062 nf_tables_unregister_hook(ctx->net, ctx->chain->table, ctx->chain); 10063 list_for_each_entry_safe(rule, nr, &ctx->chain->rules, list) { 10064 list_del(&rule->list); 10065 ctx->chain->use--; 10066 nf_tables_rule_release(ctx, rule); 10067 } 10068 nft_chain_del(ctx->chain); 10069 ctx->table->use--; 10070 nf_tables_chain_destroy(ctx); 10071 10072 return 0; 10073 } 10074 EXPORT_SYMBOL_GPL(__nft_release_basechain); 10075 10076 static void __nft_release_hook(struct net *net, struct nft_table *table) 10077 { 10078 struct nft_flowtable *flowtable; 10079 struct nft_chain *chain; 10080 10081 list_for_each_entry(chain, &table->chains, list) 10082 __nf_tables_unregister_hook(net, table, chain, true); 10083 list_for_each_entry(flowtable, &table->flowtables, list) 10084 __nft_unregister_flowtable_net_hooks(net, &flowtable->hook_list, 10085 true); 10086 } 10087 10088 static void __nft_release_hooks(struct net *net) 10089 { 10090 struct nftables_pernet *nft_net = nft_pernet(net); 10091 struct nft_table *table; 10092 10093 list_for_each_entry(table, &nft_net->tables, list) { 10094 if (nft_table_has_owner(table)) 10095 continue; 10096 10097 __nft_release_hook(net, table); 10098 } 10099 } 10100 10101 static void __nft_release_table(struct net *net, struct nft_table *table) 10102 { 10103 struct nft_flowtable *flowtable, *nf; 10104 struct nft_chain *chain, *nc; 10105 struct nft_object *obj, *ne; 10106 struct nft_rule *rule, *nr; 10107 struct nft_set *set, *ns; 10108 struct nft_ctx ctx = { 10109 .net = net, 10110 .family = NFPROTO_NETDEV, 10111 }; 10112 10113 ctx.family = table->family; 10114 ctx.table = table; 10115 list_for_each_entry(chain, &table->chains, list) { 10116 ctx.chain = chain; 10117 list_for_each_entry_safe(rule, nr, &chain->rules, list) { 10118 list_del(&rule->list); 10119 chain->use--; 10120 nf_tables_rule_release(&ctx, rule); 10121 } 10122 } 10123 list_for_each_entry_safe(flowtable, nf, &table->flowtables, list) { 10124 list_del(&flowtable->list); 10125 table->use--; 10126 nf_tables_flowtable_destroy(flowtable); 10127 } 10128 list_for_each_entry_safe(set, ns, &table->sets, list) { 10129 list_del(&set->list); 10130 table->use--; 10131 nft_set_destroy(&ctx, set); 10132 } 10133 list_for_each_entry_safe(obj, ne, &table->objects, list) { 10134 nft_obj_del(obj); 10135 table->use--; 10136 nft_obj_destroy(&ctx, obj); 10137 } 10138 list_for_each_entry_safe(chain, nc, &table->chains, list) { 10139 ctx.chain = chain; 10140 nft_chain_del(chain); 10141 table->use--; 10142 nf_tables_chain_destroy(&ctx); 10143 } 10144 nf_tables_table_destroy(&ctx); 10145 } 10146 10147 static void __nft_release_tables(struct net *net) 10148 { 10149 struct nftables_pernet *nft_net = nft_pernet(net); 10150 struct nft_table *table, *nt; 10151 10152 list_for_each_entry_safe(table, nt, &nft_net->tables, list) { 10153 if (nft_table_has_owner(table)) 10154 continue; 10155 10156 list_del(&table->list); 10157 10158 __nft_release_table(net, table); 10159 } 10160 } 10161 10162 static int nft_rcv_nl_event(struct notifier_block *this, unsigned long event, 10163 void *ptr) 10164 { 10165 struct nft_table *table, *to_delete[8]; 10166 struct nftables_pernet *nft_net; 10167 struct netlink_notify *n = ptr; 10168 struct net *net = n->net; 10169 unsigned int deleted; 10170 bool restart = false; 10171 10172 if (event != NETLINK_URELEASE || n->protocol != NETLINK_NETFILTER) 10173 return NOTIFY_DONE; 10174 10175 nft_net = nft_pernet(net); 10176 deleted = 0; 10177 mutex_lock(&nft_net->commit_mutex); 10178 if (!list_empty(&nf_tables_destroy_list)) 10179 rcu_barrier(); 10180 again: 10181 list_for_each_entry(table, &nft_net->tables, list) { 10182 if (nft_table_has_owner(table) && 10183 n->portid == table->nlpid) { 10184 __nft_release_hook(net, table); 10185 list_del_rcu(&table->list); 10186 to_delete[deleted++] = table; 10187 if (deleted >= ARRAY_SIZE(to_delete)) 10188 break; 10189 } 10190 } 10191 if (deleted) { 10192 restart = deleted >= ARRAY_SIZE(to_delete); 10193 synchronize_rcu(); 10194 while (deleted) 10195 __nft_release_table(net, to_delete[--deleted]); 10196 10197 if (restart) 10198 goto again; 10199 } 10200 mutex_unlock(&nft_net->commit_mutex); 10201 10202 return NOTIFY_DONE; 10203 } 10204 10205 static struct notifier_block nft_nl_notifier = { 10206 .notifier_call = nft_rcv_nl_event, 10207 }; 10208 10209 static int __net_init nf_tables_init_net(struct net *net) 10210 { 10211 struct nftables_pernet *nft_net = nft_pernet(net); 10212 10213 INIT_LIST_HEAD(&nft_net->tables); 10214 INIT_LIST_HEAD(&nft_net->commit_list); 10215 INIT_LIST_HEAD(&nft_net->module_list); 10216 INIT_LIST_HEAD(&nft_net->notify_list); 10217 mutex_init(&nft_net->commit_mutex); 10218 nft_net->base_seq = 1; 10219 nft_net->validate_state = NFT_VALIDATE_SKIP; 10220 10221 return 0; 10222 } 10223 10224 static void __net_exit nf_tables_pre_exit_net(struct net *net) 10225 { 10226 struct nftables_pernet *nft_net = nft_pernet(net); 10227 10228 mutex_lock(&nft_net->commit_mutex); 10229 __nft_release_hooks(net); 10230 mutex_unlock(&nft_net->commit_mutex); 10231 } 10232 10233 static void __net_exit nf_tables_exit_net(struct net *net) 10234 { 10235 struct nftables_pernet *nft_net = nft_pernet(net); 10236 10237 mutex_lock(&nft_net->commit_mutex); 10238 if (!list_empty(&nft_net->commit_list) || 10239 !list_empty(&nft_net->module_list)) 10240 __nf_tables_abort(net, NFNL_ABORT_NONE); 10241 __nft_release_tables(net); 10242 mutex_unlock(&nft_net->commit_mutex); 10243 WARN_ON_ONCE(!list_empty(&nft_net->tables)); 10244 WARN_ON_ONCE(!list_empty(&nft_net->module_list)); 10245 WARN_ON_ONCE(!list_empty(&nft_net->notify_list)); 10246 } 10247 10248 static struct pernet_operations nf_tables_net_ops = { 10249 .init = nf_tables_init_net, 10250 .pre_exit = nf_tables_pre_exit_net, 10251 .exit = nf_tables_exit_net, 10252 .id = &nf_tables_net_id, 10253 .size = sizeof(struct nftables_pernet), 10254 }; 10255 10256 static int __init nf_tables_module_init(void) 10257 { 10258 int err; 10259 10260 err = register_pernet_subsys(&nf_tables_net_ops); 10261 if (err < 0) 10262 return err; 10263 10264 err = nft_chain_filter_init(); 10265 if (err < 0) 10266 goto err_chain_filter; 10267 10268 err = nf_tables_core_module_init(); 10269 if (err < 0) 10270 goto err_core_module; 10271 10272 err = register_netdevice_notifier(&nf_tables_flowtable_notifier); 10273 if (err < 0) 10274 goto err_netdev_notifier; 10275 10276 err = rhltable_init(&nft_objname_ht, &nft_objname_ht_params); 10277 if (err < 0) 10278 goto err_rht_objname; 10279 10280 err = nft_offload_init(); 10281 if (err < 0) 10282 goto err_offload; 10283 10284 err = netlink_register_notifier(&nft_nl_notifier); 10285 if (err < 0) 10286 goto err_netlink_notifier; 10287 10288 /* must be last */ 10289 err = nfnetlink_subsys_register(&nf_tables_subsys); 10290 if (err < 0) 10291 goto err_nfnl_subsys; 10292 10293 nft_chain_route_init(); 10294 10295 return err; 10296 10297 err_nfnl_subsys: 10298 netlink_unregister_notifier(&nft_nl_notifier); 10299 err_netlink_notifier: 10300 nft_offload_exit(); 10301 err_offload: 10302 rhltable_destroy(&nft_objname_ht); 10303 err_rht_objname: 10304 unregister_netdevice_notifier(&nf_tables_flowtable_notifier); 10305 err_netdev_notifier: 10306 nf_tables_core_module_exit(); 10307 err_core_module: 10308 nft_chain_filter_fini(); 10309 err_chain_filter: 10310 unregister_pernet_subsys(&nf_tables_net_ops); 10311 return err; 10312 } 10313 10314 static void __exit nf_tables_module_exit(void) 10315 { 10316 nfnetlink_subsys_unregister(&nf_tables_subsys); 10317 netlink_unregister_notifier(&nft_nl_notifier); 10318 nft_offload_exit(); 10319 unregister_netdevice_notifier(&nf_tables_flowtable_notifier); 10320 nft_chain_filter_fini(); 10321 nft_chain_route_fini(); 10322 unregister_pernet_subsys(&nf_tables_net_ops); 10323 cancel_work_sync(&trans_destroy_work); 10324 rcu_barrier(); 10325 rhltable_destroy(&nft_objname_ht); 10326 nf_tables_core_module_exit(); 10327 } 10328 10329 module_init(nf_tables_module_init); 10330 module_exit(nf_tables_module_exit); 10331 10332 MODULE_LICENSE("GPL"); 10333 MODULE_AUTHOR("Patrick McHardy <kaber@trash.net>"); 10334 MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_NFTABLES); 10335