Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 78292
b: refs/heads/master
c: 5c350e5
h: refs/heads/master
v: v3
  • Loading branch information
Jan Engelhardt authored and David S. Miller committed Jan 28, 2008
1 parent 67f0779 commit 714eb5f
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f1095ab51d4297d4a84b64a65c71054183a73486
refs/heads/master: 5c350e5a380333c64da8580fa134a2fd8e71fea4
5 changes: 5 additions & 0 deletions trunk/include/linux/netfilter/xt_DSCP.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,9 @@ struct xt_DSCP_info {
u_int8_t dscp;
};

struct xt_tos_target_info {
u_int8_t tos_value;
u_int8_t tos_mask;
};

#endif /* _XT_DSCP_TARGET_H */
2 changes: 1 addition & 1 deletion trunk/net/netfilter/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ config NETFILTER_XT_TARGET_DSCP

It also adds the "TOS" target, which allows you to create rules in
the "mangle" table which alter the Type Of Service field of an IPv4
packet prior to routing.
or the Priority field of an IPv6 packet, prior to routing.

To compile it as a module, choose M here. If unsure, say N.

Expand Down
63 changes: 63 additions & 0 deletions trunk/net/netfilter/xt_DSCP.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ MODULE_LICENSE("GPL");
MODULE_ALIAS("ipt_DSCP");
MODULE_ALIAS("ip6t_DSCP");
MODULE_ALIAS("ipt_TOS");
MODULE_ALIAS("ip6t_TOS");

static unsigned int
dscp_tg(struct sk_buff *skb, const struct net_device *in,
Expand Down Expand Up @@ -117,6 +118,50 @@ tos_tg_check_v0(const char *tablename, const void *e_void,
return true;
}

static unsigned int
tos_tg(struct sk_buff *skb, const struct net_device *in,
const struct net_device *out, unsigned int hooknum,
const struct xt_target *target, const void *targinfo)
{
const struct xt_tos_target_info *info = targinfo;
struct iphdr *iph = ip_hdr(skb);
u_int8_t orig, nv;

orig = ipv4_get_dsfield(iph);
nv = (orig & info->tos_mask) ^ info->tos_value;

if (orig != nv) {
if (!skb_make_writable(skb, sizeof(struct iphdr)))
return NF_DROP;
iph = ip_hdr(skb);
ipv4_change_dsfield(iph, ~0, nv);
}

return XT_CONTINUE;
}

static unsigned int
tos_tg6(struct sk_buff *skb, const struct net_device *in,
const struct net_device *out, unsigned int hooknum,
const struct xt_target *target, const void *targinfo)
{
const struct xt_tos_target_info *info = targinfo;
struct ipv6hdr *iph = ipv6_hdr(skb);
u_int8_t orig, nv;

orig = ipv6_get_dsfield(iph);
nv = (orig & info->tos_mask) ^ info->tos_value;

if (orig != nv) {
if (!skb_make_writable(skb, sizeof(struct iphdr)))
return NF_DROP;
iph = ipv6_hdr(skb);
ipv6_change_dsfield(iph, ~0, nv);
}

return XT_CONTINUE;
}

static struct xt_target dscp_tg_reg[] __read_mostly = {
{
.name = "DSCP",
Expand Down Expand Up @@ -146,6 +191,24 @@ static struct xt_target dscp_tg_reg[] __read_mostly = {
.checkentry = tos_tg_check_v0,
.me = THIS_MODULE,
},
{
.name = "TOS",
.revision = 1,
.family = AF_INET,
.table = "mangle",
.target = tos_tg,
.targetsize = sizeof(struct xt_tos_target_info),
.me = THIS_MODULE,
},
{
.name = "TOS",
.revision = 1,
.family = AF_INET6,
.table = "mangle",
.target = tos_tg6,
.targetsize = sizeof(struct xt_tos_target_info),
.me = THIS_MODULE,
},
};

static int __init dscp_tg_init(void)
Expand Down

0 comments on commit 714eb5f

Please sign in to comment.