projects
/
openvswitch
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
datapath: Tabify indentation.
[openvswitch]
/
datapath
/
flow.c
diff --git
a/datapath/flow.c
b/datapath/flow.c
index 496f11cdb7284cb43bc013fcb0133385dcf32aa3..0f73c66c168ac07fadc22019fd776709f8ad887f 100644
(file)
--- a/
datapath/flow.c
+++ b/
datapath/flow.c
@@
-1,6
+1,6
@@
/*
* Distributed under the terms of the GNU GPL version 2.
/*
* Distributed under the terms of the GNU GPL version 2.
- * Copyright (c) 2007, 2008, 2009, 2010 Nicira Networks.
+ * Copyright (c) 2007, 2008, 2009, 2010
, 2011
Nicira Networks.
*
* Significant portions of this file may be copied from parts of the Linux
* kernel, by Linus Torvalds and others.
*
* Significant portions of this file may be copied from parts of the Linux
* kernel, by Linus Torvalds and others.
@@
-29,10
+29,8
@@
#include <net/inet_ecn.h>
#include <net/ip.h>
#include <net/inet_ecn.h>
#include <net/ip.h>
-#include "compat.h"
-
-struct kmem_cache *flow_cache;
-static unsigned int hash_seed;
+static struct kmem_cache *flow_cache;
+static unsigned int hash_seed __read_mostly;
static inline bool arphdr_ok(struct sk_buff *skb)
{
static inline bool arphdr_ok(struct sk_buff *skb)
{
@@
-104,22
+102,24
@@
void flow_used(struct sw_flow *flow, struct sk_buff *skb)
spin_unlock_bh(&flow->lock);
}
spin_unlock_bh(&flow->lock);
}
-struct sw_flow_actions *flow_actions_alloc(
size_t n_actions
)
+struct sw_flow_actions *flow_actions_alloc(
u32 actions_len
)
{
struct sw_flow_actions *sfa;
{
struct sw_flow_actions *sfa;
+ if (actions_len % NLA_ALIGNTO)
+ return ERR_PTR(-EINVAL);
+
/* At least DP_MAX_PORTS actions are required to be able to flood a
* packet to every port. Factor of 2 allows for setting VLAN tags,
* etc. */
/* At least DP_MAX_PORTS actions are required to be able to flood a
* packet to every port. Factor of 2 allows for setting VLAN tags,
* etc. */
- if (
n_actions > 2 * DP_MAX_PORTS
)
+ if (
actions_len > 2 * DP_MAX_PORTS * nla_total_size(4)
)
return ERR_PTR(-EINVAL);
return ERR_PTR(-EINVAL);
- sfa = kmalloc(sizeof *sfa + n_actions * sizeof(union odp_action),
- GFP_KERNEL);
+ sfa = kmalloc(sizeof(*sfa) + actions_len, GFP_KERNEL);
if (!sfa)
return ERR_PTR(-ENOMEM);
if (!sfa)
return ERR_PTR(-ENOMEM);
- sfa->
n_actions = n_actions
;
+ sfa->
actions_len = actions_len
;
return sfa;
}
return sfa;
}
@@
-173,7
+173,7
@@
void flow_put(struct sw_flow *flow)
return;
if (atomic_dec_and_test(&flow->refcnt)) {
return;
if (atomic_dec_and_test(&flow->refcnt)) {
- kfree(flow->sf_acts);
+ kfree(
(struct sf_flow_acts __force *)
flow->sf_acts);
kmem_cache_free(flow_cache, flow);
}
}
kmem_cache_free(flow_cache, flow);
}
}
@@
-216,7
+216,7
@@
static __be16 parse_ethertype(struct sk_buff *skb)
u8 ssap; /* Always 0xAA */
u8 ctrl;
u8 oui[3];
u8 ssap; /* Always 0xAA */
u8 ctrl;
u8 oui[3];
-
u
16 ethertype;
+
__be
16 ethertype;
};
struct llc_snap_hdr *llc;
__be16 proto;
};
struct llc_snap_hdr *llc;
__be16 proto;
@@
-270,7
+270,7
@@
int flow_extract(struct sk_buff *skb, u16 in_port, struct odp_flow_key *key,
{
struct ethhdr *eth;
{
struct ethhdr *eth;
- memset(key, 0, sizeof
*key
);
+ memset(key, 0, sizeof
(*key)
);
key->tun_id = OVS_CB(skb)->tun_id;
key->in_port = in_port;
*is_frag = false;
key->tun_id = OVS_CB(skb)->tun_id;
key->in_port = in_port;
*is_frag = false;
@@
-331,7
+331,8
@@
int flow_extract(struct sk_buff *skb, u16 in_port, struct odp_flow_key *key,
key->nw_proto = nh->protocol;
/* Transport layer. */
key->nw_proto = nh->protocol;
/* Transport layer. */
- if (!(nh->frag_off & htons(IP_MF | IP_OFFSET))) {
+ if (!(nh->frag_off & htons(IP_MF | IP_OFFSET)) &&
+ !(skb_shinfo(skb)->gso_type & SKB_GSO_UDP)) {
if (key->nw_proto == IPPROTO_TCP) {
if (tcphdr_ok(skb)) {
struct tcphdr *tcp = tcp_hdr(skb);
if (key->nw_proto == IPPROTO_TCP) {
if (tcphdr_ok(skb)) {
struct tcphdr *tcp = tcp_hdr(skb);
@@
-383,7
+384,7
@@
int flow_extract(struct sk_buff *skb, u16 in_port, struct odp_flow_key *key,
u32 flow_hash(const struct odp_flow_key *key)
{
u32 flow_hash(const struct odp_flow_key *key)
{
- return jhash2((u32*)key, sizeof
*key
/ sizeof(u32), hash_seed);
+ return jhash2((u32*)key, sizeof
(*key)
/ sizeof(u32), hash_seed);
}
int flow_cmp(const struct tbl_node *node, void *key2_)
}
int flow_cmp(const struct tbl_node *node, void *key2_)
@@
-403,7
+404,7
@@
int flow_init(void)
if (flow_cache == NULL)
return -ENOMEM;
if (flow_cache == NULL)
return -ENOMEM;
- get_random_bytes(&hash_seed, sizeof
hash_seed
);
+ get_random_bytes(&hash_seed, sizeof
(hash_seed)
);
return 0;
}
return 0;
}