ROFL-pipeline  v0.6.0dev
of1x_action.h
Go to the documentation of this file.
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 
5 #ifndef __OF1X_ACTION_H__
6 #define __OF1X_ACTION_H__
7 
8 #include <inttypes.h>
9 #include <string.h>
10 #include <stdbool.h>
11 #include <assert.h>
12 #include "rofl.h"
13 #include "of1x_utils.h"
14 #include "../../../common/ternary_fields.h"
15 
78 //Fwd decl
79 struct datapacket;
80 struct of1x_flow_table;
89 typedef enum{
90  //No action. This MUST always exist and the value MUST be 0
91  OF1X_AT_NO_ACTION= 0, /* NO action/EMPTY action. */
92 
93  //Copy TTL inwards
94  OF1X_AT_COPY_TTL_IN, /* Copy TTL "inwards" -- from outermost to next-to-outermost */
95 
96  /*
97  * Pop: first VLAN, MPLS, PPPoE, PPP, PBB
98  */
99  OF1X_AT_POP_VLAN, /* Pop the outer VLAN tag */
100  OF1X_AT_POP_MPLS, /* Pop the outer MPLS tag */
101  OF1X_AT_POP_GTP, /* Pop the GTP header */
102  OF1X_AT_POP_CAPWAP, /* Pop the CAPWAP header */
103  OF1X_AT_POP_PPPOE, /* Pop the PPPoE header */
104  OF1X_AT_POP_PBB, /* Pop the PBB header */
105  OF1X_AT_POP_WLAN, /* Pop the WLAN header */
106  OF1X_AT_POP_GRE, /* Pop the GRE header */
107 
108  /*
109  * Push: first PBB, PPP, PPPoE, MPLS, VLAN
110  */
111  OF1X_AT_PUSH_GRE, /* Push a new GRE header */
112  OF1X_AT_PUSH_WLAN, /* Push a new WLAN header */
113  OF1X_AT_PUSH_PBB, /* Push a new PBB header */
114  OF1X_AT_PUSH_PPPOE, /* Push a new PPPoE header */
115  OF1X_AT_PUSH_CAPWAP, /* Push a new CAPWAP header */
116  OF1X_AT_PUSH_GTP, /* Push a new GTP header */
117  OF1X_AT_PUSH_MPLS, /* Push a new MPLS tag */
118  OF1X_AT_PUSH_VLAN, /* Push a new VLAN tag */
119 
120  //Copy ttl outwards
121  OF1X_AT_COPY_TTL_OUT, /* Copy TTL "outwards" -- from next-to-outermost to outermost */
122 
123  //Decrement TTL
124  OF1X_AT_DEC_NW_TTL, /* Decrement IP TTL. */
125  OF1X_AT_DEC_MPLS_TTL, /* Decrement MPLS TTL */
126 
127  //Set fields
128  OF1X_AT_SET_MPLS_TTL, /* MPLS TTL */
129  OF1X_AT_SET_NW_TTL, /* IP TTL. */
130  OF1X_AT_SET_QUEUE, /* Set queue id when outputting to a port */
131 
132  OF1X_AT_SET_FIELD_ETH_DST, /* Ethernet destination address. */
133  OF1X_AT_SET_FIELD_ETH_SRC, /* Ethernet source address. */
134  OF1X_AT_SET_FIELD_ETH_TYPE, /* Ethernet frame type. */
135 
136  OF1X_AT_SET_FIELD_MPLS_LABEL, /* MPLS label. */
137  OF1X_AT_SET_FIELD_MPLS_TC, /* MPLS TC. */
138  OF1X_AT_SET_FIELD_MPLS_BOS, /* MPLS BoS flag */
139 
140  OF1X_AT_SET_FIELD_VLAN_VID, /* VLAN id. */
141  OF1X_AT_SET_FIELD_VLAN_PCP, /* VLAN priority. */
142  OF1X_AT_SET_FIELD_ARP_OPCODE, /* ARP opcode */
143 
144  OF1X_AT_SET_FIELD_ARP_SHA, /* ARP source hardware address */
145  OF1X_AT_SET_FIELD_ARP_SPA, /* ARP source protocol address */
146  OF1X_AT_SET_FIELD_ARP_THA, /* ARP target hardware address */
147  OF1X_AT_SET_FIELD_ARP_TPA, /* ARP target protocol address */
148 
149  /* OF10 only */
150  OF1X_AT_SET_FIELD_NW_PROTO, /* Network layer proto/arp code */
151  OF1X_AT_SET_FIELD_NW_SRC, /* Source network address */
152  OF1X_AT_SET_FIELD_NW_DST, /* Destination network address */
153  /* End of OF10 only */
154 
155 
156  OF1X_AT_SET_FIELD_IP_DSCP, /* IP DSCP (6 bits in ToS field). */
157  OF1X_AT_SET_FIELD_IP_ECN, /* IP ECN (2 bits in ToS field). */
158  OF1X_AT_SET_FIELD_IP_PROTO, /* IP protocol. */
159 
160  OF1X_AT_SET_FIELD_IPV4_SRC, /* IPv4 source address. */
161  OF1X_AT_SET_FIELD_IPV4_DST, /* IPv4 destination address. */
162  OF1X_AT_SET_FIELD_IPV6_SRC, /* IPv6 source address */
163 
164  OF1X_AT_SET_FIELD_IPV6_DST, /* IPv6 destination address */
165  OF1X_AT_SET_FIELD_IPV6_FLABEL, /* IPv6 flow label */
166  OF1X_AT_SET_FIELD_IPV6_ND_TARGET, /* IPv6 Neighbour Discovery target */
167  OF1X_AT_SET_FIELD_IPV6_ND_SLL, /* IPv6 ND source link level */
168  OF1X_AT_SET_FIELD_IPV6_ND_TLL, /* IPv6 ND target link level */
169  OF1X_AT_SET_FIELD_IPV6_EXTHDR, /* IPv6 Extension pseudo header */
170 
171  OF1X_AT_SET_FIELD_TCP_SRC, /* TCP source port. */
172  OF1X_AT_SET_FIELD_TCP_DST, /* TCP destination port. */
173 
174  OF1X_AT_SET_FIELD_UDP_SRC, /* UDP source port. */
175  OF1X_AT_SET_FIELD_UDP_DST, /* UDP destination port. */
176 
177  OF1X_AT_SET_FIELD_SCTP_SRC, /* SCTP source port. */
178  OF1X_AT_SET_FIELD_SCTP_DST, /* SCTP destination port. */
179 
180  /* OF10 only */
181  OF1X_AT_SET_FIELD_TP_SRC, /* Trans. protocol (TCP/UDP) src port */
182  OF1X_AT_SET_FIELD_TP_DST, /* Trans. protocol (TCP/UDP) dst port */
183  /* End of OF10 only */
184 
185  OF1X_AT_SET_FIELD_ICMPV4_TYPE, /* ICMP type. */
186  OF1X_AT_SET_FIELD_ICMPV4_CODE, /* ICMP code. */
187 
188  OF1X_AT_SET_FIELD_ICMPV6_TYPE, /* ICMPv6 type */
189  OF1X_AT_SET_FIELD_ICMPV6_CODE, /* ICMPv6 code */
190 
191  OF1X_AT_SET_FIELD_PBB_ISID, /* PBB ISID field */
192  OF1X_AT_SET_FIELD_TUNNEL_ID, /* Tunnel id */
193 
194  /*
195  * Extensions
196  */
197 
198  OF1X_AT_SET_FIELD_PPPOE_CODE, /* PPPoE code */
199  OF1X_AT_SET_FIELD_PPPOE_TYPE, /* PPPoE type */
200  OF1X_AT_SET_FIELD_PPPOE_SID, /* PPPoE session id */
201  OF1X_AT_SET_FIELD_PPP_PROT, /* PPP protocol */
202 
203  OF1X_AT_SET_FIELD_GTP_MSG_TYPE, /* GTP message type */
204  OF1X_AT_SET_FIELD_GTP_TEID, /* GTP TEID */
205 
206  OF1X_AT_SET_FIELD_CAPWAP_WBID, /* CAPWAP wbid */
207  OF1X_AT_SET_FIELD_CAPWAP_RID, /* CAPWAP rid */
208  OF1X_AT_SET_FIELD_CAPWAP_FLAGS, /* CAPWAP flags */
209 
210  OF1X_AT_SET_FIELD_WLAN_FC, /* WLAN fc */
211  OF1X_AT_SET_FIELD_WLAN_TYPE, /* WLAN type */
212  OF1X_AT_SET_FIELD_WLAN_SUBTYPE, /* WLAN subtype */
213  OF1X_AT_SET_FIELD_WLAN_DIRECTION, /* WLAN direction */
214  OF1X_AT_SET_FIELD_WLAN_ADDRESS_1, /* WLAN address 1 */
215  OF1X_AT_SET_FIELD_WLAN_ADDRESS_2, /* WLAN address 2 */
216  OF1X_AT_SET_FIELD_WLAN_ADDRESS_3, /* WLAN address 3 */
217 
218  OF1X_AT_SET_FIELD_GRE_VERSION, /* GRE version */
219  OF1X_AT_SET_FIELD_GRE_PROT_TYPE, /* GRE protocol type */
220  OF1X_AT_SET_FIELD_GRE_KEY, /* GRE key */
221 
222  /* Add more set fields here... */
223 
224  //Groups
225  OF1X_AT_GROUP, /* Apply group. */
226 
227  //Experimenter
228  OF1X_AT_EXPERIMENTER,
229 
230  OF1X_AT_OUTPUT, /* Output to switch port. */
232 
233 #define OF1X_AT_NUMBER OF1X_AT_OUTPUT+1
234 
235 //Make sure we are not exceeding the bitmap size
236 #if OF1X_AT_NUMBER >= 128
237  #error Number of actions beyond 128 not supported by bitmap128_t. Implement bitmap256_t.
238 #endif
239 
245 
246  /* Maximum number of physical switch ports. */
247  OF1X_PORT_MAX = 0xffffff00,
248 
249  /* Fake output "ports". */
250  OF1X_PORT_IN_PORT = 0xfffffff8, /* Send the packet out the input port. This
251  virtual port must be explicitly used
252  in order to send back out of the input
253  port. */
254 
255  OF1X_PORT_TABLE = 0xfffffff9, /* Submit the packet to the first flow table
256  NB: This destination port can only be
257  used in packet-out messages. */
258  OF1X_PORT_NORMAL = 0xfffffffa, /* Process with normal L2/L3 switching. */
259  OF1X_PORT_FLOOD = 0xfffffffb, /* All physical ports in VLAN, except input
260  port and those blocked or link down. */
261  OF1X_PORT_ALL = 0xfffffffc, /* All physical ports except input port. */
262  OF1X_PORT_CONTROLLER = 0xfffffffd, /* Send to controller. */
263  OF1X_PORT_LOCAL = 0xfffffffe, /* Local OpenFlow "port". */
264  OF1X_PORT_ANY = 0xffffffff /* Wildcard port used only for flow mod
265  (delete) and flow stats requests. Selects
266  all flows regardless of output port
267  (including flows with no output port). */
268 };
269 
270 
271 //fwd declaration
272 struct of1x_group;
273 
278 typedef struct of1x_packet_action{
279  //Type and value(for set fields and push)
281 
282  //Field (set field)
283  wrap_uint_t __field;
284 
285  //miss-send-len for OUTPUT actions only
286  uint16_t send_len;
287 
288  //group
289  struct of1x_group* group;
290 
291  //DLL
292  struct of1x_packet_action* next;
293 
294  /* Fast validation flags */
295  //Bitmap of required OF versions
296  of1x_ver_req_t ver_req;
298 
303 typedef struct of1x_action_group{
304 
305  //bitmap of actions
306  bitmap128_t bitmap;
307 
308  //Number of actions in the list
309  unsigned int num_of_actions;
310 
311  //Double linked list
312  of1x_packet_action_t* head;
313  of1x_packet_action_t* tail;
314 
315  //Number of outputs in the action list
316  unsigned int num_of_output_actions;
317 
318  //Contains output to TABLE
319  bool has_output_table;
320 
321  /* Fast validation flags */
322  //Bitmap of required OF versions
323  of1x_ver_req_t ver_req;
325 
330 typedef struct{
331 
332  //bitmap of actions
333  bitmap128_t bitmap;
334 
335  //Write actions 0...OF1X_AT_NUMBER-1 at the very beginning of the array
336  of1x_packet_action_t actions[OF1X_AT_NUMBER];
337 
338  //Number of output actions.
339  unsigned int num_of_actions;
340  unsigned int num_of_output_actions;
341 
342  /* Fast validation flags */
343  //Bitmap of required OF versions
344  of1x_ver_req_t ver_req;
346 
347 //Fwd declaration
348 struct of1x_switch;
349 struct of1x_group_table;
350 
351 /*
352 *
353 * Function prototypes
354 *
355 */
356 
357 //C++ extern C
358 ROFL_BEGIN_DECLS
359 
360 //Action
370 
376 
377 //Getters for the values of the
378 
379 //8 bit
380 static inline
381 uint8_t __of1x_get_packet_action_field8(const of1x_packet_action_t* action, bool raw_nbo){
382 
383  if(raw_nbo)
384  return action->__field.u8;
385 
386  switch(action->type){
387  case OF1X_AT_SET_FIELD_IP_DSCP:
388  return OF1X_IP_DSCP_VALUE(action->__field.u8);
389  break;
390  case OF1X_AT_SET_FIELD_VLAN_PCP:
391  return OF1X_VLAN_PCP_VALUE(action->__field.u8);
392  break;
393  case OF1X_AT_SET_FIELD_MPLS_TC:
394  return OF1X_MPLS_TC_VALUE(action->__field.u8);
395  break;
396  case OF1X_AT_SET_FIELD_IP_ECN:
397  case OF1X_AT_SET_FIELD_NW_PROTO:
398  case OF1X_AT_SET_FIELD_ICMPV6_TYPE:
399  case OF1X_AT_SET_FIELD_ICMPV6_CODE:
400  case OF1X_AT_SET_FIELD_PPPOE_CODE:
401  case OF1X_AT_SET_FIELD_PPPOE_TYPE:
402  case OF1X_AT_SET_MPLS_TTL:
403  case OF1X_AT_SET_NW_TTL:
404  case OF1X_AT_SET_FIELD_IP_PROTO:
405  case OF1X_AT_SET_FIELD_ICMPV4_TYPE:
406  case OF1X_AT_SET_FIELD_ICMPV4_CODE:
407  case OF1X_AT_SET_FIELD_GTP_MSG_TYPE:
408  case OF1X_AT_SET_FIELD_MPLS_BOS:
409  return action->__field.u8;
410  break;
411  default:
412  return 0x0;
413  break;
414  }
415  return 0x0;
416 }
417 
424 static inline
426  return __of1x_get_packet_action_field8(action, false);
427 }
428 
429 
430 //16 bit
431 static inline
432 uint16_t __of1x_get_packet_action_field16(const of1x_packet_action_t* action, bool raw_nbo){
433 
434  if(raw_nbo)
435  return action->__field.u16;
436 
437  switch(action->type){
438  case OF1X_AT_SET_FIELD_ETH_TYPE:
439  case OF1X_AT_SET_FIELD_ARP_OPCODE:
440  case OF1X_AT_SET_FIELD_TP_SRC:
441  case OF1X_AT_SET_FIELD_TP_DST:
442  case OF1X_AT_SET_FIELD_TCP_SRC:
443  case OF1X_AT_SET_FIELD_TCP_DST:
444  case OF1X_AT_SET_FIELD_UDP_SRC:
445  case OF1X_AT_SET_FIELD_UDP_DST:
446  case OF1X_AT_SET_FIELD_SCTP_SRC:
447  case OF1X_AT_SET_FIELD_SCTP_DST:
448  case OF1X_AT_SET_FIELD_PPPOE_SID:
449  case OF1X_AT_SET_FIELD_PPP_PROT:
450  case OF1X_AT_POP_MPLS:
451  case OF1X_AT_POP_PPPOE:
452  case OF1X_AT_POP_PBB:
453  case OF1X_AT_PUSH_PPPOE:
454  case OF1X_AT_PUSH_MPLS:
455  case OF1X_AT_PUSH_VLAN:
456  case OF1X_AT_PUSH_PBB:
457  case OF1X_AT_SET_FIELD_VLAN_VID:
458  case OF1X_AT_SET_FIELD_GRE_VERSION:
459  case OF1X_AT_SET_FIELD_GRE_PROT_TYPE:
460  return NTOHB16(action->__field.u16);
461  break;
462  case OF1X_AT_SET_FIELD_IPV6_EXTHDR:
463  default:
464  return 0x0;
465  break;
466  }
467  return 0x0;
468 }
469 
476 static inline
478  return __of1x_get_packet_action_field16(action, false);
479 }
480 
481 //32 bit
482 static inline
483 uint32_t __of1x_get_packet_action_field32(const of1x_packet_action_t* action, bool raw_nbo){
484 
485  if(raw_nbo)
486  return action->__field.u32;
487 
488  switch(action->type){
489  case OF1X_AT_SET_FIELD_MPLS_LABEL:
490  return OF1X_MPLS_LABEL_VALUE(NTOHB32(action->__field.u32));
491  case OF1X_AT_SET_FIELD_IPV6_FLABEL:
492  return OF1X_IP6_FLABEL_VALUE(NTOHB32(action->__field.u32));
493  break;
494  case OF1X_AT_SET_FIELD_IPV4_SRC:
495  case OF1X_AT_SET_FIELD_IPV4_DST:
496  case OF1X_AT_SET_FIELD_NW_SRC:
497  case OF1X_AT_SET_FIELD_NW_DST:
498  case OF1X_AT_SET_FIELD_ARP_SPA:
499  case OF1X_AT_SET_FIELD_ARP_TPA:
500  case OF1X_AT_SET_FIELD_GTP_TEID:
501  case OF1X_AT_SET_FIELD_PBB_ISID:
502  case OF1X_AT_SET_FIELD_GRE_KEY:
503  return NTOHB32(action->__field.u32);
504  break;
505  case OF1X_AT_SET_QUEUE:
506  case OF1X_AT_OUTPUT:
507  case OF1X_AT_GROUP:
508  return action->__field.u32;
509  break;
510  default:
511  return 0x0;
512  break;
513  }
514  return 0x0;
515 }
516 
523 static inline
525  return __of1x_get_packet_action_field32(action, false);
526 }
527 
528 //64 bit
529 static inline
530 uint64_t __of1x_get_packet_action_field64(const of1x_packet_action_t* action, bool raw_nbo){
531 
532  if(raw_nbo)
533  return action->__field.u64;
534 
535  switch(action->type){
536  case OF1X_AT_SET_FIELD_PBB_ISID:
537  case OF1X_AT_SET_FIELD_TUNNEL_ID:
538  return action->__field.u64;
539  break;
540  case OF1X_AT_SET_FIELD_IPV6_ND_SLL:
541  case OF1X_AT_SET_FIELD_IPV6_ND_TLL:
542  case OF1X_AT_SET_FIELD_ETH_DST:
543  case OF1X_AT_SET_FIELD_ETH_SRC:
544  case OF1X_AT_SET_FIELD_ARP_SHA:
545  case OF1X_AT_SET_FIELD_ARP_THA:
546  return OF1X_MAC_VALUE(NTOHB64(action->__field.u64));
547  break;
548  default:
549  return 0x0;
550  break;
551  }
552  return 0x0;
553 }
554 
561 static inline
563  return __of1x_get_packet_action_field64(action, false);
564 }
565 
566 //128 bit
567 static inline
568 uint128__t __of1x_get_packet_action_field128(const of1x_packet_action_t* action, bool raw_nbo){
569  uint128__t tmp= {{0x00}};
570 
571  if(raw_nbo)
572  return action->__field.u128;
573 
574  switch(action->type){
575  case OF1X_AT_SET_FIELD_IPV6_ND_TARGET:
576  case OF1X_AT_SET_FIELD_IPV6_SRC:
577  case OF1X_AT_SET_FIELD_IPV6_DST:
578  tmp = action->__field.u128;
579  NTOHB128(tmp);
580  return tmp;
581  break;
582  default:
583  return tmp;
584  break;
585  }
586  return tmp;
587 }
588 
595 static inline
597  return __of1x_get_packet_action_field128(action, false);
598 }
599 
600 //Action group
606 
612 
613 //Push packet action
620 
621 
627 
628 
629 /*
630 * Destroy a write_actions instance. This also destroys actions contained
631 */
632 void __of1x_destroy_write_actions(of1x_write_actions_t* write_actions);
633 
640 
641 //Update apply/write
642 rofl_result_t __of1x_update_apply_actions(of1x_action_group_t** group, of1x_action_group_t* new_group);
643 rofl_result_t __of1x_update_write_actions(of1x_write_actions_t** group, of1x_write_actions_t* new_group);
644 
645 //Checking functions
646 bool __of1x_write_actions_has(of1x_write_actions_t* write_actions, of1x_packet_action_type_t type, uint64_t value);
647 bool __of1x_apply_actions_has(const of1x_action_group_t* apply_actions_group, of1x_packet_action_type_t type, uint64_t value);
648 
649 //Copy (cloning) methodssource
650 of1x_action_group_t* __of1x_copy_action_group(of1x_action_group_t* origin);
651 of1x_write_actions_t* __of1x_copy_write_actions(of1x_write_actions_t* origin);
652 
653 //Dump
654 void __of1x_dump_write_actions(of1x_write_actions_t* write_actions_group, bool raw_nbo);
655 void __of1x_dump_action_group(of1x_action_group_t* action_group, bool raw_nbo);
656 
657 //validate actions
658 rofl_result_t __of1x_validate_action_group(bitmap128_t* supported, of1x_action_group_t *ag, struct of1x_group_table *gt, bool is_pkt_out_ag);
659 rofl_result_t __of1x_validate_write_actions(bitmap128_t* supported, of1x_write_actions_t *wa, struct of1x_group_table *gt);
660 
661 
662 //C++ extern C
663 ROFL_END_DECLS
664 
665 #endif //OF1X_ACTION
of1x_packet_action_type_t
Actions over a packet as per defined in OF10, OF12, OF13.
Definition: of1x_action.h:89
Packet action abstraction data structure.
Definition: of1x_action.h:278
OpenFlow-enabled v1.0, 1.2 and 1.3.2 switch abstraction.
Definition: of1x_switch.h:28
Group structure definition.
static uint16_t of1x_get_packet_action_field16(const of1x_packet_action_t *action)
Retrieve the action field for 16 bit values (or less) in HOST BYTE ORDER.
Definition: of1x_action.h:477
of1x_action_group_t * of1x_init_action_group(of1x_packet_action_t *actions)
Create an action group (apply actions)
Definition: of1x_action.c:440
void of1x_push_packet_action_to_group(of1x_action_group_t *group, of1x_packet_action_t *action)
Push an action to the group.
Definition: of1x_action.c:495
OpenFlow v1.0, 1.2 and 1.3.2 flow table abstraction.
Write actions structure.
Definition: of1x_action.h:330
void of1x_destroy_action_group(of1x_action_group_t *group)
Destroy an action group.
Definition: of1x_action.c:480
struct of1x_action_group of1x_action_group_t
Action group (apply-actions) structure.
static uint8_t of1x_get_packet_action_field8(const of1x_packet_action_t *action)
Retrieve the action field for 8 bit values (or less) in HOST BYTE ORDER.
Definition: of1x_action.h:425
static uint128__t of1x_get_packet_action_field128(const of1x_packet_action_t *action)
Retrieve the action field for 128 bit values (or less) in HOST BYTE ORDER.
Definition: of1x_action.h:596
Action group (apply-actions) structure.
Definition: of1x_action.h:303
struct of1x_packet_action of1x_packet_action_t
Packet action abstraction data structure.
of1x_port_numbers
Special port numbers, according to OF1X (of1xp_port_no )
Definition: of1x_action.h:244
void of1x_destroy_packet_action(of1x_packet_action_t *action)
Destroys packet action (OF action)
Definition: of1x_action.c:434
rofl_result_t of1x_set_packet_action_on_write_actions(of1x_write_actions_t *write_actions, of1x_packet_action_t *action)
Set (copy) the action to the write actions.
Definition: of1x_action.c:570
of1x_write_actions_t * of1x_init_write_actions(void)
Create a write actions group.
Definition: of1x_action.c:541
static uint64_t of1x_get_packet_action_field64(const of1x_packet_action_t *action)
Retrieve the action field for 64 bit values (or less) in HOST BYTE ORDER.
Definition: of1x_action.h:562
static uint32_t of1x_get_packet_action_field32(const of1x_packet_action_t *action)
Retrieve the action field for 32 bit values (or less) in HOST BYTE ORDER.
Definition: of1x_action.h:524
Data packet abstraction.
Definition: datapacket.h:49
ROFL_BEGIN_DECLS of1x_packet_action_t * of1x_init_packet_action(of1x_packet_action_type_t type, wrap_uint_t field, uint16_t output_send_len)
Initializes a packet action (OF action)
Definition: of1x_action.c:21