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