summaryrefslogtreecommitdiffstats
path: root/src/stateless/cp/trex_dp_port_events.h
blob: 557e590b61d021dd54aebb89fbbef7696a562831 (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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
/*
 Itay Marom
 Cisco Systems, Inc.
*/

/*
Copyright (c) 2015-2015 Cisco Systems, Inc.

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 __TREX_DP_PORT_EVENTS_H__
#define __TREX_DP_PORT_EVENTS_H__

#include <unordered_map>
#include <string>

class TrexStatelessPort;

/**
 * describes a single DP event related to port
 * 
 * @author imarom (18-Nov-15)
 */
class TrexDpPortEvent {
public:

    enum event_e {
        EVENT_STOP   = 1,
        EVENT_MAX
    };

    /**
     * status of the event for the port
     */
    enum event_status_e {
        EVENT_DISABLE,
        EVENT_PENDING,
        EVENT_TIMED_OUT,
        EVENT_OCCURED
    };

    /**
     * init for the event
     * 
     */
    void create(event_e type, TrexStatelessPort *port);

    /**
     * create a new pending event
     * 
     */
    void wait_for_event(int event_id, int timeout_ms = -1);

    /**
     * mark event as not allowed to happen
     * 
     */
    void disable();

    /**
     * get the event status
     * 
     */
    event_status_e status();

    /**
     * event occured
     * 
     */
    void handle_event(int thread_id, int event_id);

    /**
     * returns true if event is active
     * 
     */
    bool is_active();

    /**
     * has timeout already expired ?
     * 
     */
    bool has_timeout_expired();

    /**
     * generate error
     * 
     */
    void err(int thread_id, int event_id, const std::string &err_msg);

    /**
     * event to name
     * 
     */
    static const char * event_name(event_e type);


private:

    event_e                        m_event_type;
    std::unordered_map<int, bool>  m_signal;
    int                            m_pending_cnt;

    TrexStatelessPort             *m_port;
    int                            m_event_id;
    int                            m_expire_limit_ms;
    
};

/**
 * all the events related to a port
 * 
 */
class TrexDpPortEvents {
public:
    friend class TrexDpPortEvent;

    void create(TrexStatelessPort *port);

    /**
     * generate a new event ID to be used with wait_for_event
     * 
     */
    int generate_event_id();

    /**
     * wait a new DP event on the port 
     * returns a key which will be used to identify 
     * the event happened 
     * 
     * @author imarom (18-Nov-15)
     * 
     * @param ev - type of event
     * @param event_id - a unique identifier for the event
     * @param timeout_ms - does it has a timeout ?
     * 
     */
    void wait_for_event(TrexDpPortEvent::event_e ev, int event_id, int timeout_ms = -1);

    /**
     * disable an event (don't care)
     * 
     */
    void disable(TrexDpPortEvent::event_e ev);

    /**
     * event has occured
     * 
     */
    void handle_event(TrexDpPortEvent::event_e ev, int thread_id, int event_id);

private:
    static const int EVENT_ID_INVALID = -1;

    TrexDpPortEvent m_events[TrexDpPortEvent::EVENT_MAX];
    int m_event_id_counter;

    TrexStatelessPort *m_port;
    
};

#endif /* __TREX_DP_PORT_EVENTS_H__ */