.. | .. |
---|
7 | 7 | #include <net/netfilter/nf_tables_offload.h> |
---|
8 | 8 | #include <net/pkt_cls.h> |
---|
9 | 9 | |
---|
| 10 | +extern unsigned int nf_tables_net_id; |
---|
| 11 | + |
---|
10 | 12 | static struct nft_flow_rule *nft_flow_rule_alloc(int num_actions) |
---|
11 | 13 | { |
---|
12 | 14 | struct nft_flow_rule *flow; |
---|
.. | .. |
---|
371 | 373 | struct nft_base_chain *basechain = block_cb->indr.data; |
---|
372 | 374 | struct net_device *dev = block_cb->indr.dev; |
---|
373 | 375 | struct netlink_ext_ack extack = {}; |
---|
| 376 | + struct nftables_pernet *nft_net; |
---|
374 | 377 | struct net *net = dev_net(dev); |
---|
375 | 378 | struct flow_block_offload bo; |
---|
376 | 379 | |
---|
377 | 380 | nft_flow_block_offload_init(&bo, dev_net(dev), FLOW_BLOCK_UNBIND, |
---|
378 | 381 | basechain, &extack); |
---|
379 | | - mutex_lock(&net->nft.commit_mutex); |
---|
| 382 | + nft_net = net_generic(net, nf_tables_net_id); |
---|
| 383 | + mutex_lock(&nft_net->commit_mutex); |
---|
380 | 384 | list_del(&block_cb->driver_list); |
---|
381 | 385 | list_move(&block_cb->list, &bo.cb_list); |
---|
382 | 386 | nft_flow_offload_unbind(&bo, basechain); |
---|
383 | | - mutex_unlock(&net->nft.commit_mutex); |
---|
| 387 | + mutex_unlock(&nft_net->commit_mutex); |
---|
384 | 388 | } |
---|
385 | 389 | |
---|
386 | 390 | static int nft_indr_block_offload_cmd(struct nft_base_chain *basechain, |
---|
.. | .. |
---|
476 | 480 | static void nft_flow_rule_offload_abort(struct net *net, |
---|
477 | 481 | struct nft_trans *trans) |
---|
478 | 482 | { |
---|
| 483 | + struct nftables_pernet *nft_net = net_generic(net, nf_tables_net_id); |
---|
479 | 484 | int err = 0; |
---|
480 | 485 | |
---|
481 | | - list_for_each_entry_continue_reverse(trans, &net->nft.commit_list, list) { |
---|
| 486 | + list_for_each_entry_continue_reverse(trans, &nft_net->commit_list, list) { |
---|
482 | 487 | if (trans->ctx.family != NFPROTO_NETDEV) |
---|
483 | 488 | continue; |
---|
484 | 489 | |
---|
.. | .. |
---|
524 | 529 | |
---|
525 | 530 | int nft_flow_rule_offload_commit(struct net *net) |
---|
526 | 531 | { |
---|
| 532 | + struct nftables_pernet *nft_net = net_generic(net, nf_tables_net_id); |
---|
527 | 533 | struct nft_trans *trans; |
---|
528 | 534 | int err = 0; |
---|
529 | 535 | u8 policy; |
---|
530 | 536 | |
---|
531 | | - list_for_each_entry(trans, &net->nft.commit_list, list) { |
---|
| 537 | + list_for_each_entry(trans, &nft_net->commit_list, list) { |
---|
532 | 538 | if (trans->ctx.family != NFPROTO_NETDEV) |
---|
533 | 539 | continue; |
---|
534 | 540 | |
---|
.. | .. |
---|
580 | 586 | } |
---|
581 | 587 | } |
---|
582 | 588 | |
---|
583 | | - list_for_each_entry(trans, &net->nft.commit_list, list) { |
---|
| 589 | + list_for_each_entry(trans, &nft_net->commit_list, list) { |
---|
584 | 590 | if (trans->ctx.family != NFPROTO_NETDEV) |
---|
585 | 591 | continue; |
---|
586 | 592 | |
---|
.. | .. |
---|
600 | 606 | return err; |
---|
601 | 607 | } |
---|
602 | 608 | |
---|
603 | | -static struct nft_chain *__nft_offload_get_chain(struct net_device *dev) |
---|
| 609 | +static struct nft_chain *__nft_offload_get_chain(const struct nftables_pernet *nft_net, |
---|
| 610 | + struct net_device *dev) |
---|
604 | 611 | { |
---|
605 | 612 | struct nft_base_chain *basechain; |
---|
606 | | - struct net *net = dev_net(dev); |
---|
607 | 613 | struct nft_hook *hook, *found; |
---|
608 | 614 | const struct nft_table *table; |
---|
609 | 615 | struct nft_chain *chain; |
---|
610 | 616 | |
---|
611 | | - list_for_each_entry(table, &net->nft.tables, list) { |
---|
| 617 | + list_for_each_entry(table, &nft_net->tables, list) { |
---|
612 | 618 | if (table->family != NFPROTO_NETDEV) |
---|
613 | 619 | continue; |
---|
614 | 620 | |
---|
.. | .. |
---|
640 | 646 | unsigned long event, void *ptr) |
---|
641 | 647 | { |
---|
642 | 648 | struct net_device *dev = netdev_notifier_info_to_dev(ptr); |
---|
| 649 | + struct nftables_pernet *nft_net; |
---|
643 | 650 | struct net *net = dev_net(dev); |
---|
644 | 651 | struct nft_chain *chain; |
---|
645 | 652 | |
---|
646 | 653 | if (event != NETDEV_UNREGISTER) |
---|
647 | 654 | return NOTIFY_DONE; |
---|
648 | 655 | |
---|
649 | | - mutex_lock(&net->nft.commit_mutex); |
---|
650 | | - chain = __nft_offload_get_chain(dev); |
---|
| 656 | + nft_net = net_generic(net, nf_tables_net_id); |
---|
| 657 | + mutex_lock(&nft_net->commit_mutex); |
---|
| 658 | + chain = __nft_offload_get_chain(nft_net, dev); |
---|
651 | 659 | if (chain) |
---|
652 | 660 | nft_flow_block_chain(nft_base_chain(chain), dev, |
---|
653 | 661 | FLOW_BLOCK_UNBIND); |
---|
654 | 662 | |
---|
655 | | - mutex_unlock(&net->nft.commit_mutex); |
---|
| 663 | + mutex_unlock(&nft_net->commit_mutex); |
---|
656 | 664 | |
---|
657 | 665 | return NOTIFY_DONE; |
---|
658 | 666 | } |
---|