On Sun, Aug 17, 2014 at 7:43 PM, Pravin Shelar <pshe...@nicira.com> wrote:
> On Fri, Aug 15, 2014 at 3:12 AM, Andy Zhou <az...@nicira.com> wrote:
>> Future pathces will make use of those functions.
>>
>> Signed-off-by: Andy Zhou <az...@nicira.com>
>> ---
>> datapath/Modules.mk | 1 +
>> datapath/actions.c | 27 ++++++++++++++++
>> datapath/actions.h | 90
>> +++++++++++++++++++++++++++++++++++++++++++++++++++++
>> datapath/datapath.c | 4 +++
>> datapath/datapath.h | 2 +-
>> 5 files changed, 123 insertions(+), 1 deletion(-)
>> create mode 100644 datapath/actions.h
>>
>> diff --git a/datapath/Modules.mk b/datapath/Modules.mk
>> index 90e158c..2e74f6e 100644
>> --- a/datapath/Modules.mk
>> +++ b/datapath/Modules.mk
>> @@ -23,6 +23,7 @@ openvswitch_sources = \
>>
>> openvswitch_headers = \
>> compat.h \
>> + actions.h \
>> datapath.h \
>> flow.h \
>> flow_netlink.h \
>> diff --git a/datapath/actions.c b/datapath/actions.c
>> index bccf397..9dd9063 100644
>> --- a/datapath/actions.c
>> +++ b/datapath/actions.c
>> @@ -39,6 +39,9 @@
>> #include "mpls.h"
>> #include "vlan.h"
>> #include "vport.h"
>> +#include "actions.h"
>> +
>> +static DEFINE_PER_CPU(struct ovs_action_stack, ovs_action_stacks);
>>
>> static void flow_key_clone(struct sk_buff *skb, struct sw_flow_key *new_key)
>> {
>> @@ -949,3 +952,27 @@ out_loop:
>>
>> return error;
>> }
>> +
>> +void ovs_action_stacks_init(void)
>> +{
>> + int i;
>> +
>> + for_each_possible_cpu(i) {
>> + struct ovs_action_stack *stack;
>> +
>> + stack = &per_cpu(ovs_action_stacks, i);
>> + ovs_action_stack_init(stack);
>> + }
>> +}
>> +
>> +void ovs_action_stacks_exit(void)
>> +{
>> + int i;
>> +
>> + for_each_possible_cpu(i) {
>> + struct ovs_action_stack *stack;
>> +
>> + stack = &per_cpu(ovs_action_stacks, i);
>> + BUG_ON(stack->top != 0);
>> + }
>> +}
>> diff --git a/datapath/actions.h b/datapath/actions.h
>> new file mode 100644
>> index 0000000..e4601a6
>> --- /dev/null
>> +++ b/datapath/actions.h
>> @@ -0,0 +1,90 @@
>> +/* Copyright (c) 2007-2014 Nicira, Inc.
>> + *
>> + * This program is free software; you can redistribute it and/or
>> + * modify it under the terms of version 2 of the GNU General Public
>> + * License as published by the Free Software Foundation.
>> + *
>> + * This program is distributed in the hope that it will be useful, but
>> + * WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
>> + * General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with this program; if not, write to the Free Software
>> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
>> + * 02110-1301, USA
>> + */
>> +
>> +#ifndef ACTION_H
>> +#define ACTION_H 1
>> +
>> +#include <linux/kernel.h>
>> +#include <linux/mutex.h>
>> +#include <linux/netdevice.h>
>> +#include <linux/skbuff.h>
>> +
>> +#include "compat.h"
>> +#include "flow.h"
>> +#include "flow_table.h"
>> +#include "vlan.h"
>> +#include "vport.h"
>> +
>> +#define OVS_ACTION_STACK_LIMIT 10
>> +
>> +struct ovs_deferred_action {
>> + struct sk_buff *skb;
>> + struct nlattr *actions;
>> + int rem;
>> +
>> + /* Store pkt_key clone during recirc */
>> + struct sw_flow_key pkt_key;
>> +};
>> +
>> +struct ovs_action_stack {
>> + /* Deffered action stack */
>> + int top;
>> + struct ovs_deferred_action stack[OVS_ACTION_STACK_LIMIT];
>> +};
>> +
>> +void ovs_action_stacks_init(void);
>> +void ovs_action_stacks_exit(void);
>> +int ovs_execute_actions(struct datapath *dp, struct sk_buff *skb);
>> +void ovs_process_action_stack(void);
>> +
>> +static inline void ovs_action_stack_init(struct ovs_action_stack *stack)
>> +{
>> + stack->top = 0;
>> +}
>> +
>> +static inline struct ovs_deferred_action *
>> +ovs_action_stack_pop(struct ovs_action_stack *stack)
>> +{
>> + if (stack->top) {
>> + stack->top--;
>> + return &stack->stack[stack->top];
>> + }
>> +
>> + return NULL;
>> +}
>> +
>> +static inline struct ovs_deferred_action *
>> +ovs_action_stack_push(struct ovs_action_stack *stack,
>> + struct sk_buff *skb,
>> + struct nlattr *actions, int rem)
>> +{
>> + struct ovs_deferred_action *elem;
>> +
>> + if (stack->top >= OVS_ACTION_STACK_LIMIT - 1)
>> + return NULL;
>> +
>> + elem = &stack->stack[stack->top];
>> + elem->skb = skb;
>> + elem->actions = actions;
>> + elem->rem = rem;
>> +
>> + stack->top++;
>> +
>> + return elem;
>> +}
>> +
> Is there any need to expose stack API outside of action.c?
No, I will move them into action.c
>
>> +#endif /* actions.h */
>> diff --git a/datapath/datapath.c b/datapath/datapath.c
>> index e477c72..aa13817 100644
>> --- a/datapath/datapath.c
>> +++ b/datapath/datapath.c
>> @@ -61,6 +61,7 @@
>> #include "vlan.h"
>> #include "vport-internal_dev.h"
>> #include "vport-netdev.h"
>> +#include "actions.h"
>>
>> int ovs_net_id __read_mostly;
>>
>> @@ -2136,6 +2137,8 @@ static int __init dp_init(void)
>> if (err < 0)
>> goto error_unreg_notifier;
>>
>> + ovs_action_stacks_init();
>> +
>> return 0;
>>
>> error_unreg_notifier:
>> @@ -2158,6 +2161,7 @@ static void dp_cleanup(void)
>> rcu_barrier();
>> ovs_vport_exit();
>> ovs_flow_exit();
>> + ovs_action_stacks_exit();
>> }
>>
>> module_init(dp_init);
>> diff --git a/datapath/datapath.h b/datapath/datapath.h
>> index 4874ab5..73f4e14 100644
>> --- a/datapath/datapath.h
>> +++ b/datapath/datapath.h
>> @@ -31,6 +31,7 @@
>> #include "flow_table.h"
>> #include "vlan.h"
>> #include "vport.h"
>> +#include "actions.h"
>>
>> #define DP_MAX_PORTS USHRT_MAX
>> #define DP_VPORT_HASH_BUCKETS 1024
>> @@ -197,7 +198,6 @@ const char *ovs_dp_name(const struct datapath *dp);
>> struct sk_buff *ovs_vport_cmd_build_info(struct vport *, u32 portid, u32
>> seq,
>> u8 cmd);
>>
>> -int ovs_execute_actions(struct datapath *dp, struct sk_buff *skb);
>> void ovs_dp_notify_wq(struct work_struct *work);
>>
>> #define OVS_NLERR(fmt, ...) \
>> --
>> 1.9.1
>>
>> _______________________________________________
>> dev mailing list
>> dev@openvswitch.org
>> http://openvswitch.org/mailman/listinfo/dev
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev