/* Allocate table. */
err = -ENOMEM;
- rcu_assign_pointer(dp->table, tbl_create(0));
+ rcu_assign_pointer(dp->table, tbl_create(TBL_MIN_BUCKETS));
if (!dp->table)
goto err_free_dp;
struct tbl *old_table = get_table_protected(dp);
struct tbl *new_table;
- new_table = tbl_create(0);
+ new_table = tbl_create(TBL_MIN_BUCKETS);
if (!new_table)
return -ENOMEM;
error = -EFAULT;
if (copy_from_user(actions->actions,
- (struct nlattr __user *)flow->actions,
+ (struct nlattr __user __force *)flow->actions,
flow->actions_len))
goto error_free_actions;
error = validate_actions(actions->actions, actions->actions_len);
struct sw_flow *flow;
struct tbl *table;
int error;
+ u32 hash;
+ hash = flow_hash(&uf->flow.key);
table = get_table_protected(dp);
- flow_node = tbl_lookup(table, &uf->flow.key, flow_hash(&uf->flow.key), flow_cmp);
+ flow_node = tbl_lookup(table, &uf->flow.key, hash, flow_cmp);
if (!flow_node) {
/* No such flow. */
struct sw_flow_actions *acts;
rcu_assign_pointer(flow->sf_acts, acts);
/* Put flow in bucket. */
- error = tbl_insert(table, &flow->tbl_node, flow_hash(&flow->key));
+ error = tbl_insert(table, &flow->tbl_node, hash);
if (error)
goto error_free_flow_acts;
u32 i;
for (i = 0; i < flowvec->n_flows; i++) {
- struct odp_flow __user *ufp = (struct odp_flow __user *)&flowvec->flows[i];
+ struct odp_flow __user *ufp = (struct odp_flow __user __force *)&flowvec->flows[i];
struct odp_flow uf;
struct tbl_node *flow_node;
int error;
return 0;
cbdata.dp = dp;
- cbdata.uflows = (struct odp_flow __user *)flowvec->flows;
+ cbdata.uflows = (struct odp_flow __user __force*)flowvec->flows;
cbdata.n_flows = flowvec->n_flows;
cbdata.listed_flows = 0;
err = -EFAULT;
if (copy_from_user(actions->actions,
- (struct nlattr __user *)execute->actions, execute->actions_len))
+ (struct nlattr __user __force *)execute->actions, execute->actions_len))
goto error_free_actions;
err = validate_actions(actions->actions, execute->actions_len);
err = -EFAULT;
if (copy_from_user(skb_put(skb, execute->length),
- (const void __user *)execute->data,
+ (const void __user __force *)execute->data,
execute->length))
goto error_free_skb;
rcu_read_lock();
strncpy(op.devname, vport_get_name(p), sizeof op.devname);
strncpy(op.type, vport_get_type(p), sizeof op.type);
+ vport_get_config(p, op.config);
rcu_read_unlock();
op.port = p->port_no;
if (copy_from_user(&pv, upv, sizeof pv))
return -EFAULT;
- retval = do_list_ports(dp, (struct odp_port __user *)pv.ports,
+ retval = do_list_ports(dp, (struct odp_port __user __force *)pv.ports,
pv.n_ports);
if (retval < 0)
return retval;
u16 csum_start, csum_offset;
get_skb_csum_pointers(skb, &csum_start, &csum_offset);
+ csum_start -= skb_headroom(skb);
+
BUG_ON(csum_start >= skb_headlen(skb));
retval = skb_copy_and_csum_datagram(skb, csum_start, buf + csum_start,
copy_bytes - csum_start, &csum);