X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=datapath%2Fdatapath.c;h=2a8fb503f443592e61bfd14398b4554e124842f4;hb=d161c099279e9ab564636c72423268e6da69f795;hp=1ae1d771a31a5a3f2128ee75f474cf9e2c645f1d;hpb=3f355f47f8e7343e909ccfa854454d667baf3c38;p=openvswitch diff --git a/datapath/datapath.c b/datapath/datapath.c index 1ae1d771..2a8fb503 100644 --- a/datapath/datapath.c +++ b/datapath/datapath.c @@ -232,7 +232,7 @@ static int create_dp(int dp_idx, const char __user *devnamep) if (!dp->table) goto err_free_dp; - /* Setup our datapath device */ + /* Set up our datapath device. */ dp_dev = dp_dev_create(dp, devname, ODPP_LOCAL); err = PTR_ERR(dp_dev); if (IS_ERR(dp_dev)) @@ -574,7 +574,7 @@ static int dp_frame_hook(struct net_bridge_port *p, struct sk_buff **pskb) #error #endif -#if defined(CONFIG_XEN) && LINUX_VERSION_CODE == KERNEL_VERSION(2,6,18) +#if defined(CONFIG_XEN) && defined(HAVE_PROTO_DATA_VALID) /* This code is copied verbatim from net/dev/core.c in Xen's * linux-2.6.18-92.1.10.el5.xs5.0.0.394.644. We can't call those functions * directly because they aren't exported. */ @@ -975,13 +975,18 @@ static int put_actions(const struct sw_flow *flow, struct odp_flow __user *ufp) return 0; } -static int answer_query(struct sw_flow *flow, struct odp_flow __user *ufp) +static int answer_query(struct sw_flow *flow, u32 query_flags, + struct odp_flow __user *ufp) { struct odp_flow_stats stats; unsigned long int flags; spin_lock_irqsave(&flow->lock, flags); get_stats(flow, &stats); + + if (query_flags & ODPFF_ZERO_TCP_FLAGS) { + flow->tcp_flags = 0; + } spin_unlock_irqrestore(&flow->lock, flags); if (__copy_to_user(&ufp->stats, &stats, sizeof(struct odp_flow_stats))) @@ -1016,7 +1021,7 @@ static int del_flow(struct datapath *dp, struct odp_flow __user *ufp) * we get completely accurate stats, but that blows our performance, * badly. */ dp->n_flows--; - error = answer_query(flow, ufp); + error = answer_query(flow, 0, ufp); flow_deferred_free(flow); error: @@ -1041,7 +1046,7 @@ static int query_flows(struct datapath *dp, const struct odp_flowvec *flowvec) if (!flow) error = __put_user(ENOENT, &ufp->stats.error); else - error = answer_query(flow, ufp); + error = answer_query(flow, uf.flags, ufp); if (error) return -EFAULT; } @@ -1062,7 +1067,7 @@ static int list_flow(struct sw_flow *flow, void *cbdata_) if (__copy_to_user(&ufp->key, &flow->key, sizeof flow->key)) return -EFAULT; - error = answer_query(flow, ufp); + error = answer_query(flow, 0, ufp); if (error) return error; @@ -1162,9 +1167,9 @@ static int do_execute(struct datapath *dp, const struct odp_execute *executep) skb_reset_mac_header(skb); eth = eth_hdr(skb); - /* Normally, setting the skb 'protocol' field would be handled by a - * call to eth_type_trans(), but it assumes there's a sending - * device, which we may not have. */ + /* Normally, setting the skb 'protocol' field would be handled by a + * call to eth_type_trans(), but it assumes there's a sending + * device, which we may not have. */ if (ntohs(eth->h_proto) >= 1536) skb->protocol = eth->h_proto; else