mirror of
https://github.com/openvswitch/ovs
synced 2025-10-13 14:07:02 +00:00
Datapath action should not refer to controller
ODP_ACTION_ATTR_CONTROLLER in the kernel actually sends packets to userspace, not the controller. To make it generic rename this action to ODP_ACTION_ATTR_USERSPACE. Signed-off-by: Pravin B Shelar <pshelar@nicira.com>
This commit is contained in:
1
AUTHORS
1
AUTHORS
@@ -24,6 +24,7 @@ Martin Casado casado@nicira.com
|
||||
Natasha Gude natasha@nicira.com
|
||||
Neil McKee neil.mckee@inmon.com
|
||||
Paul Fazzone pfazzone@nicira.com
|
||||
Pravin B Shelar pshelar@nicira.com
|
||||
Reid Price reid@nicira.com
|
||||
Romain Lenglet romain.lenglet@berabera.info
|
||||
Sajjad Lateef slateef@nicira.com
|
||||
|
@@ -218,7 +218,7 @@ error:
|
||||
kfree_skb(skb);
|
||||
}
|
||||
|
||||
static int output_control(struct datapath *dp, struct sk_buff *skb, u64 arg)
|
||||
static int output_userspace(struct datapath *dp, struct sk_buff *skb, u64 arg)
|
||||
{
|
||||
struct dp_upcall_info upcall;
|
||||
|
||||
@@ -262,8 +262,8 @@ static int do_execute_actions(struct datapath *dp, struct sk_buff *skb,
|
||||
prev_port = nla_get_u32(a);
|
||||
break;
|
||||
|
||||
case ODP_ACTION_ATTR_CONTROLLER:
|
||||
err = output_control(dp, skb, nla_get_u64(a));
|
||||
case ODP_ACTION_ATTR_USERSPACE:
|
||||
err = output_userspace(dp, skb, nla_get_u64(a));
|
||||
break;
|
||||
|
||||
case ODP_ACTION_ATTR_SET_TUNNEL:
|
||||
|
@@ -84,7 +84,7 @@ EXPORT_SYMBOL(dp_ioctl_hook);
|
||||
static LIST_HEAD(dps);
|
||||
|
||||
static struct vport *new_vport(const struct vport_parms *);
|
||||
static int queue_control_packets(struct datapath *, struct sk_buff *,
|
||||
static int queue_userspace_packets(struct datapath *, struct sk_buff *,
|
||||
const struct dp_upcall_info *);
|
||||
|
||||
/* Must be called with rcu_read_lock, genl_mutex, or RTNL lock. */
|
||||
@@ -415,7 +415,7 @@ int dp_upcall(struct datapath *dp, struct sk_buff *skb, const struct dp_upcall_i
|
||||
skb = nskb;
|
||||
}
|
||||
|
||||
err = queue_control_packets(dp, skb, upcall_info);
|
||||
err = queue_userspace_packets(dp, skb, upcall_info);
|
||||
if (err)
|
||||
goto err;
|
||||
|
||||
@@ -438,7 +438,7 @@ err:
|
||||
* 'upcall_info'. There will be only one packet unless we broke up a GSO
|
||||
* packet.
|
||||
*/
|
||||
static int queue_control_packets(struct datapath *dp, struct sk_buff *skb,
|
||||
static int queue_userspace_packets(struct datapath *dp, struct sk_buff *skb,
|
||||
const struct dp_upcall_info *upcall_info)
|
||||
{
|
||||
u32 group = packet_mc_group(dp, upcall_info->cmd);
|
||||
@@ -552,7 +552,7 @@ static int validate_actions(const struct nlattr *attr)
|
||||
nla_for_each_nested(a, attr, rem) {
|
||||
static const u32 action_lens[ODP_ACTION_ATTR_MAX + 1] = {
|
||||
[ODP_ACTION_ATTR_OUTPUT] = 4,
|
||||
[ODP_ACTION_ATTR_CONTROLLER] = 8,
|
||||
[ODP_ACTION_ATTR_USERSPACE] = 8,
|
||||
[ODP_ACTION_ATTR_SET_DL_TCI] = 2,
|
||||
[ODP_ACTION_ATTR_STRIP_VLAN] = 0,
|
||||
[ODP_ACTION_ATTR_SET_DL_SRC] = ETH_ALEN,
|
||||
@@ -575,7 +575,7 @@ static int validate_actions(const struct nlattr *attr)
|
||||
case ODP_ACTION_ATTR_UNSPEC:
|
||||
return -EINVAL;
|
||||
|
||||
case ODP_ACTION_ATTR_CONTROLLER:
|
||||
case ODP_ACTION_ATTR_USERSPACE:
|
||||
case ODP_ACTION_ATTR_STRIP_VLAN:
|
||||
case ODP_ACTION_ATTR_SET_DL_SRC:
|
||||
case ODP_ACTION_ATTR_SET_DL_DST:
|
||||
|
@@ -145,7 +145,7 @@ enum odp_packet_cmd {
|
||||
|
||||
/* Kernel-to-user notifications. */
|
||||
ODP_PACKET_CMD_MISS, /* Flow table miss. */
|
||||
ODP_PACKET_CMD_ACTION, /* ODP_ACTION_ATTR_CONTROLLER action. */
|
||||
ODP_PACKET_CMD_ACTION, /* ODP_ACTION_ATTR_USERSPACE action. */
|
||||
ODP_PACKET_CMD_SAMPLE, /* Sampled packet. */
|
||||
|
||||
/* User commands. */
|
||||
@@ -157,14 +157,14 @@ enum odp_packet_cmd {
|
||||
* @ODP_PACKET_ATTR_PACKET: Present for all notifications. Contains the entire
|
||||
* packet as received, from the start of the Ethernet header onward. For
|
||||
* %ODP_PACKET_CMD_ACTION, %ODP_PACKET_ATTR_PACKET reflects changes made by
|
||||
* actions preceding %ODP_ACTION_ATTR_CONTROLLER, but %ODP_PACKET_ATTR_KEY is
|
||||
* actions preceding %ODP_ACTION_ATTR_USERSPACE, but %ODP_PACKET_ATTR_KEY is
|
||||
* the flow key extracted from the packet as originally received.
|
||||
* @ODP_PACKET_ATTR_KEY: Present for all notifications. Contains the flow key
|
||||
* extracted from the packet as nested %ODP_KEY_ATTR_* attributes. This allows
|
||||
* userspace to adapt its flow setup strategy by comparing its notion of the
|
||||
* flow key against the kernel's.
|
||||
* @ODP_PACKET_ATTR_USERDATA: Present for an %ODP_PACKET_CMD_ACTION
|
||||
* notification if the %ODP_ACTION_ATTR_CONTROLLER, action's argument was
|
||||
* notification if the %ODP_ACTION_ATTR_USERSPACE, action's argument was
|
||||
* nonzero.
|
||||
* @ODP_PACKET_ATTR_SAMPLE_POOL: Present for %ODP_PACKET_CMD_SAMPLE. Contains
|
||||
* the number of packets processed so far that were candidates for sampling.
|
||||
@@ -179,7 +179,7 @@ enum odp_packet_attr {
|
||||
ODP_PACKET_ATTR_UNSPEC,
|
||||
ODP_PACKET_ATTR_PACKET, /* Packet data. */
|
||||
ODP_PACKET_ATTR_KEY, /* Nested ODP_KEY_ATTR_* attributes. */
|
||||
ODP_PACKET_ATTR_USERDATA, /* u64 ODP_ACTION_ATTR_CONTROLLER arg. */
|
||||
ODP_PACKET_ATTR_USERDATA, /* u64 ODP_ACTION_ATTR_USERSPACE arg. */
|
||||
ODP_PACKET_ATTR_SAMPLE_POOL, /* # sampling candidate packets so far. */
|
||||
ODP_PACKET_ATTR_ACTIONS, /* Nested ODP_ACTION_ATTR_* attributes. */
|
||||
__ODP_PACKET_ATTR_MAX
|
||||
@@ -409,7 +409,7 @@ enum odp_flow_attr {
|
||||
enum odp_action_type {
|
||||
ODP_ACTION_ATTR_UNSPEC,
|
||||
ODP_ACTION_ATTR_OUTPUT, /* Output to switch port. */
|
||||
ODP_ACTION_ATTR_CONTROLLER, /* Send copy to controller. */
|
||||
ODP_ACTION_ATTR_USERSPACE, /* Send copy to userspace. */
|
||||
ODP_ACTION_ATTR_SET_DL_TCI, /* Set the 802.1q TCI value. */
|
||||
ODP_ACTION_ATTR_STRIP_VLAN, /* Strip the 802.1q header. */
|
||||
ODP_ACTION_ATTR_SET_DL_SRC, /* Ethernet source address. */
|
||||
|
@@ -146,7 +146,7 @@ static int do_add_port(struct dp_netdev *, const char *devname,
|
||||
static int do_del_port(struct dp_netdev *, uint16_t port_no);
|
||||
static int dpif_netdev_open(const struct dpif_class *, const char *name,
|
||||
bool create, struct dpif **);
|
||||
static int dp_netdev_output_control(struct dp_netdev *, const struct ofpbuf *,
|
||||
static int dp_netdev_output_userspace(struct dp_netdev *, const struct ofpbuf *,
|
||||
int queue_no, const struct flow *,
|
||||
uint64_t arg);
|
||||
static int dp_netdev_execute_actions(struct dp_netdev *,
|
||||
@@ -707,7 +707,7 @@ dpif_netdev_validate_actions(const struct nlattr *actions,
|
||||
}
|
||||
break;
|
||||
|
||||
case ODP_ACTION_ATTR_CONTROLLER:
|
||||
case ODP_ACTION_ATTR_USERSPACE:
|
||||
break;
|
||||
|
||||
case ODP_ACTION_ATTR_SET_DL_TCI:
|
||||
@@ -1088,7 +1088,7 @@ dp_netdev_port_input(struct dp_netdev *dp, struct dp_netdev_port *port,
|
||||
dp->n_hit++;
|
||||
} else {
|
||||
dp->n_missed++;
|
||||
dp_netdev_output_control(dp, packet, DPIF_UC_MISS, &key, 0);
|
||||
dp_netdev_output_userspace(dp, packet, DPIF_UC_MISS, &key, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1252,7 +1252,7 @@ dp_netdev_output_port(struct dp_netdev *dp, struct ofpbuf *packet,
|
||||
}
|
||||
|
||||
static int
|
||||
dp_netdev_output_control(struct dp_netdev *dp, const struct ofpbuf *packet,
|
||||
dp_netdev_output_userspace(struct dp_netdev *dp, const struct ofpbuf *packet,
|
||||
int queue_no, const struct flow *flow, uint64_t arg)
|
||||
{
|
||||
struct dp_netdev_queue *q = &dp->queues[queue_no];
|
||||
@@ -1299,8 +1299,8 @@ dp_netdev_execute_actions(struct dp_netdev *dp,
|
||||
dp_netdev_output_port(dp, packet, nl_attr_get_u32(a));
|
||||
break;
|
||||
|
||||
case ODP_ACTION_ATTR_CONTROLLER:
|
||||
dp_netdev_output_control(dp, packet, DPIF_UC_ACTION,
|
||||
case ODP_ACTION_ATTR_USERSPACE:
|
||||
dp_netdev_output_userspace(dp, packet, DPIF_UC_ACTION,
|
||||
key, nl_attr_get_u64(a));
|
||||
break;
|
||||
|
||||
|
@@ -155,7 +155,7 @@ int dpif_execute(struct dpif *,
|
||||
|
||||
enum dpif_upcall_type {
|
||||
DPIF_UC_MISS, /* Miss in flow table. */
|
||||
DPIF_UC_ACTION, /* ODP_ACTION_ATTR_CONTROLLER action. */
|
||||
DPIF_UC_ACTION, /* ODP_ACTION_ATTR_USERSPACE action. */
|
||||
DPIF_UC_SAMPLE, /* Packet sampling. */
|
||||
DPIF_N_UC_TYPES
|
||||
};
|
||||
@@ -177,7 +177,7 @@ struct dpif_upcall {
|
||||
size_t key_len; /* Length of 'key' in bytes. */
|
||||
|
||||
/* DPIF_UC_ACTION only. */
|
||||
uint64_t userdata; /* Argument to ODP_ACTION_ATTR_CONTROLLER. */
|
||||
uint64_t userdata; /* Argument to ODP_ACTION_ATTR_USERSPACE. */
|
||||
|
||||
/* DPIF_UC_SAMPLE only. */
|
||||
uint32_t sample_pool; /* # of sampling candidate packets so far. */
|
||||
|
@@ -41,7 +41,7 @@ odp_action_len(uint16_t type)
|
||||
|
||||
switch ((enum odp_action_type) type) {
|
||||
case ODP_ACTION_ATTR_OUTPUT: return 4;
|
||||
case ODP_ACTION_ATTR_CONTROLLER: return 8;
|
||||
case ODP_ACTION_ATTR_USERSPACE: return 8;
|
||||
case ODP_ACTION_ATTR_SET_DL_TCI: return 2;
|
||||
case ODP_ACTION_ATTR_STRIP_VLAN: return 0;
|
||||
case ODP_ACTION_ATTR_SET_DL_SRC: return ETH_ADDR_LEN;
|
||||
@@ -99,8 +99,8 @@ format_odp_action(struct ds *ds, const struct nlattr *a)
|
||||
case ODP_ACTION_ATTR_OUTPUT:
|
||||
ds_put_format(ds, "%"PRIu16, nl_attr_get_u32(a));
|
||||
break;
|
||||
case ODP_ACTION_ATTR_CONTROLLER:
|
||||
ds_put_format(ds, "ctl(%"PRIu64")", nl_attr_get_u64(a));
|
||||
case ODP_ACTION_ATTR_USERSPACE:
|
||||
ds_put_format(ds, "userspace(%"PRIu64")", nl_attr_get_u64(a));
|
||||
break;
|
||||
case ODP_ACTION_ATTR_SET_TUNNEL:
|
||||
ds_put_format(ds, "set_tunnel(%#"PRIx64")",
|
||||
|
@@ -2047,7 +2047,7 @@ execute_odp_actions(struct ofproto_dpif *ofproto, const struct flow *flow,
|
||||
struct ofpbuf *packet)
|
||||
{
|
||||
if (actions_len == NLA_ALIGN(NLA_HDRLEN + sizeof(uint64_t))
|
||||
&& odp_actions->nla_type == ODP_ACTION_ATTR_CONTROLLER) {
|
||||
&& odp_actions->nla_type == ODP_ACTION_ATTR_USERSPACE) {
|
||||
/* As an optimization, avoid a round-trip from userspace to kernel to
|
||||
* userspace. This also avoids possibly filling up kernel packet
|
||||
* buffers along the way. */
|
||||
@@ -2956,7 +2956,7 @@ xlate_output_action__(struct action_xlate_ctx *ctx,
|
||||
break;
|
||||
case OFPP_CONTROLLER:
|
||||
commit_odp_actions(ctx);
|
||||
nl_msg_put_u64(ctx->odp_actions, ODP_ACTION_ATTR_CONTROLLER, max_len);
|
||||
nl_msg_put_u64(ctx->odp_actions, ODP_ACTION_ATTR_USERSPACE, max_len);
|
||||
break;
|
||||
case OFPP_LOCAL:
|
||||
add_output_action(ctx, OFPP_LOCAL);
|
||||
|
Reference in New Issue
Block a user