@@ -1176,7 +1176,7 @@ static inline bool nft_chain_is_bound(struct nft_chain *chain)
1176
1176
1177
1177
int nft_chain_add (struct nft_table * table , struct nft_chain * chain );
1178
1178
void nft_chain_del (struct nft_chain * chain );
1179
- void nf_tables_chain_destroy (struct nft_ctx * ctx );
1179
+ void nf_tables_chain_destroy (struct nft_chain * chain );
1180
1180
1181
1181
struct nft_stats {
1182
1182
u64 bytes ;
@@ -1613,41 +1613,67 @@ static inline int nft_set_elem_is_dead(const struct nft_set_ext *ext)
1613
1613
}
1614
1614
1615
1615
/**
1616
- * struct nft_trans - nf_tables object update in transaction
1616
+ * struct nft_trans - nf_tables object update in transaction
1617
1617
*
1618
- * @list: used internally
1619
- * @binding_list: list of objects with possible bindings
1620
- * @msg_type: message type
1621
- * @put_net: ctx->net needs to be put
1622
- * @ctx: transaction context
1623
- * @data: internal information related to the transaction
1618
+ * @list: used internally
1619
+ * @net: struct net
1620
+ * @table: struct nft_table the object resides in
1621
+ * @msg_type: message type
1622
+ * @seq: netlink sequence number
1623
+ * @flags: modifiers to new request
1624
+ * @report: notify via unicast netlink message
1625
+ * @put_net: net needs to be put
1626
+ *
1627
+ * This is the information common to all objects in the transaction,
1628
+ * this must always be the first member of derived sub-types.
1624
1629
*/
1625
1630
struct nft_trans {
1626
1631
struct list_head list ;
1627
- struct list_head binding_list ;
1632
+ struct net * net ;
1633
+ struct nft_table * table ;
1628
1634
int msg_type ;
1629
- bool put_net ;
1630
- struct nft_ctx ctx ;
1631
- char data [];
1635
+ u32 seq ;
1636
+ u16 flags ;
1637
+ u8 report :1 ;
1638
+ u8 put_net :1 ;
1639
+ };
1640
+
1641
+ /**
1642
+ * struct nft_trans_binding - nf_tables object with binding support in transaction
1643
+ * @nft_trans: base structure, MUST be first member
1644
+ * @binding_list: list of objects with possible bindings
1645
+ *
1646
+ * This is the base type used by objects that can be bound to a chain.
1647
+ */
1648
+ struct nft_trans_binding {
1649
+ struct nft_trans nft_trans ;
1650
+ struct list_head binding_list ;
1632
1651
};
1633
1652
1634
1653
struct nft_trans_rule {
1654
+ struct nft_trans nft_trans ;
1635
1655
struct nft_rule * rule ;
1656
+ struct nft_chain * chain ;
1636
1657
struct nft_flow_rule * flow ;
1637
1658
u32 rule_id ;
1638
1659
bool bound ;
1639
1660
};
1640
1661
1641
- #define nft_trans_rule (trans ) \
1642
- (((struct nft_trans_rule *)trans->data)->rule)
1643
- #define nft_trans_flow_rule (trans ) \
1644
- (((struct nft_trans_rule *)trans->data)->flow)
1645
- #define nft_trans_rule_id (trans ) \
1646
- (((struct nft_trans_rule *)trans->data)->rule_id)
1647
- #define nft_trans_rule_bound (trans ) \
1648
- (((struct nft_trans_rule *)trans->data)->bound)
1662
+ #define nft_trans_container_rule (trans ) \
1663
+ container_of(trans, struct nft_trans_rule, nft_trans)
1664
+ #define nft_trans_rule (trans ) \
1665
+ nft_trans_container_rule(trans)->rule
1666
+ #define nft_trans_flow_rule (trans ) \
1667
+ nft_trans_container_rule(trans)->flow
1668
+ #define nft_trans_rule_id (trans ) \
1669
+ nft_trans_container_rule(trans)->rule_id
1670
+ #define nft_trans_rule_bound (trans ) \
1671
+ nft_trans_container_rule(trans)->bound
1672
+ #define nft_trans_rule_chain (trans ) \
1673
+ nft_trans_container_rule(trans)->chain
1649
1674
1650
1675
struct nft_trans_set {
1676
+ struct nft_trans_binding nft_trans_binding ;
1651
1677
struct nft_set * set ;
1652
1678
u32 set_id ;
1653
1679
u32 gc_int ;
@@ -1657,100 +1683,117 @@ struct nft_trans_set {
1657
1683
u32 size ;
1658
1684
};
1659
1685
1660
- #define nft_trans_set (trans ) \
1661
- (((struct nft_trans_set *)trans->data)->set)
1662
- #define nft_trans_set_id (trans ) \
1663
- (((struct nft_trans_set *)trans->data)->set_id)
1664
- #define nft_trans_set_bound (trans ) \
1665
- (((struct nft_trans_set *)trans->data)->bound)
1666
- #define nft_trans_set_update (trans ) \
1667
- (((struct nft_trans_set *)trans->data)->update)
1668
- #define nft_trans_set_timeout (trans ) \
1669
- (((struct nft_trans_set *)trans->data)->timeout)
1670
- #define nft_trans_set_gc_int (trans ) \
1671
- (((struct nft_trans_set *)trans->data)->gc_int)
1672
- #define nft_trans_set_size (trans ) \
1673
- (((struct nft_trans_set *)trans->data)->size)
1686
+ #define nft_trans_container_set (t ) \
1687
+ container_of(t, struct nft_trans_set, nft_trans_binding.nft_trans)
1688
+ #define nft_trans_set (trans ) \
1689
+ nft_trans_container_set(trans)->set
1690
+ #define nft_trans_set_id (trans ) \
1691
+ nft_trans_container_set(trans)->set_id
1692
+ #define nft_trans_set_bound (trans ) \
1693
+ nft_trans_container_set(trans)->bound
1694
+ #define nft_trans_set_update (trans ) \
1695
+ nft_trans_container_set(trans)->update
1696
+ #define nft_trans_set_timeout (trans ) \
1697
+ nft_trans_container_set(trans)->timeout
1698
+ #define nft_trans_set_gc_int (trans ) \
1699
+ nft_trans_container_set(trans)->gc_int
1700
+ #define nft_trans_set_size (trans ) \
1701
+ nft_trans_container_set(trans)->size
1674
1702
1675
1703
struct nft_trans_chain {
1704
+ struct nft_trans_binding nft_trans_binding ;
1676
1705
struct nft_chain * chain ;
1677
- bool update ;
1678
1706
char * name ;
1679
1707
struct nft_stats __percpu * stats ;
1680
1708
u8 policy ;
1709
+ bool update ;
1681
1710
bool bound ;
1682
1711
u32 chain_id ;
1683
1712
struct nft_base_chain * basechain ;
1684
1713
struct list_head hook_list ;
1685
1714
};
1686
1715
1687
- #define nft_trans_chain (trans ) \
1688
- (((struct nft_trans_chain *)trans->data)->chain)
1689
- #define nft_trans_chain_update (trans ) \
1690
- (((struct nft_trans_chain *)trans->data)->update)
1691
- #define nft_trans_chain_name (trans ) \
1692
- (((struct nft_trans_chain *)trans->data)->name)
1693
- #define nft_trans_chain_stats (trans ) \
1694
- (((struct nft_trans_chain *)trans->data)->stats)
1695
- #define nft_trans_chain_policy (trans ) \
1696
- (((struct nft_trans_chain *)trans->data)->policy)
1697
- #define nft_trans_chain_bound (trans ) \
1698
- (((struct nft_trans_chain *)trans->data)->bound)
1699
- #define nft_trans_chain_id (trans ) \
1700
- (((struct nft_trans_chain *)trans->data)->chain_id)
1701
- #define nft_trans_basechain (trans ) \
1702
- (((struct nft_trans_chain *)trans->data)->basechain)
1703
- #define nft_trans_chain_hooks (trans ) \
1704
- (((struct nft_trans_chain *)trans->data)->hook_list)
1716
+ #define nft_trans_container_chain (t ) \
1717
+ container_of(t, struct nft_trans_chain, nft_trans_binding.nft_trans)
1718
+ #define nft_trans_chain (trans ) \
1719
+ nft_trans_container_chain(trans)->chain
1720
+ #define nft_trans_chain_update (trans ) \
1721
+ nft_trans_container_chain(trans)->update
1722
+ #define nft_trans_chain_name (trans ) \
1723
+ nft_trans_container_chain(trans)->name
1724
+ #define nft_trans_chain_stats (trans ) \
1725
+ nft_trans_container_chain(trans)->stats
1726
+ #define nft_trans_chain_policy (trans ) \
1727
+ nft_trans_container_chain(trans)->policy
1728
+ #define nft_trans_chain_bound (trans ) \
1729
+ nft_trans_container_chain(trans)->bound
1730
+ #define nft_trans_chain_id (trans ) \
1731
+ nft_trans_container_chain(trans)->chain_id
1732
+ #define nft_trans_basechain (trans ) \
1733
+ nft_trans_container_chain(trans)->basechain
1734
+ #define nft_trans_chain_hooks (trans ) \
1735
+ nft_trans_container_chain(trans)->hook_list
1705
1736
1706
1737
struct nft_trans_table {
1738
+ struct nft_trans nft_trans ;
1707
1739
bool update ;
1708
1740
};
1709
1741
1710
- #define nft_trans_table_update (trans ) \
1711
- (((struct nft_trans_table *)trans->data)->update)
1742
+ #define nft_trans_container_table (trans ) \
1743
+ container_of(trans, struct nft_trans_table, nft_trans)
1744
+ #define nft_trans_table_update (trans ) \
1745
+ nft_trans_container_table(trans)->update
1712
1746
1713
1747
struct nft_trans_elem {
1748
+ struct nft_trans nft_trans ;
1714
1749
struct nft_set * set ;
1715
1750
struct nft_elem_priv * elem_priv ;
1716
1751
bool bound ;
1717
1752
};
1718
1753
1719
- #define nft_trans_elem_set (trans ) \
1720
- (((struct nft_trans_elem *)trans->data)->set)
1721
- #define nft_trans_elem_priv (trans ) \
1722
- (((struct nft_trans_elem *)trans->data)->elem_priv)
1723
- #define nft_trans_elem_set_bound (trans ) \
1724
- (((struct nft_trans_elem *)trans->data)->bound)
1754
+ #define nft_trans_container_elem (t ) \
1755
+ container_of(t, struct nft_trans_elem, nft_trans)
1756
+ #define nft_trans_elem_set (trans ) \
1757
+ nft_trans_container_elem(trans)->set
1758
+ #define nft_trans_elem_priv (trans ) \
1759
+ nft_trans_container_elem(trans)->elem_priv
1760
+ #define nft_trans_elem_set_bound (trans ) \
1761
+ nft_trans_container_elem(trans)->bound
1725
1762
1726
1763
struct nft_trans_obj {
1764
+ struct nft_trans nft_trans ;
1727
1765
struct nft_object * obj ;
1728
1766
struct nft_object * newobj ;
1729
1767
bool update ;
1730
1768
};
1731
1769
1732
- #define nft_trans_obj (trans ) \
1733
- (((struct nft_trans_obj *)trans->data)->obj)
1734
- #define nft_trans_obj_newobj (trans ) \
1735
- (((struct nft_trans_obj *)trans->data)->newobj)
1736
- #define nft_trans_obj_update (trans ) \
1737
- (((struct nft_trans_obj *)trans->data)->update)
1770
+ #define nft_trans_container_obj (t ) \
1771
+ container_of(t, struct nft_trans_obj, nft_trans)
1772
+ #define nft_trans_obj (trans ) \
1773
+ nft_trans_container_obj(trans)->obj
1774
+ #define nft_trans_obj_newobj (trans ) \
1775
+ nft_trans_container_obj(trans)->newobj
1776
+ #define nft_trans_obj_update (trans ) \
1777
+ nft_trans_container_obj(trans)->update
1738
1778
1739
1779
struct nft_trans_flowtable {
1780
+ struct nft_trans nft_trans ;
1740
1781
struct nft_flowtable * flowtable ;
1741
- bool update ;
1742
1782
struct list_head hook_list ;
1743
1783
u32 flags ;
1784
+ bool update ;
1744
1785
};
1745
1786
1746
- #define nft_trans_flowtable (trans ) \
1747
- (((struct nft_trans_flowtable *)trans->data)->flowtable)
1748
- #define nft_trans_flowtable_update (trans ) \
1749
- (((struct nft_trans_flowtable *)trans->data)->update)
1750
- #define nft_trans_flowtable_hooks (trans ) \
1751
- (((struct nft_trans_flowtable *)trans->data)->hook_list)
1752
- #define nft_trans_flowtable_flags (trans ) \
1753
- (((struct nft_trans_flowtable *)trans->data)->flags)
1787
+ #define nft_trans_container_flowtable (t ) \
1788
+ container_of(t, struct nft_trans_flowtable, nft_trans)
1789
+ #define nft_trans_flowtable (trans ) \
1790
+ nft_trans_container_flowtable(trans)->flowtable
1791
+ #define nft_trans_flowtable_update (trans ) \
1792
+ nft_trans_container_flowtable(trans)->update
1793
+ #define nft_trans_flowtable_hooks (trans ) \
1794
+ nft_trans_container_flowtable(trans)->hook_list
1795
+ #define nft_trans_flowtable_flags (trans ) \
1796
+ nft_trans_container_flowtable(trans)->flags
1754
1797
1755
1798
#define NFT_TRANS_GC_BATCHCOUNT 256
1756
1799
@@ -1764,6 +1807,33 @@ struct nft_trans_gc {
1764
1807
struct rcu_head rcu ;
1765
1808
};
1766
1809
1810
+ static inline void nft_ctx_update (struct nft_ctx * ctx ,
1811
+ const struct nft_trans * trans )
1812
+ {
1813
+ switch (trans -> msg_type ) {
1814
+ case NFT_MSG_NEWRULE :
1815
+ case NFT_MSG_DELRULE :
1816
+ case NFT_MSG_DESTROYRULE :
1817
+ ctx -> chain = nft_trans_rule_chain (trans );
1818
+ break ;
1819
+ case NFT_MSG_NEWCHAIN :
1820
+ case NFT_MSG_DELCHAIN :
1821
+ case NFT_MSG_DESTROYCHAIN :
1822
+ ctx -> chain = nft_trans_chain (trans );
1823
+ break ;
1824
+ default :
1825
+ ctx -> chain = NULL ;
1826
+ break ;
1827
+ }
1828
+
1829
+ ctx -> net = trans -> net ;
1830
+ ctx -> table = trans -> table ;
1831
+ ctx -> family = trans -> table -> family ;
1832
+ ctx -> report = trans -> report ;
1833
+ ctx -> flags = trans -> flags ;
1834
+ ctx -> seq = trans -> seq ;
1835
+ }
1836
+
1767
1837
struct nft_trans_gc * nft_trans_gc_alloc (struct nft_set * set ,
1768
1838
unsigned int gc_seq , gfp_t gfp );
1769
1839
void nft_trans_gc_destroy (struct nft_trans_gc * trans );
0 commit comments