projects
/
openvswitch
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ofpbuf: New function ofpbuf_use_stack().
[openvswitch]
/
datapath
/
flow.c
diff --git
a/datapath/flow.c
b/datapath/flow.c
index 8a6ee23d3e833ce0a5761a321f291c670df116be..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,8
+29,6
@@
#include <net/inet_ecn.h>
#include <net/ip.h>
#include <net/inet_ecn.h>
#include <net/ip.h>
-#include "compat.h"
-
static struct kmem_cache *flow_cache;
static unsigned int hash_seed __read_mostly;
static struct kmem_cache *flow_cache;
static unsigned int hash_seed __read_mostly;
@@
-117,7
+115,7
@@
struct sw_flow_actions *flow_actions_alloc(u32 actions_len)
if (actions_len > 2 * DP_MAX_PORTS * nla_total_size(4))
return ERR_PTR(-EINVAL);
if (actions_len > 2 * DP_MAX_PORTS * nla_total_size(4))
return ERR_PTR(-EINVAL);
- sfa = kmalloc(sizeof
*sfa
+ actions_len, GFP_KERNEL);
+ sfa = kmalloc(sizeof
(*sfa)
+ actions_len, GFP_KERNEL);
if (!sfa)
return ERR_PTR(-ENOMEM);
if (!sfa)
return ERR_PTR(-ENOMEM);
@@
-175,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);
}
}
@@
-218,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;
@@
-272,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;
@@
-333,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);
@@
-385,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_)
@@
-405,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;
}