diff options
-rw-r--r-- | include/linux/skbuff.h | 22 | ||||
-rw-r--r-- | net/Kconfig | 7 | ||||
-rw-r--r-- | net/core/skbuff.c | 3 | ||||
-rw-r--r-- | net/ipv4/ip_output.c | 1 | ||||
-rw-r--r-- | net/ipv4/netfilter/ipt_REJECT.c | 1 | ||||
-rw-r--r-- | net/ipv6/ip6_output.c | 1 |
6 files changed, 34 insertions, 1 deletions
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 23bad3bf3c9d..fe2c58e5306f 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
@@ -210,6 +210,7 @@ enum { | |||
210 | * @nf_bridge: Saved data about a bridged frame - see br_netfilter.c | 210 | * @nf_bridge: Saved data about a bridged frame - see br_netfilter.c |
211 | * @tc_index: Traffic control index | 211 | * @tc_index: Traffic control index |
212 | * @tc_verd: traffic control verdict | 212 | * @tc_verd: traffic control verdict |
213 | * @secmark: security marking | ||
213 | */ | 214 | */ |
214 | 215 | ||
215 | struct sk_buff { | 216 | struct sk_buff { |
@@ -289,6 +290,9 @@ struct sk_buff { | |||
289 | #ifdef CONFIG_NET_DMA | 290 | #ifdef CONFIG_NET_DMA |
290 | dma_cookie_t dma_cookie; | 291 | dma_cookie_t dma_cookie; |
291 | #endif | 292 | #endif |
293 | #ifdef CONFIG_NETWORK_SECMARK | ||
294 | __u32 secmark; | ||
295 | #endif | ||
292 | 296 | ||
293 | 297 | ||
294 | /* These elements must be at the end, see alloc_skb() for details. */ | 298 | /* These elements must be at the end, see alloc_skb() for details. */ |
@@ -1400,5 +1404,23 @@ static inline void nf_reset(struct sk_buff *skb) | |||
1400 | static inline void nf_reset(struct sk_buff *skb) {} | 1404 | static inline void nf_reset(struct sk_buff *skb) {} |
1401 | #endif /* CONFIG_NETFILTER */ | 1405 | #endif /* CONFIG_NETFILTER */ |
1402 | 1406 | ||
1407 | #ifdef CONFIG_NETWORK_SECMARK | ||
1408 | static inline void skb_copy_secmark(struct sk_buff *to, const struct sk_buff *from) | ||
1409 | { | ||
1410 | to->secmark = from->secmark; | ||
1411 | } | ||
1412 | |||
1413 | static inline void skb_init_secmark(struct sk_buff *skb) | ||
1414 | { | ||
1415 | skb->secmark = 0; | ||
1416 | } | ||
1417 | #else | ||
1418 | static inline void skb_copy_secmark(struct sk_buff *to, const struct sk_buff *from) | ||
1419 | { } | ||
1420 | |||
1421 | static inline void skb_init_secmark(struct sk_buff *skb) | ||
1422 | { } | ||
1423 | #endif | ||
1424 | |||
1403 | #endif /* __KERNEL__ */ | 1425 | #endif /* __KERNEL__ */ |
1404 | #endif /* _LINUX_SKBUFF_H */ | 1426 | #endif /* _LINUX_SKBUFF_H */ |
diff --git a/net/Kconfig b/net/Kconfig index ccadc8e48152..c6cec5aa5486 100644 --- a/net/Kconfig +++ b/net/Kconfig | |||
@@ -66,6 +66,13 @@ source "net/ipv6/Kconfig" | |||
66 | 66 | ||
67 | endif # if INET | 67 | endif # if INET |
68 | 68 | ||
69 | config NETWORK_SECMARK | ||
70 | bool "Security Marking" | ||
71 | help | ||
72 | This enables security marking of network packets, similar | ||
73 | to nfmark, but designated for security purposes. | ||
74 | If you are unsure how to answer this question, answer N. | ||
75 | |||
69 | menuconfig NETFILTER | 76 | menuconfig NETFILTER |
70 | bool "Network packet filtering (replaces ipchains)" | 77 | bool "Network packet filtering (replaces ipchains)" |
71 | ---help--- | 78 | ---help--- |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index fb3770f9c094..96cdcbe24ba2 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -464,7 +464,7 @@ struct sk_buff *skb_clone(struct sk_buff *skb, gfp_t gfp_mask) | |||
464 | n->tc_verd = CLR_TC_MUNGED(n->tc_verd); | 464 | n->tc_verd = CLR_TC_MUNGED(n->tc_verd); |
465 | C(input_dev); | 465 | C(input_dev); |
466 | #endif | 466 | #endif |
467 | 467 | skb_copy_secmark(n, skb); | |
468 | #endif | 468 | #endif |
469 | C(truesize); | 469 | C(truesize); |
470 | atomic_set(&n->users, 1); | 470 | atomic_set(&n->users, 1); |
@@ -526,6 +526,7 @@ static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old) | |||
526 | #endif | 526 | #endif |
527 | new->tc_index = old->tc_index; | 527 | new->tc_index = old->tc_index; |
528 | #endif | 528 | #endif |
529 | skb_copy_secmark(new, old); | ||
529 | atomic_set(&new->users, 1); | 530 | atomic_set(&new->users, 1); |
530 | skb_shinfo(new)->tso_size = skb_shinfo(old)->tso_size; | 531 | skb_shinfo(new)->tso_size = skb_shinfo(old)->tso_size; |
531 | skb_shinfo(new)->tso_segs = skb_shinfo(old)->tso_segs; | 532 | skb_shinfo(new)->tso_segs = skb_shinfo(old)->tso_segs; |
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index cff9c3a72daf..d4bb3fae4e49 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
@@ -410,6 +410,7 @@ static void ip_copy_metadata(struct sk_buff *to, struct sk_buff *from) | |||
410 | nf_bridge_get(to->nf_bridge); | 410 | nf_bridge_get(to->nf_bridge); |
411 | #endif | 411 | #endif |
412 | #endif | 412 | #endif |
413 | skb_copy_secmark(to, from); | ||
413 | } | 414 | } |
414 | 415 | ||
415 | /* | 416 | /* |
diff --git a/net/ipv4/netfilter/ipt_REJECT.c b/net/ipv4/netfilter/ipt_REJECT.c index 0bba3c2bb786..431a3ce6f7b7 100644 --- a/net/ipv4/netfilter/ipt_REJECT.c +++ b/net/ipv4/netfilter/ipt_REJECT.c | |||
@@ -147,6 +147,7 @@ static void send_reset(struct sk_buff *oldskb, int hook) | |||
147 | /* This packet will not be the same as the other: clear nf fields */ | 147 | /* This packet will not be the same as the other: clear nf fields */ |
148 | nf_reset(nskb); | 148 | nf_reset(nskb); |
149 | nskb->nfmark = 0; | 149 | nskb->nfmark = 0; |
150 | skb_init_secmark(nskb); | ||
150 | 151 | ||
151 | tcph = (struct tcphdr *)((u_int32_t*)nskb->nh.iph + nskb->nh.iph->ihl); | 152 | tcph = (struct tcphdr *)((u_int32_t*)nskb->nh.iph + nskb->nh.iph->ihl); |
152 | 153 | ||
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 416f6e428a0a..d29620f4910e 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -459,6 +459,7 @@ static void ip6_copy_metadata(struct sk_buff *to, struct sk_buff *from) | |||
459 | nf_bridge_get(to->nf_bridge); | 459 | nf_bridge_get(to->nf_bridge); |
460 | #endif | 460 | #endif |
461 | #endif | 461 | #endif |
462 | skb_copy_secmark(to, from); | ||
462 | } | 463 | } |
463 | 464 | ||
464 | int ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr) | 465 | int ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr) |