summaryrefslogtreecommitdiff
path: root/datapath-windows/ovsext/Recirc.h
blob: ee05763474f4eb52e625705481f0f3c651791144 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
 * Copyright (c) 2016 Cloudbase Solutions Srl
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef __RECIRC_H_
#define __RECIRC_H_ 1

#include "Actions.h"

#define DEFERRED_ACTION_QUEUE_SIZE          10
#define DEFERRED_ACTION_EXEC_LEVEL           4

typedef struct _OVS_DEFERRED_ACTION {
    PNET_BUFFER_LIST    nbl;
    PNL_ATTR            actions;
    OvsFlowKey          key;
} OVS_DEFERRED_ACTION, *POVS_DEFERRED_ACTION;

/*
 * --------------------------------------------------------------------------
 * '_OVS_DEFERRED_ACTION_QUEUE' structure is responsible for keeping track of
 * all deferred actions. The maximum number of deferred actions should not
 * exceed 'DEFERRED_ACTION_QUEUE_SIZE'.
 * --------------------------------------------------------------------------
 */
typedef struct _OVS_DEFERRED_ACTION_QUEUE {
    UINT32  head;
    UINT32  tail;
    OVS_DEFERRED_ACTION queue[DEFERRED_ACTION_QUEUE_SIZE];
} OVS_DEFERRED_ACTION_QUEUE, *POVS_DEFERRED_ACTION_QUEUE;

/*
 * --------------------------------------------------------------------------
 * OvsProcessDeferredActions --
 *     This function processes all deferred actions contained in the queue
 *     corresponding to the current CPU.
 * --------------------------------------------------------------------------
 */
NDIS_STATUS
OvsProcessDeferredActions(POVS_SWITCH_CONTEXT switchContext,
                          OvsCompletionList *completionList,
                          UINT32 portNo,
                          ULONG sendFlags,
                          OVS_PACKET_HDR_INFO *layers);

/*
 * --------------------------------------------------------------------------
 * OvsAddDeferredActions --
 *     This function adds the deferred action to the current CPU queue and
 *     returns the new queue entry if the queue is not already full.
 * --------------------------------------------------------------------------
 */
POVS_DEFERRED_ACTION
OvsAddDeferredActions(PNET_BUFFER_LIST packet,
                      OvsFlowKey *key,
                      const PNL_ATTR actions);

/*
 * --------------------------------------------------------------------------
 * OvsDeferredActionsQueueAlloc --
 *     The function allocates per-cpu deferred actions queue.
 * --------------------------------------------------------------------------
 */
BOOLEAN
OvsDeferredActionsQueueAlloc();

/*
 * --------------------------------------------------------------------------
 * OvsDeferredActionsQueueFree --
 *     The function frees per-cpu deferred actions queue.
 * --------------------------------------------------------------------------
 */
VOID
OvsDeferredActionsQueueFree();

/*
 * --------------------------------------------------------------------------
 * OvsDeferredActionsLevelAlloc --
 *     The function allocates per-cpu deferred actions execution level.
 * --------------------------------------------------------------------------
 */
BOOLEAN
OvsDeferredActionsLevelAlloc();

/*
 * --------------------------------------------------------------------------
 * OvsDeferredActionsLevelFree --
 *     The function frees per-cpu deferred actions execution level.
 * --------------------------------------------------------------------------
 */
VOID
OvsDeferredActionsLevelFree();

/*
 * --------------------------------------------------------------------------
 * OvsDeferredActionsLevelGet --
 *     The function returns the deferred action execution level corresponding
 *     to the current processor.
 * --------------------------------------------------------------------------
 */
UINT32
OvsDeferredActionsLevelGet();

/*
 * --------------------------------------------------------------------------
 * OvsDeferredActionsLevelInc --
 *     The function increments the deferred action execution level
 *     corresponding to the current processor.
 * --------------------------------------------------------------------------
 */
VOID
OvsDeferredActionsLevelInc();

/*
 * --------------------------------------------------------------------------
 * OvsDeferredActionsLevelDec --
 *     The function decrements the deferred action execution level
 *     corresponding to the current processor.
 * --------------------------------------------------------------------------
*/
VOID
OvsDeferredActionsLevelDec();

#endif /* __RECIRC_H_ */