mirror of
https://github.com/fail0verflow/switch-linux.git
synced 2025-05-04 02:34:21 -04:00
openvswitch: Refactor ovs_nla_fill_match().
Refactor the ovs_nla_fill_match() function into separate netlink serialization functions ovs_nla_put_{unmasked_key,mask}(). Modify ovs_nla_put_flow() to handle attribute nesting and expose the 'is_mask' parameter - all callers need to nest the flow, and callers have better knowledge about whether it is serializing a mask or not. Signed-off-by: Joe Stringer <joestringer@nicira.com> Acked-by: Pravin B Shelar <pshelar@nicira.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
707d79e5cd
commit
5b4237bbc9
3 changed files with 46 additions and 40 deletions
|
@ -461,10 +461,8 @@ static int queue_userspace_packet(struct datapath *dp, struct sk_buff *skb,
|
||||||
0, upcall_info->cmd);
|
0, upcall_info->cmd);
|
||||||
upcall->dp_ifindex = dp_ifindex;
|
upcall->dp_ifindex = dp_ifindex;
|
||||||
|
|
||||||
nla = nla_nest_start(user_skb, OVS_PACKET_ATTR_KEY);
|
err = ovs_nla_put_key(key, key, OVS_PACKET_ATTR_KEY, false, user_skb);
|
||||||
err = ovs_nla_put_flow(key, key, user_skb);
|
|
||||||
BUG_ON(err);
|
BUG_ON(err);
|
||||||
nla_nest_end(user_skb, nla);
|
|
||||||
|
|
||||||
if (upcall_info->userdata)
|
if (upcall_info->userdata)
|
||||||
__nla_put(user_skb, OVS_PACKET_ATTR_USERDATA,
|
__nla_put(user_skb, OVS_PACKET_ATTR_USERDATA,
|
||||||
|
@ -675,37 +673,6 @@ static size_t ovs_flow_cmd_msg_size(const struct sw_flow_actions *acts)
|
||||||
+ nla_total_size(acts->actions_len); /* OVS_FLOW_ATTR_ACTIONS */
|
+ nla_total_size(acts->actions_len); /* OVS_FLOW_ATTR_ACTIONS */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called with ovs_mutex or RCU read lock. */
|
|
||||||
static int ovs_flow_cmd_fill_match(const struct sw_flow *flow,
|
|
||||||
struct sk_buff *skb)
|
|
||||||
{
|
|
||||||
struct nlattr *nla;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
/* Fill flow key. */
|
|
||||||
nla = nla_nest_start(skb, OVS_FLOW_ATTR_KEY);
|
|
||||||
if (!nla)
|
|
||||||
return -EMSGSIZE;
|
|
||||||
|
|
||||||
err = ovs_nla_put_flow(&flow->unmasked_key, &flow->unmasked_key, skb);
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
|
|
||||||
nla_nest_end(skb, nla);
|
|
||||||
|
|
||||||
/* Fill flow mask. */
|
|
||||||
nla = nla_nest_start(skb, OVS_FLOW_ATTR_MASK);
|
|
||||||
if (!nla)
|
|
||||||
return -EMSGSIZE;
|
|
||||||
|
|
||||||
err = ovs_nla_put_flow(&flow->key, &flow->mask->key, skb);
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
|
|
||||||
nla_nest_end(skb, nla);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Called with ovs_mutex or RCU read lock. */
|
/* Called with ovs_mutex or RCU read lock. */
|
||||||
static int ovs_flow_cmd_fill_stats(const struct sw_flow *flow,
|
static int ovs_flow_cmd_fill_stats(const struct sw_flow *flow,
|
||||||
struct sk_buff *skb)
|
struct sk_buff *skb)
|
||||||
|
@ -787,7 +754,11 @@ static int ovs_flow_cmd_fill_info(const struct sw_flow *flow, int dp_ifindex,
|
||||||
|
|
||||||
ovs_header->dp_ifindex = dp_ifindex;
|
ovs_header->dp_ifindex = dp_ifindex;
|
||||||
|
|
||||||
err = ovs_flow_cmd_fill_match(flow, skb);
|
err = ovs_nla_put_unmasked_key(flow, skb);
|
||||||
|
if (err)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
err = ovs_nla_put_mask(flow, skb);
|
||||||
if (err)
|
if (err)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
|
|
@ -1216,12 +1216,12 @@ int ovs_nla_get_flow_metadata(const struct nlattr *attr,
|
||||||
return metadata_from_nlattrs(&match, &attrs, a, false, log);
|
return metadata_from_nlattrs(&match, &attrs, a, false, log);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ovs_nla_put_flow(const struct sw_flow_key *swkey,
|
static int __ovs_nla_put_key(const struct sw_flow_key *swkey,
|
||||||
const struct sw_flow_key *output, struct sk_buff *skb)
|
const struct sw_flow_key *output, bool is_mask,
|
||||||
|
struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
struct ovs_key_ethernet *eth_key;
|
struct ovs_key_ethernet *eth_key;
|
||||||
struct nlattr *nla, *encap;
|
struct nlattr *nla, *encap;
|
||||||
bool is_mask = (swkey != output);
|
|
||||||
|
|
||||||
if (nla_put_u32(skb, OVS_KEY_ATTR_RECIRC_ID, output->recirc_id))
|
if (nla_put_u32(skb, OVS_KEY_ATTR_RECIRC_ID, output->recirc_id))
|
||||||
goto nla_put_failure;
|
goto nla_put_failure;
|
||||||
|
@ -1431,6 +1431,38 @@ nla_put_failure:
|
||||||
return -EMSGSIZE;
|
return -EMSGSIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ovs_nla_put_key(const struct sw_flow_key *swkey,
|
||||||
|
const struct sw_flow_key *output, int attr, bool is_mask,
|
||||||
|
struct sk_buff *skb)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
struct nlattr *nla;
|
||||||
|
|
||||||
|
nla = nla_nest_start(skb, attr);
|
||||||
|
if (!nla)
|
||||||
|
return -EMSGSIZE;
|
||||||
|
err = __ovs_nla_put_key(swkey, output, is_mask, skb);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
nla_nest_end(skb, nla);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Called with ovs_mutex or RCU read lock. */
|
||||||
|
int ovs_nla_put_unmasked_key(const struct sw_flow *flow, struct sk_buff *skb)
|
||||||
|
{
|
||||||
|
return ovs_nla_put_key(&flow->unmasked_key, &flow->unmasked_key,
|
||||||
|
OVS_FLOW_ATTR_KEY, false, skb);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Called with ovs_mutex or RCU read lock. */
|
||||||
|
int ovs_nla_put_mask(const struct sw_flow *flow, struct sk_buff *skb)
|
||||||
|
{
|
||||||
|
return ovs_nla_put_key(&flow->key, &flow->mask->key,
|
||||||
|
OVS_FLOW_ATTR_MASK, true, skb);
|
||||||
|
}
|
||||||
|
|
||||||
#define MAX_ACTIONS_BUFSIZE (32 * 1024)
|
#define MAX_ACTIONS_BUFSIZE (32 * 1024)
|
||||||
|
|
||||||
static struct sw_flow_actions *nla_alloc_flow_actions(int size, bool log)
|
static struct sw_flow_actions *nla_alloc_flow_actions(int size, bool log)
|
||||||
|
|
|
@ -43,11 +43,14 @@ size_t ovs_key_attr_size(void);
|
||||||
void ovs_match_init(struct sw_flow_match *match,
|
void ovs_match_init(struct sw_flow_match *match,
|
||||||
struct sw_flow_key *key, struct sw_flow_mask *mask);
|
struct sw_flow_key *key, struct sw_flow_mask *mask);
|
||||||
|
|
||||||
int ovs_nla_put_flow(const struct sw_flow_key *,
|
int ovs_nla_put_key(const struct sw_flow_key *, const struct sw_flow_key *,
|
||||||
const struct sw_flow_key *, struct sk_buff *);
|
int attr, bool is_mask, struct sk_buff *);
|
||||||
int ovs_nla_get_flow_metadata(const struct nlattr *, struct sw_flow_key *,
|
int ovs_nla_get_flow_metadata(const struct nlattr *, struct sw_flow_key *,
|
||||||
bool log);
|
bool log);
|
||||||
|
|
||||||
|
int ovs_nla_put_unmasked_key(const struct sw_flow *flow, struct sk_buff *skb);
|
||||||
|
int ovs_nla_put_mask(const struct sw_flow *flow, struct sk_buff *skb);
|
||||||
|
|
||||||
int ovs_nla_get_match(struct sw_flow_match *, const struct nlattr *key,
|
int ovs_nla_get_match(struct sw_flow_match *, const struct nlattr *key,
|
||||||
const struct nlattr *mask, bool log);
|
const struct nlattr *mask, bool log);
|
||||||
int ovs_nla_put_egress_tunnel_key(struct sk_buff *,
|
int ovs_nla_put_egress_tunnel_key(struct sk_buff *,
|
||||||
|
|
Loading…
Add table
Reference in a new issue