| :: # Copyright 2013, Big Switch Networks, Inc. |
| :: # |
| :: # LoxiGen is licensed under the Eclipse Public License, version 1.0 (EPL), with |
| :: # the following special exception: |
| :: # |
| :: # LOXI Exception |
| :: # |
| :: # As a special exception to the terms of the EPL, you may distribute libraries |
| :: # generated by LoxiGen (LoxiGen Libraries) under the terms of your choice, provided |
| :: # that copyright and licensing notices generated by LoxiGen are not altered or removed |
| :: # from the LoxiGen Libraries and the notice provided below is (i) included in |
| :: # the LoxiGen Libraries, if distributed in source code form and (ii) included in any |
| :: # documentation for the LoxiGen Libraries, if distributed in binary form. |
| :: # |
| :: # Notice: "Copyright 2013, Big Switch Networks, Inc. This library was generated by the LoxiGen Compiler." |
| :: # |
| :: # You may not use this file except in compliance with the EPL or LOXI Exception. You may obtain |
| :: # a copy of the EPL at: |
| :: # |
| :: # http://www.eclipse.org/legal/epl-v10.html |
| :: # |
| :: # 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 |
| :: # EPL for the specific language governing permissions and limitations |
| :: # under the EPL. |
| :: |
| :: include('_copyright.c') |
| |
| /** |
| * @file of_doc.h |
| * @brief Documentation of sample functions |
| * |
| * This file is for documentation purposes only |
| * |
| * Once the code is in a working state, this documentation will be |
| * transfered to the actual source files |
| * |
| * The functions documented here are simple templates for accessors that |
| * are used for all accessor members of LOCI objects. Data types are |
| * divided into: |
| * |
| * @li @c scalar Things like uint8_t, uint16_t, of_mac_addr_t as well as |
| * fixed length strings |
| * @li @c octets Arbitrary length strings of binary data |
| * @li @c composite Data members which are structures |
| * @li @c list The list abstraction for data members |
| * @li @c list_element An element of a list (usually a composite object) |
| * |
| * List elements get special treatment for iterating across a list or |
| * appending new entries to the list. All others have 'set' and 'get' |
| * operations. |
| * |
| * Scalars operations are "stateless" in that they simply |
| * update the underlying data or return that data. |
| * |
| * Composites and list members update structures to point to the |
| * underlying data. As a result, care must be taken that objects are |
| * not freed when linked composite or list members remain referring to |
| * the underlying data structure. Currently: Note that reference |
| * counting won't solve this with the current approach as the |
| * referring objects may be automatic and not subject to alloc/free |
| * operations. |
| */ |
| |
| |
| |
| /** |
| * Generic documentation for scalar get methods |
| * @param obj The object being accessed |
| * @param value A pointer to a scalar instance of the proper type |
| * @return OF_ERROR_XXX |
| * |
| * Accesses the underlying wire buffer at the appropriate offset to |
| * retrieve and convert the value, placing the result in *value. |
| * |
| * Examples of scalar types include: |
| * @li uint8_t |
| * @li uint16_t |
| * @li uint32_t |
| * @li uint64_t |
| * @li of_mac_addr_t |
| * |
| * Examples calls include: |
| * @li rv = of_port_status_reason_get(obj, &reason) |
| * @li rv = of_table_mod_config_get(obj, &config) |
| * |
| * An object instance can call directly as: |
| * @li rv = obj->reason_get(obj, &reason); obj is an of_table_mod_t * |
| * @li rv = obj->config_get(obj, &config); obj is an of_table_mod_t * |
| */ |
| extern int of_object_scalar_member_get(of_object_t *obj, uint32_t *value); |
| |
| /** |
| * Generic documentation for scalar set methods |
| * @param obj The object being accessed |
| * @param value Call by value parameter with the value to set |
| * @return OF_ERROR_XXX |
| * |
| * Converts value to the proper wire representation and writes it to |
| * the underlying wire buffer at the appropriate offset. |
| */ |
| extern int of_object_scalar_member_set(of_object_t *obj, uint32_t value); |
| |
| /** |
| * Generic documentation for an octets data get method |
| * @param obj The object being accessed |
| * @param value A pointer to an of_octets_t structure to be filled out |
| * @return OF_ERROR_XXX |
| * |
| * NOTE: |
| * Sets *bytes to the number of bytes in the octet string. |
| */ |
| extern int of_object_octets_member_data_get(of_object_t *obj, of_octets_t *value); |
| |
| /** |
| * Generic documentation for an octets data set method |
| * @param obj The object being accessed |
| * @param value Pointer to an of_octets_t structure pointing to memory from |
| * which data will be copied to wire buffer |
| * @return OF_ERROR_XXX |
| * |
| * Copies data from the memory pointed to by value into the underlying |
| * wire buffer, extending the buffer if necessary. The length of obj |
| * is updated. |
| * |
| * If the length of obj changes (because the existing octets instance is of |
| * a different length) its internal length accessor is called to update |
| * anything tracking its length. This may call the object's parent |
| * length accessor with the update. |
| */ |
| extern int of_object_octets_member_data_set(of_object_t *obj, of_octets_t *value); |
| |
| /** |
| * Generic documentation for an octets pointer get method |
| * @param obj The object being accessed |
| * @param value Pointer to an of_octets_t structure to be initialized |
| * @return OF_ERROR_XXX |
| * |
| * Set the octets object *value to point to the underlying data buffer. The |
| * length member of *value is set as well. |
| * |
| * The result should be treated as READ ONLY information as modifying |
| * the buffer could cause corruption of the underlying LOCI object. |
| * To change the value (especially the length) of an octets data member, |
| * allocate and set a memory buffer and use the octets_member_data_set |
| * function. |
| */ |
| extern int of_object_octets_member_ptr_get(of_object_t *obj, of_octets_t *value); |
| |
| /** |
| * Generic documentation for a composite sub-object get method |
| * @param obj The object being accessed |
| * @param value Pointer to an object (the sub-object) of the proper type |
| * @return OF_ERROR_XXX |
| * |
| * A composite is a structure with multiple components. On a 'get' |
| * operation, a pointer (value) to an unused instance of the appropriate |
| * type is passed to this routine. That instance is intialized with the |
| * proper accessor functions for the sub-object type and the wire object |
| * is set up to point to obj's wire buffer at the appropriate offset. |
| * |
| * If changes are made to the sub-object (*value) and those changes |
| * affect the length, then the corresponding composite_set must be |
| * called to commit those changes to the parent. |
| */ |
| extern int of_object_composite_member_get(of_object_t *obj, |
| of_object_t *value); |
| |
| /** |
| * Generic documentation for a composite sub-object set method |
| * @param obj The object being accessed |
| * @param value Pointer to an object (the sub-object) of the proper type |
| * @return OF_ERROR_XXX |
| * |
| * A composite is a structure with multiple components. On a 'set' |
| * operation, a pointer (value) to an instance of the appropriate type |
| * is passed to this routine. |
| * |
| * If the parent (obj) and the child (value) point to the same underlying |
| * wire object, then the changes to the underlying buffer are already |
| * recorded. |
| * |
| * Otherwise, any existing value of the sub-object is replaced |
| * by copying the wire buffer contents from value's wire buffer to obj's |
| * wire buffer at the appropriate offset. |
| * |
| * In either case, the length of the parent will be updated if it changes. |
| */ |
| extern int of_object_composite_member_set(of_object_t *obj, |
| of_object_t *value); |
| |
| /** |
| * Generic documentation for a list sub-object get method |
| * @param obj The object being accessed |
| * @param value Pointer to an object (the list sub-object) |
| * @return OF_ERROR_XXX |
| * |
| * A list is an array of instances of objects of a common (possibly |
| * polymorphic) type. On a 'get' operation, a pointer (value) to an |
| * unused instance of the appropriate list type is passed to this |
| * routine. That instance is intialized with the proper accessor |
| * functions for the list type and the wire object is set up to point |
| * to obj's wire buffer at the appropriate offset. |
| * |
| * Currently, the list object returned by a 'get' operation should not |
| * be altered, although changes that do not affect the length of |
| * sub-objects will work. |
| * |
| * Rather, lists should either be cleared and set from completely new |
| * instances using 'list_set', or they may be built using the append |
| * operations described below. |
| * |
| * @sa of_object_list_append_bind |
| * @sa of_object_list_append |
| */ |
| extern int of_object_list_member_get(of_object_t *obj, |
| of_list_object_t *value); |
| |
| /** |
| * Generic documentation for a list entry first call |
| * @param obj The list object being accessed |
| * @param value Pointer to a generic list entry instance |
| * @return OF_ERROR_RANGE if the list is empty |
| * |
| * A list is an array of instances of objects of a common (possibly |
| * polymorphic) type. |
| * |
| * This routine is intended for iterating through a list for |
| * reading. Normally a 'get' operation will be done on the parent |
| * of the list to retrieve (a pointer to) the list, and then this routine |
| * will be called to set up a generic entry representing the first |
| * element of the list. |
| * |
| * @sa of_object_list_entry_next |
| */ |
| extern int of_object_list_entry_first(of_list_object_t *obj, |
| of_object_t *value); |
| |
| /** |
| * Generic documentation for a list entry next call |
| * @param obj The list object being accessed |
| * @param value Pointer to a generic list entry instance |
| * @return OF_ERROR_RANGE if the value already points to the last item |
| * in the list |
| |
| * A list is an array of instances of objects of a common (possibly |
| * polymorphic) type. |
| * |
| * The corresponding list_entry_first must be called on the pair of |
| * parameters initially. There after, this routine will advance the |
| * pointers in the wire object of value to the subsequent entry in the |
| * list. |
| * |
| * Changes should not be made to list items using these routines, |
| * although 'set' operations which do not change the length of the |
| * instance will work. |
| * |
| * @sa of_object_list_entry_first |
| */ |
| extern int of_object_list_entry_next(of_list_object_t *obj, |
| of_object_t *value); |
| |
| /** |
| * Generic documentation for a list append bind function |
| * @param obj The list object being accessed |
| * @param value Pointer to a generic list entry instance |
| * @return OF_ERROR_XXX |
| * |
| * A list is an array of instances of objects of a common (possibly |
| * polymorphic) type. |
| * |
| * This function prepares the list for the process of appending an |
| * item to its tail. The parameter value is a pointer to a generic |
| * list entry instance. Its wire buffer is bound to that of the list |
| * at the end of the list. The length of the list is updated according |
| * to the current value setting which must be accurate. |
| * |
| * Note that since the child has not been bound to a buffer, no |
| * values have been properly recorded for the object; they must |
| * be set after this _bind call. |
| * |
| * @sa of_object_list_entry_append |
| */ |
| extern int of_object_list_entry_append_bind(of_list_object_t *obj, |
| of_object_t *value); |
| |
| /** |
| * Generic documentation for a list append function |
| * @param obj The list object being accessed |
| * @param value Pointer to a list object to be appended |
| * @return OF_ERROR_XXX |
| * |
| * A list is an array of instances of objects of a common (possibly |
| * polymorphic) type. |
| * |
| * This function takes a fully formed list entry, value, and copies |
| * that value to the end of the list. No object ownership changes |
| * with this call. |
| * |
| * @sa of_object_list_entry_append_bind |
| */ |
| extern int of_object_list_entry_append(of_list_object_t *obj, |
| of_object_t *value); |
| |
| /* This is from loci.h */ |
| |
| /** |
| * Inheritance super class for of_queue_prop |
| * |
| * This class is the union of of_queue_prop classes. You can refer |
| * to it untyped by refering to the member 'header' whose structure |
| * is common across all sub-classes. |
| */ |
| |
| union of_queue_prop_u { |
| of_queue_prop_header_t header; /* Generic instance */ |
| of_queue_prop_min_rate_t min_rate; |
| of_queue_prop_max_rate_t max_rate; |
| of_queue_prop_experimenter_t experimenter; |
| }; |
| |
| /** |
| * Inheritance super class for of_action |
| * |
| * This class is the union of of_action classes. You can refer |
| * to it untyped by refering to the member 'header' whose structure |
| * is common across all sub-classes. |
| */ |
| |
| union of_action_u { |
| of_action_header_t header; /* Generic instance */ |
| of_action_copy_ttl_out_t copy_ttl_out; |
| of_action_set_mpls_tc_t set_mpls_tc; |
| of_action_set_field_t set_field; |
| of_action_set_nw_tos_t set_nw_tos; |
| of_action_dec_mpls_ttl_t dec_mpls_ttl; |
| of_action_set_nw_dst_t set_nw_dst; |
| of_action_set_mpls_label_t set_mpls_label; |
| of_action_group_t group; |
| of_action_set_nw_src_t set_nw_src; |
| of_action_set_vlan_vid_t set_vlan_vid; |
| of_action_set_mpls_ttl_t set_mpls_ttl; |
| of_action_pop_vlan_t pop_vlan; |
| of_action_set_tp_dst_t set_tp_dst; |
| of_action_pop_mpls_t pop_mpls; |
| of_action_push_vlan_t push_vlan; |
| of_action_set_vlan_pcp_t set_vlan_pcp; |
| of_action_enqueue_t enqueue; |
| of_action_set_tp_src_t set_tp_src; |
| of_action_experimenter_t experimenter; |
| of_action_set_nw_ttl_t set_nw_ttl; |
| of_action_copy_ttl_in_t copy_ttl_in; |
| of_action_set_nw_ecn_t set_nw_ecn; |
| of_action_strip_vlan_t strip_vlan; |
| of_action_set_dl_dst_t set_dl_dst; |
| of_action_push_mpls_t push_mpls; |
| of_action_dec_nw_ttl_t dec_nw_ttl; |
| of_action_set_dl_src_t set_dl_src; |
| of_action_set_queue_t set_queue; |
| of_action_output_t output; |
| }; |
| |
| /** |
| * Inheritance super class for of_instruction |
| * |
| * This class is the union of of_instruction classes. You can refer |
| * to it untyped by refering to the member 'header' whose structure |
| * is common across all sub-classes. |
| */ |
| |
| union of_instruction_u { |
| of_instruction_header_t header; /* Generic instance */ |
| of_instruction_clear_actions_t clear_actions; |
| of_instruction_write_actions_t write_actions; |
| of_instruction_goto_table_t goto_table; |
| of_instruction_apply_actions_t apply_actions; |
| of_instruction_experimenter_t experimenter; |
| of_instruction_write_metadata_t write_metadata; |
| }; |
| |
| /** |
| * Inheritance super class for of_oxm |
| * |
| * This class is the union of of_oxm classes. You can refer |
| * to it untyped by refering to the member 'header' whose structure |
| * is common across all sub-classes. |
| */ |
| |
| union of_oxm_u { |
| of_oxm_header_t header; /* Generic instance */ |
| of_oxm_ipv6_flabel_t ipv6_flabel; |
| of_oxm_ipv6_dst_masked_t ipv6_dst_masked; |
| of_oxm_vlan_pcp_t vlan_pcp; |
| of_oxm_ipv4_src_t ipv4_src; |
| of_oxm_ipv6_dst_t ipv6_dst; |
| of_oxm_arp_tpa_t arp_tpa; |
| of_oxm_icmpv6_type_t icmpv6_type; |
| of_oxm_arp_sha_t arp_sha; |
| of_oxm_ipv6_src_t ipv6_src; |
| of_oxm_sctp_src_t sctp_src; |
| of_oxm_icmpv6_code_t icmpv6_code; |
| of_oxm_metadata_masked_t metadata_masked; |
| of_oxm_eth_src_masked_t eth_src_masked; |
| of_oxm_eth_dst_t eth_dst; |
| of_oxm_ipv6_nd_sll_t ipv6_nd_sll; |
| of_oxm_mpls_tc_t mpls_tc; |
| of_oxm_arp_op_t arp_op; |
| of_oxm_vlan_vid_masked_t vlan_vid_masked; |
| of_oxm_eth_type_t eth_type; |
| of_oxm_in_phy_port_t in_phy_port; |
| of_oxm_vlan_vid_t vlan_vid; |
| of_oxm_arp_tha_t arp_tha; |
| of_oxm_arp_tpa_masked_t arp_tpa_masked; |
| of_oxm_in_port_t in_port; |
| of_oxm_ip_dscp_t ip_dscp; |
| of_oxm_sctp_dst_t sctp_dst; |
| of_oxm_icmpv4_code_t icmpv4_code; |
| of_oxm_eth_dst_masked_t eth_dst_masked; |
| of_oxm_tcp_src_t tcp_src; |
| of_oxm_ip_ecn_t ip_ecn; |
| of_oxm_ipv6_src_masked_t ipv6_src_masked; |
| of_oxm_ipv4_src_masked_t ipv4_src_masked; |
| of_oxm_udp_dst_t udp_dst; |
| of_oxm_arp_spa_t arp_spa; |
| of_oxm_ipv6_nd_target_t ipv6_nd_target; |
| of_oxm_ipv4_dst_t ipv4_dst; |
| of_oxm_ipv4_dst_masked_t ipv4_dst_masked; |
| of_oxm_eth_src_t eth_src; |
| of_oxm_udp_src_t udp_src; |
| of_oxm_ipv6_nd_tll_t ipv6_nd_tll; |
| of_oxm_icmpv4_type_t icmpv4_type; |
| of_oxm_mpls_label_t mpls_label; |
| of_oxm_tcp_dst_t tcp_dst; |
| of_oxm_ip_proto_t ip_proto; |
| of_oxm_metadata_t metadata; |
| of_oxm_arp_spa_masked_t arp_spa_masked; |
| }; |
| |