@@ -210,6 +210,11 @@ void nft_meta_get_eval(const struct nft_expr *expr,
210
210
* dest = prandom_u32_state (state );
211
211
break ;
212
212
}
213
+ #ifdef CONFIG_XFRM
214
+ case NFT_META_SECPATH :
215
+ nft_reg_store8 (dest , !!skb -> sp );
216
+ break ;
217
+ #endif
213
218
default :
214
219
WARN_ON (1 );
215
220
goto err ;
@@ -308,6 +313,11 @@ int nft_meta_get_init(const struct nft_ctx *ctx,
308
313
prandom_init_once (& nft_prandom_state );
309
314
len = sizeof (u32 );
310
315
break ;
316
+ #ifdef CONFIG_XFRM
317
+ case NFT_META_SECPATH :
318
+ len = sizeof (u8 );
319
+ break ;
320
+ #endif
311
321
default :
312
322
return - EOPNOTSUPP ;
313
323
}
@@ -318,6 +328,38 @@ int nft_meta_get_init(const struct nft_ctx *ctx,
318
328
}
319
329
EXPORT_SYMBOL_GPL (nft_meta_get_init );
320
330
331
+ static int nft_meta_get_validate (const struct nft_ctx * ctx ,
332
+ const struct nft_expr * expr ,
333
+ const struct nft_data * * data )
334
+ {
335
+ #ifdef CONFIG_XFRM
336
+ const struct nft_meta * priv = nft_expr_priv (expr );
337
+ unsigned int hooks ;
338
+
339
+ if (priv -> key != NFT_META_SECPATH )
340
+ return 0 ;
341
+
342
+ switch (ctx -> afi -> family ) {
343
+ case NFPROTO_NETDEV :
344
+ hooks = 1 << NF_NETDEV_INGRESS ;
345
+ break ;
346
+ case NFPROTO_IPV4 :
347
+ case NFPROTO_IPV6 :
348
+ case NFPROTO_INET :
349
+ hooks = (1 << NF_INET_PRE_ROUTING ) |
350
+ (1 << NF_INET_LOCAL_IN ) |
351
+ (1 << NF_INET_FORWARD );
352
+ break ;
353
+ default :
354
+ return - EOPNOTSUPP ;
355
+ }
356
+
357
+ return nft_chain_validate_hooks (ctx -> chain , hooks );
358
+ #else
359
+ return 0 ;
360
+ #endif
361
+ }
362
+
321
363
int nft_meta_set_validate (const struct nft_ctx * ctx ,
322
364
const struct nft_expr * expr ,
323
365
const struct nft_data * * data )
@@ -434,6 +476,7 @@ static const struct nft_expr_ops nft_meta_get_ops = {
434
476
.eval = nft_meta_get_eval ,
435
477
.init = nft_meta_get_init ,
436
478
.dump = nft_meta_get_dump ,
479
+ .validate = nft_meta_get_validate ,
437
480
};
438
481
439
482
static const struct nft_expr_ops nft_meta_set_ops = {
0 commit comments