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