|
26 | 26 |
|
27 | 27 | #include <uapi/linux/netfilter_bridge.h> /* NF_BR_PRE_ROUTING */
|
28 | 28 |
|
| 29 | +#define NFT_META_SECS_PER_MINUTE 60 |
| 30 | +#define NFT_META_SECS_PER_HOUR 3600 |
| 31 | +#define NFT_META_SECS_PER_DAY 86400 |
| 32 | +#define NFT_META_DAYS_PER_WEEK 7 |
| 33 | + |
29 | 34 | static DEFINE_PER_CPU(struct rnd_state, nft_prandom_state);
|
30 | 35 |
|
| 36 | +static u8 nft_meta_weekday(unsigned long secs) |
| 37 | +{ |
| 38 | + unsigned int dse; |
| 39 | + u8 wday; |
| 40 | + |
| 41 | + secs -= NFT_META_SECS_PER_MINUTE * sys_tz.tz_minuteswest; |
| 42 | + dse = secs / NFT_META_SECS_PER_DAY; |
| 43 | + wday = (4 + dse) % NFT_META_DAYS_PER_WEEK; |
| 44 | + |
| 45 | + return wday; |
| 46 | +} |
| 47 | + |
| 48 | +static u32 nft_meta_hour(unsigned long secs) |
| 49 | +{ |
| 50 | + struct tm tm; |
| 51 | + |
| 52 | + time64_to_tm(secs, 0, &tm); |
| 53 | + |
| 54 | + return tm.tm_hour * NFT_META_SECS_PER_HOUR |
| 55 | + + tm.tm_min * NFT_META_SECS_PER_MINUTE |
| 56 | + + tm.tm_sec; |
| 57 | +} |
| 58 | + |
31 | 59 | void nft_meta_get_eval(const struct nft_expr *expr,
|
32 | 60 | struct nft_regs *regs,
|
33 | 61 | const struct nft_pktinfo *pkt)
|
@@ -218,6 +246,15 @@ void nft_meta_get_eval(const struct nft_expr *expr,
|
218 | 246 | goto err;
|
219 | 247 | strncpy((char *)dest, out->rtnl_link_ops->kind, IFNAMSIZ);
|
220 | 248 | break;
|
| 249 | + case NFT_META_TIME_NS: |
| 250 | + nft_reg_store64(dest, ktime_get_real_ns()); |
| 251 | + break; |
| 252 | + case NFT_META_TIME_DAY: |
| 253 | + nft_reg_store8(dest, nft_meta_weekday(get_seconds())); |
| 254 | + break; |
| 255 | + case NFT_META_TIME_HOUR: |
| 256 | + *dest = nft_meta_hour(get_seconds()); |
| 257 | + break; |
221 | 258 | default:
|
222 | 259 | WARN_ON(1);
|
223 | 260 | goto err;
|
@@ -330,6 +367,15 @@ int nft_meta_get_init(const struct nft_ctx *ctx,
|
330 | 367 | len = sizeof(u8);
|
331 | 368 | break;
|
332 | 369 | #endif
|
| 370 | + case NFT_META_TIME_NS: |
| 371 | + len = sizeof(u64); |
| 372 | + break; |
| 373 | + case NFT_META_TIME_DAY: |
| 374 | + len = sizeof(u8); |
| 375 | + break; |
| 376 | + case NFT_META_TIME_HOUR: |
| 377 | + len = sizeof(u32); |
| 378 | + break; |
333 | 379 | default:
|
334 | 380 | return -EOPNOTSUPP;
|
335 | 381 | }
|
|
0 commit comments