:: # 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.
::
/* Copyright 2013, Big Switch Networks, Inc. */

/****************************************************************
 *
 * Low level buffer manipulation functions
 * Requires low level type defs
 *
 ****************************************************************/

#ifndef _OF_BUFFER_H_
#define _OF_BUFFER_H_

#include <loci/loci_base.h>
#include <stdio.h>

/* Function type used for a "free" operation of a low level buffer */
typedef void (*of_buffer_free_f)(void *buf);


/****************************************************************
 *
 * Low level buffers accessors handling endian and alignment
 *
 ****************************************************************/

static inline void
buf_ipv6_get(uint8_t *buf, of_ipv6_t *val) {
    MEMCPY(val, buf, sizeof(*val));
    IPV6_NTOH(val, val); /* probably a no-op */
}

static inline void
buf_mac_get(uint8_t *buf, of_mac_addr_t *val) {
    MEMCPY(val, buf, sizeof(*val));
}

static inline void
buf_u64_get(uint8_t *buf, uint64_t *val) {
    MEMCPY(val, buf, sizeof(*val));
    *val = U64_NTOH(*val);
}

static inline void
buf_u32_get(uint8_t *buf, uint32_t *val) {
    MEMCPY(val, buf, sizeof(*val));
    *val = U32_NTOH(*val);
}

static inline void
buf_u16_get(uint8_t *buf, uint16_t *val) {
    MEMCPY(val, buf, sizeof(uint16_t));
    *val = U16_NTOH(*val);
}

static inline void
buf_u8_get(uint8_t *buf, uint8_t *val) {
    *val = *buf;
}

static inline void
buf_octets_get(uint8_t *buf, uint8_t *dst, int bytes) {
    MEMCPY(dst, buf, bytes);
}

static inline void
buf_ipv6_set(uint8_t *buf, of_ipv6_t *val) {
    /* FIXME:  If this is not a NO-OP, need to change the code */
#if 1
    MEMCPY(buf, val, sizeof(*val));
#else
    of_ipv6_t w_val;
    MEMCPY(&w_val, val sizeof(w_val));
    IPV6_HTON(w_val, w_val);
    MEMCPY(buf, &w_val, sizeof(w_val));
#endif
}

static inline void
buf_mac_addr_set(uint8_t *buf, of_mac_addr_t *val) {
    MEMCPY(buf, val, sizeof(of_mac_addr_t));
}

static inline void
buf_u64_set(uint8_t *buf, uint64_t val) {
    val = U64_HTON(val);
    MEMCPY(buf, &val, sizeof(uint64_t));
}

static inline void
buf_u32_set(uint8_t *buf, uint32_t val) {
    val = U32_HTON(val);
    MEMCPY(buf, &val, sizeof(uint32_t));
}

static inline void
buf_u16_set(uint8_t *buf, uint16_t val) {
    val = U16_NTOH(val);
    MEMCPY(buf, &val, sizeof(uint16_t));
}

static inline void
buf_u8_set(uint8_t *buf, uint8_t val) {
    *buf = val;
}

static inline void
buf_octets_set(uint8_t *buf, uint8_t *src, int bytes) {
    MEMCPY(buf, src, bytes);
}


#endif /* _OF_BUFFER_H_ */
