@@ -3972,14 +3972,14 @@ static struct nft_object *nft_obj_init(const struct nft_object_type *type,
39723972}
39733973
39743974static int nft_object_dump (struct sk_buff * skb , unsigned int attr ,
3975- const struct nft_object * obj )
3975+ struct nft_object * obj , bool reset )
39763976{
39773977 struct nlattr * nest ;
39783978
39793979 nest = nla_nest_start (skb , attr );
39803980 if (!nest )
39813981 goto nla_put_failure ;
3982- if (obj -> type -> dump (skb , obj ) < 0 )
3982+ if (obj -> type -> dump (skb , obj , reset ) < 0 )
39833983 goto nla_put_failure ;
39843984 nla_nest_end (skb , nest );
39853985 return 0 ;
@@ -4096,7 +4096,7 @@ static int nf_tables_newobj(struct net *net, struct sock *nlsk,
40964096static int nf_tables_fill_obj_info (struct sk_buff * skb , struct net * net ,
40974097 u32 portid , u32 seq , int event , u32 flags ,
40984098 int family , const struct nft_table * table ,
4099- const struct nft_object * obj )
4099+ struct nft_object * obj , bool reset )
41004100{
41014101 struct nfgenmsg * nfmsg ;
41024102 struct nlmsghdr * nlh ;
@@ -4115,7 +4115,7 @@ static int nf_tables_fill_obj_info(struct sk_buff *skb, struct net *net,
41154115 nla_put_string (skb , NFTA_OBJ_NAME , obj -> name ) ||
41164116 nla_put_be32 (skb , NFTA_OBJ_TYPE , htonl (obj -> type -> type )) ||
41174117 nla_put_be32 (skb , NFTA_OBJ_USE , htonl (obj -> use )) ||
4118- nft_object_dump (skb , NFTA_OBJ_DATA , obj ))
4118+ nft_object_dump (skb , NFTA_OBJ_DATA , obj , reset ))
41194119 goto nla_put_failure ;
41204120
41214121 nlmsg_end (skb , nlh );
@@ -4131,10 +4131,14 @@ static int nf_tables_dump_obj(struct sk_buff *skb, struct netlink_callback *cb)
41314131 const struct nfgenmsg * nfmsg = nlmsg_data (cb -> nlh );
41324132 const struct nft_af_info * afi ;
41334133 const struct nft_table * table ;
4134- const struct nft_object * obj ;
41354134 unsigned int idx = 0 , s_idx = cb -> args [0 ];
41364135 struct net * net = sock_net (skb -> sk );
41374136 int family = nfmsg -> nfgen_family ;
4137+ struct nft_object * obj ;
4138+ bool reset = false;
4139+
4140+ if (NFNL_MSG_TYPE (cb -> nlh -> nlmsg_type ) == NFT_MSG_GETOBJ_RESET )
4141+ reset = true;
41384142
41394143 rcu_read_lock ();
41404144 cb -> seq = net -> nft .base_seq ;
@@ -4156,7 +4160,7 @@ static int nf_tables_dump_obj(struct sk_buff *skb, struct netlink_callback *cb)
41564160 cb -> nlh -> nlmsg_seq ,
41574161 NFT_MSG_NEWOBJ ,
41584162 NLM_F_MULTI | NLM_F_APPEND ,
4159- afi -> family , table , obj ) < 0 )
4163+ afi -> family , table , obj , reset ) < 0 )
41604164 goto done ;
41614165
41624166 nl_dump_check_consistent (cb , nlmsg_hdr (skb ));
@@ -4183,6 +4187,7 @@ static int nf_tables_getobj(struct net *net, struct sock *nlsk,
41834187 const struct nft_table * table ;
41844188 struct nft_object * obj ;
41854189 struct sk_buff * skb2 ;
4190+ bool reset = false;
41864191 u32 objtype ;
41874192 int err ;
41884193
@@ -4214,9 +4219,12 @@ static int nf_tables_getobj(struct net *net, struct sock *nlsk,
42144219 if (!skb2 )
42154220 return - ENOMEM ;
42164221
4222+ if (NFNL_MSG_TYPE (nlh -> nlmsg_type ) == NFT_MSG_GETOBJ_RESET )
4223+ reset = true;
4224+
42174225 err = nf_tables_fill_obj_info (skb2 , net , NETLINK_CB (skb ).portid ,
42184226 nlh -> nlmsg_seq , NFT_MSG_NEWOBJ , 0 ,
4219- family , table , obj );
4227+ family , table , obj , reset );
42204228 if (err < 0 )
42214229 goto err ;
42224230
@@ -4291,7 +4299,7 @@ static int nf_tables_obj_notify(const struct nft_ctx *ctx,
42914299
42924300 err = nf_tables_fill_obj_info (skb , ctx -> net , ctx -> portid , ctx -> seq ,
42934301 event , 0 , ctx -> afi -> family , ctx -> table ,
4294- obj );
4302+ obj , false );
42954303 if (err < 0 ) {
42964304 kfree_skb (skb );
42974305 goto err ;
@@ -4482,6 +4490,11 @@ static const struct nfnl_callback nf_tables_cb[NFT_MSG_MAX] = {
44824490 .attr_count = NFTA_OBJ_MAX ,
44834491 .policy = nft_obj_policy ,
44844492 },
4493+ [NFT_MSG_GETOBJ_RESET ] = {
4494+ .call = nf_tables_getobj ,
4495+ .attr_count = NFTA_OBJ_MAX ,
4496+ .policy = nft_obj_policy ,
4497+ },
44854498};
44864499
44874500static void nft_chain_commit_update (struct nft_trans * trans )
0 commit comments