@@ -127,13 +127,38 @@ static void nft_trans_destroy(struct nft_trans *trans)
127
127
kfree (trans );
128
128
}
129
129
130
+ static int nft_register_basechain (struct nft_base_chain * basechain ,
131
+ unsigned int hook_nops )
132
+ {
133
+ return nf_register_hooks (basechain -> ops , hook_nops );
134
+ }
135
+
136
+ static void nft_unregister_basechain (struct nft_base_chain * basechain ,
137
+ unsigned int hook_nops )
138
+ {
139
+ nf_unregister_hooks (basechain -> ops , hook_nops );
140
+ }
141
+
142
+ static int nf_tables_register_hooks (const struct nft_table * table ,
143
+ struct nft_chain * chain ,
144
+ unsigned int hook_nops )
145
+ {
146
+ if (table -> flags & NFT_TABLE_F_DORMANT ||
147
+ !(chain -> flags & NFT_BASE_CHAIN ))
148
+ return 0 ;
149
+
150
+ return nft_register_basechain (nft_base_chain (chain ), hook_nops );
151
+ }
152
+
130
153
static void nf_tables_unregister_hooks (const struct nft_table * table ,
131
- const struct nft_chain * chain ,
154
+ struct nft_chain * chain ,
132
155
unsigned int hook_nops )
133
156
{
134
- if (!(table -> flags & NFT_TABLE_F_DORMANT ) &&
135
- chain -> flags & NFT_BASE_CHAIN )
136
- nf_unregister_hooks (nft_base_chain (chain )-> ops , hook_nops );
157
+ if (table -> flags & NFT_TABLE_F_DORMANT ||
158
+ !(chain -> flags & NFT_BASE_CHAIN ))
159
+ return ;
160
+
161
+ nft_unregister_basechain (nft_base_chain (chain ), hook_nops );
137
162
}
138
163
139
164
/* Internal table flags */
@@ -560,7 +585,7 @@ static int nf_tables_table_enable(const struct nft_af_info *afi,
560
585
if (!(chain -> flags & NFT_BASE_CHAIN ))
561
586
continue ;
562
587
563
- err = nf_register_hooks (nft_base_chain (chain )-> ops , afi -> nops );
588
+ err = nft_register_basechain (nft_base_chain (chain ), afi -> nops );
564
589
if (err < 0 )
565
590
goto err ;
566
591
@@ -575,20 +600,20 @@ static int nf_tables_table_enable(const struct nft_af_info *afi,
575
600
if (i -- <= 0 )
576
601
break ;
577
602
578
- nf_unregister_hooks (nft_base_chain (chain )-> ops , afi -> nops );
603
+ nft_unregister_basechain (nft_base_chain (chain ), afi -> nops );
579
604
}
580
605
return err ;
581
606
}
582
607
583
608
static void nf_tables_table_disable (const struct nft_af_info * afi ,
584
- struct nft_table * table )
609
+ struct nft_table * table )
585
610
{
586
611
struct nft_chain * chain ;
587
612
588
613
list_for_each_entry (chain , & table -> chains , list ) {
589
614
if (chain -> flags & NFT_BASE_CHAIN )
590
- nf_unregister_hooks (nft_base_chain (chain )-> ops ,
591
- afi -> nops );
615
+ nft_unregister_basechain (nft_base_chain (chain ),
616
+ afi -> nops );
592
617
}
593
618
}
594
619
@@ -1421,12 +1446,9 @@ static int nf_tables_newchain(struct sock *nlsk, struct sk_buff *skb,
1421
1446
chain -> table = table ;
1422
1447
nla_strlcpy (chain -> name , name , NFT_CHAIN_MAXNAMELEN );
1423
1448
1424
- if (!(table -> flags & NFT_TABLE_F_DORMANT ) &&
1425
- chain -> flags & NFT_BASE_CHAIN ) {
1426
- err = nf_register_hooks (nft_base_chain (chain )-> ops , afi -> nops );
1427
- if (err < 0 )
1428
- goto err1 ;
1429
- }
1449
+ err = nf_tables_register_hooks (table , chain , afi -> nops );
1450
+ if (err < 0 )
1451
+ goto err1 ;
1430
1452
1431
1453
nft_ctx_init (& ctx , skb , nlh , afi , table , chain , nla );
1432
1454
err = nft_trans_chain_add (& ctx , NFT_MSG_NEWCHAIN );
0 commit comments