/** @file
 * @brief Network core definitions
 *
 * Definitions for networking support.
 */

/*
 * Copyright (c) 2015 Intel Corporation
 *
 * 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 __NET_CORE_H
#define __NET_CORE_H

#ifdef __cplusplus
extern "C" {
#endif

/* Network subsystem logging helpers */

#ifdef CONFIG_NETWORKING_WITH_LOGGING
#define NET_DBG(fmt, ...) printk("net: %s (%p): " fmt, __func__, \
				 sys_thread_self_get(), ##__VA_ARGS__)
#define NET_ERR(fmt, ...) printk("net: %s: " fmt, __func__, ##__VA_ARGS__)
#define NET_INFO(fmt, ...) printk("net: " fmt,  ##__VA_ARGS__)
#define NET_PRINT(fmt, ...) printk(fmt, ##__VA_ARGS__)
#else
#define NET_DBG(...)
#define NET_ERR(...)
#define NET_INFO(...)
#define NET_PRINT(...)
#endif /* CONFIG_NETWORKING_WITH_LOGGING */

struct net_buf;
struct net_context;

#include <misc/printk.h>
#include <string.h>

#include <net/net_socket.h>

/**
 * @brief Initialize network stack. This is will be automatically called
 * by the OS.
 *
 * @details No harm will happen if application calls this multiple times.
 *
 * @return 0 if ok, < 0 in case of error.
 */
int net_init(void);

struct net_driver {
	/** How much headroom is needed for net transport headers */
	size_t head_reserve;

	/** Open the net transport */
	int (*open)(void);

	/** Send data to net. The send() function should return:
	 * 0 : If packet could not be sent. In this case buf should
	 *     not be released.
	 * 1 : If the packet was sent successfully. In this case the buf
	 *     should be released by either the send() or some other
	 *     lower layer function.
	 * <0: If there is an error, the buf should not be released by
	 *     send() function.
	 */
	int (*send)(struct net_buf *buf);
};

/**
 * @brief Register a new network driver to the network stack.
 *
 * @details Only one network device can be registered at a time.
 *
 * @param drv Network driver.
 *
 * @return 0 if ok, < 0 in case of error.
 */
int net_register_driver(struct net_driver *drv);

/**
 * @brief Unregister a previously registered network driver.
 *
 * @param drv Network driver.
 *
 * @details Networking will be disabled if there is no driver
 * available.
 *
 */
void net_unregister_driver(struct net_driver *drv);

/**
 * @brief Set the MAC/EUI-64 address of the device.
 *
 * @details Network device driver should call this function to
 * tell the used MAC or EUI-64 address to the IP stack.
 *
 * @param mac MAC or EUI-64 address
 * @param len If len == 6, then the first parameter is interpreted
 * to be the MAC address and the function sets the U/L bits etc.
 * If the len == 8, then the value is used as is to generate the
 * link local IPv6 address.
 *
 * @return 0 if ok, < 0 in case of error.
 */
int net_set_mac(uint8_t *mac, uint8_t len);

/**
 * @brief Send a reply packet to the message originator.
 *
 * @details Application can call this function if it has received
 * a network packet from peer. The application needs to write
 * reply data into net_buf. The app can use ip_buf_appdata(buf) and
 * ip_buf_appdatalen(buf) to set the application data and length.
 *
 * @param context Network context
 * @param buf Network buffer containing the network data.
 *
 * @return 0 if ok, < 0 in case of error.
 */
int net_reply(struct net_context *context, struct net_buf *buf);

/* Called by driver when an IP packet has been received */
int net_recv(struct net_buf *buf);

void net_context_init(void);

#ifdef __cplusplus
}
#endif

#endif /* __NET_CORE_H */
