diff options
author | Patrick McHardy <kaber@trash.net> | 2006-01-09 01:15:34 -0500 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-01-09 17:16:08 -0500 |
commit | f43c5a0df38e12f53a3023175a12da9b7ef0df63 (patch) | |
tree | 9568a14353e93cffc0f59525c069b68305479520 | |
parent | 538e43a4bd36ae49873ef7097a16a207f5d9912b (diff) |
[PKT_SCHED]: Convert tc action functions to single skb pointers
tcf_action_exec only gets a single skb pointer and doesn't own the skb,
but passes double skb pointers (to a local variable) to the action
functions. Change to use single skb pointers everywhere.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | include/net/act_api.h | 2 | ||||
-rw-r--r-- | net/sched/act_api.c | 2 | ||||
-rw-r--r-- | net/sched/gact.c | 3 | ||||
-rw-r--r-- | net/sched/ipt.c | 6 | ||||
-rw-r--r-- | net/sched/mirred.c | 3 | ||||
-rw-r--r-- | net/sched/pedit.c | 3 | ||||
-rw-r--r-- | net/sched/police.c | 3 | ||||
-rw-r--r-- | net/sched/simple.c | 3 |
8 files changed, 11 insertions, 14 deletions
diff --git a/include/net/act_api.h b/include/net/act_api.h index b55eb7c7f033..11e9eaf79f5a 100644 --- a/include/net/act_api.h +++ b/include/net/act_api.h | |||
@@ -63,7 +63,7 @@ struct tc_action_ops | |||
63 | __u32 type; /* TBD to match kind */ | 63 | __u32 type; /* TBD to match kind */ |
64 | __u32 capab; /* capabilities includes 4 bit version */ | 64 | __u32 capab; /* capabilities includes 4 bit version */ |
65 | struct module *owner; | 65 | struct module *owner; |
66 | int (*act)(struct sk_buff **, struct tc_action *, struct tcf_result *); | 66 | int (*act)(struct sk_buff *, struct tc_action *, struct tcf_result *); |
67 | int (*get_stats)(struct sk_buff *, struct tc_action *); | 67 | int (*get_stats)(struct sk_buff *, struct tc_action *); |
68 | int (*dump)(struct sk_buff *, struct tc_action *,int , int); | 68 | int (*dump)(struct sk_buff *, struct tc_action *,int , int); |
69 | int (*cleanup)(struct tc_action *, int bind); | 69 | int (*cleanup)(struct tc_action *, int bind); |
diff --git a/net/sched/act_api.c b/net/sched/act_api.c index 2ce1cb2aa2ed..bd651a408817 100644 --- a/net/sched/act_api.c +++ b/net/sched/act_api.c | |||
@@ -165,7 +165,7 @@ int tcf_action_exec(struct sk_buff *skb, struct tc_action *act, | |||
165 | while ((a = act) != NULL) { | 165 | while ((a = act) != NULL) { |
166 | repeat: | 166 | repeat: |
167 | if (a->ops && a->ops->act) { | 167 | if (a->ops && a->ops->act) { |
168 | ret = a->ops->act(&skb, a, res); | 168 | ret = a->ops->act(skb, a, res); |
169 | if (TC_MUNGED & skb->tc_verd) { | 169 | if (TC_MUNGED & skb->tc_verd) { |
170 | /* copied already, allow trampling */ | 170 | /* copied already, allow trampling */ |
171 | skb->tc_verd = SET_TC_OK2MUNGE(skb->tc_verd); | 171 | skb->tc_verd = SET_TC_OK2MUNGE(skb->tc_verd); |
diff --git a/net/sched/gact.c b/net/sched/gact.c index d1c6d542912a..a1e68f78dcc2 100644 --- a/net/sched/gact.c +++ b/net/sched/gact.c | |||
@@ -135,10 +135,9 @@ tcf_gact_cleanup(struct tc_action *a, int bind) | |||
135 | } | 135 | } |
136 | 136 | ||
137 | static int | 137 | static int |
138 | tcf_gact(struct sk_buff **pskb, struct tc_action *a, struct tcf_result *res) | 138 | tcf_gact(struct sk_buff *skb, struct tc_action *a, struct tcf_result *res) |
139 | { | 139 | { |
140 | struct tcf_gact *p = PRIV(a, gact); | 140 | struct tcf_gact *p = PRIV(a, gact); |
141 | struct sk_buff *skb = *pskb; | ||
142 | int action = TC_ACT_SHOT; | 141 | int action = TC_ACT_SHOT; |
143 | 142 | ||
144 | spin_lock(&p->lock); | 143 | spin_lock(&p->lock); |
diff --git a/net/sched/ipt.c b/net/sched/ipt.c index f50136eed211..b5001939b74b 100644 --- a/net/sched/ipt.c +++ b/net/sched/ipt.c | |||
@@ -201,11 +201,10 @@ tcf_ipt_cleanup(struct tc_action *a, int bind) | |||
201 | } | 201 | } |
202 | 202 | ||
203 | static int | 203 | static int |
204 | tcf_ipt(struct sk_buff **pskb, struct tc_action *a, struct tcf_result *res) | 204 | tcf_ipt(struct sk_buff *skb, struct tc_action *a, struct tcf_result *res) |
205 | { | 205 | { |
206 | int ret = 0, result = 0; | 206 | int ret = 0, result = 0; |
207 | struct tcf_ipt *p = PRIV(a, ipt); | 207 | struct tcf_ipt *p = PRIV(a, ipt); |
208 | struct sk_buff *skb = *pskb; | ||
209 | 208 | ||
210 | if (skb_cloned(skb)) { | 209 | if (skb_cloned(skb)) { |
211 | if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) | 210 | if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) |
@@ -222,6 +221,9 @@ tcf_ipt(struct sk_buff **pskb, struct tc_action *a, struct tcf_result *res) | |||
222 | worry later - danger - this API seems to have changed | 221 | worry later - danger - this API seems to have changed |
223 | from earlier kernels */ | 222 | from earlier kernels */ |
224 | 223 | ||
224 | /* iptables targets take a double skb pointer in case the skb | ||
225 | * needs to be replaced. We don't own the skb, so this must not | ||
226 | * happen. The pskb_expand_head above should make sure of this */ | ||
225 | ret = p->t->u.kernel.target->target(&skb, skb->dev, NULL, | 227 | ret = p->t->u.kernel.target->target(&skb, skb->dev, NULL, |
226 | p->hook, p->t->data, NULL); | 228 | p->hook, p->t->data, NULL); |
227 | switch (ret) { | 229 | switch (ret) { |
diff --git a/net/sched/mirred.c b/net/sched/mirred.c index 20d06916dc0b..4fcccbd50885 100644 --- a/net/sched/mirred.c +++ b/net/sched/mirred.c | |||
@@ -158,12 +158,11 @@ tcf_mirred_cleanup(struct tc_action *a, int bind) | |||
158 | } | 158 | } |
159 | 159 | ||
160 | static int | 160 | static int |
161 | tcf_mirred(struct sk_buff **pskb, struct tc_action *a, struct tcf_result *res) | 161 | tcf_mirred(struct sk_buff *skb, struct tc_action *a, struct tcf_result *res) |
162 | { | 162 | { |
163 | struct tcf_mirred *p = PRIV(a, mirred); | 163 | struct tcf_mirred *p = PRIV(a, mirred); |
164 | struct net_device *dev; | 164 | struct net_device *dev; |
165 | struct sk_buff *skb2 = NULL; | 165 | struct sk_buff *skb2 = NULL; |
166 | struct sk_buff *skb = *pskb; | ||
167 | u32 at = G_TC_AT(skb->tc_verd); | 166 | u32 at = G_TC_AT(skb->tc_verd); |
168 | 167 | ||
169 | spin_lock(&p->lock); | 168 | spin_lock(&p->lock); |
diff --git a/net/sched/pedit.c b/net/sched/pedit.c index 767d24f4610e..b5167afec2dc 100644 --- a/net/sched/pedit.c +++ b/net/sched/pedit.c | |||
@@ -130,10 +130,9 @@ tcf_pedit_cleanup(struct tc_action *a, int bind) | |||
130 | } | 130 | } |
131 | 131 | ||
132 | static int | 132 | static int |
133 | tcf_pedit(struct sk_buff **pskb, struct tc_action *a, struct tcf_result *res) | 133 | tcf_pedit(struct sk_buff *skb, struct tc_action *a, struct tcf_result *res) |
134 | { | 134 | { |
135 | struct tcf_pedit *p = PRIV(a, pedit); | 135 | struct tcf_pedit *p = PRIV(a, pedit); |
136 | struct sk_buff *skb = *pskb; | ||
137 | int i, munged = 0; | 136 | int i, munged = 0; |
138 | u8 *pptr; | 137 | u8 *pptr; |
139 | 138 | ||
diff --git a/net/sched/police.c b/net/sched/police.c index eb39fb2f39b6..a8345163cc60 100644 --- a/net/sched/police.c +++ b/net/sched/police.c | |||
@@ -284,11 +284,10 @@ static int tcf_act_police_cleanup(struct tc_action *a, int bind) | |||
284 | return 0; | 284 | return 0; |
285 | } | 285 | } |
286 | 286 | ||
287 | static int tcf_act_police(struct sk_buff **pskb, struct tc_action *a, | 287 | static int tcf_act_police(struct sk_buff *skb, struct tc_action *a, |
288 | struct tcf_result *res) | 288 | struct tcf_result *res) |
289 | { | 289 | { |
290 | psched_time_t now; | 290 | psched_time_t now; |
291 | struct sk_buff *skb = *pskb; | ||
292 | struct tcf_police *p = PRIV(a); | 291 | struct tcf_police *p = PRIV(a); |
293 | long toks; | 292 | long toks; |
294 | long ptoks = 0; | 293 | long ptoks = 0; |
diff --git a/net/sched/simple.c b/net/sched/simple.c index 8a6ae4f491e8..e5f2e1f431e2 100644 --- a/net/sched/simple.c +++ b/net/sched/simple.c | |||
@@ -44,9 +44,8 @@ static DEFINE_RWLOCK(simp_lock); | |||
44 | #include <net/pkt_act.h> | 44 | #include <net/pkt_act.h> |
45 | #include <net/act_generic.h> | 45 | #include <net/act_generic.h> |
46 | 46 | ||
47 | static int tcf_simp(struct sk_buff **pskb, struct tc_action *a, struct tcf_result *res) | 47 | static int tcf_simp(struct sk_buff *skb, struct tc_action *a, struct tcf_result *res) |
48 | { | 48 | { |
49 | struct sk_buff *skb = *pskb; | ||
50 | struct tcf_defact *p = PRIV(a, defact); | 49 | struct tcf_defact *p = PRIV(a, defact); |
51 | 50 | ||
52 | spin_lock(&p->lock); | 51 | spin_lock(&p->lock); |