X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=datapath%2Fflow.c;h=0f73c66c168ac07fadc22019fd776709f8ad887f;hb=3517d8bf8053d20d90d471d6f462fea5cd39bca0;hp=5cf0d54a7839860519c9f7337e1890f220c8db95;hpb=8dda8c9b63c8803621f900beaa397c673b736197;p=openvswitch diff --git a/datapath/flow.c b/datapath/flow.c index 5cf0d54a..0f73c66c 100644 --- a/datapath/flow.c +++ b/datapath/flow.c @@ -1,6 +1,6 @@ /* * 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. @@ -29,8 +29,6 @@ #include #include -#include "compat.h" - 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); - sfa = kmalloc(sizeof *sfa + actions_len, GFP_KERNEL); + sfa = kmalloc(sizeof(*sfa) + actions_len, GFP_KERNEL); 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)) { - kfree(flow->sf_acts); + kfree((struct sf_flow_acts __force *)flow->sf_acts); kmem_cache_free(flow_cache, flow); } } @@ -272,7 +270,7 @@ int flow_extract(struct sk_buff *skb, u16 in_port, struct odp_flow_key *key, { 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; @@ -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. */ - 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); @@ -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) { - 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_) @@ -405,7 +404,7 @@ int flow_init(void) if (flow_cache == NULL) return -ENOMEM; - get_random_bytes(&hash_seed, sizeof hash_seed); + get_random_bytes(&hash_seed, sizeof(hash_seed)); return 0; }