Linux Audio

Check our new training course

Loading...
/*
 * Copyright (c) 2016 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.
 */

/**
 * @file
 * @brief Public API for network interface
 */

#ifndef __NET_IF_H__
#define __NET_IF_H__

#include <device.h>

#include <net/net_linkaddr.h>
#include <net/net_ip.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief Network Interface unicast IP addresses
 *
 * Stores the unicast IP addresses assigned to this network interface.
 *
 */
struct net_if_addr {
	/** Is this IP address used or not */
	bool is_used;

	/** IP address */
	struct net_addr address;

	/** How the IP address was set */
	enum net_addr_type addr_type;

	/** What is the current state of the address */
	enum net_addr_state addr_state;

	/** Is the IP address valid forever */
	bool is_infinite;

	/** Timer that triggers renewal */
	struct nano_timer lifetime;

#if defined(CONFIG_NET_IPV6)
	/** Duplicate address detection (DAD) timer */
	struct nano_timer dad_timer;

	/** How many times we have done DAD */
	uint8_t dad_count;
#endif /* CONFIG_NET_IPV6 */
};

/**
 * @brief Network Interface structure
 *
 * Used to handle a network interface on top of a device driver instance.
 * There can be many net_if instance against the same device.
 *
 * Such interface is mainly to be used by the link layer, but is also tight
 * to a network context: it then makes the relation with a network context
 * and the network device.
 *
 * Because of the strong relationship between a device driver and such
 * network interface, each net_if should be instanciated by
 */
struct net_if {
	/** The actualy device driver instance the net_if is related to */
	struct device *dev;

	/** The harware link address */
	struct net_linkaddr link_addr;

	/** The hardware MTU */
	uint16_t mtu;

#if defined(CONFIG_NET_IPV6)
#define NET_IF_MAX_IPV6_ADDR CONFIG_NET_IFACE_UNICAST_IPV6_ADDR_COUNT
	struct {
		/** Unicast IP addresses */
		struct net_if_addr unicast[NET_IF_MAX_IPV6_ADDR];
	} ipv6;

	uint8_t hop_limit;
#endif /* CONFIG_NET_IPV6 */
};

/**
 * @brief Get an network interface's device
 * @param iface Pointer to a network interface structure
 * @return a pointer on the device driver instance
 */
static inline struct device *net_if_get_device(struct net_if *iface)
{
	return iface->dev;
}

/**
 * @brief Get an network interface's link address
 * @param iface Pointer to a network interface structure
 * @return a pointer on the network link address
 */
static inline struct net_linkaddr *net_if_get_link_addr(struct net_if *iface)
{
	return &iface->link_addr;
}

/**
 * @brief Set a network interfac's link address
 * @param iface Pointer to a network interface structure
 * @param addr a pointer on a uint8_t buffer representing the address
 * @param len length of the address buffer
 */
static inline void net_if_set_link_addr(struct net_if *iface,
					uint8_t *addr, uint8_t len)
{
	iface->link_addr.addr = addr;
	iface->link_addr.len = len;
}

/**
 * @brief Get an network interface's MTU
 * @param iface Pointer to a network interface structure
 * @return the MTU
 */
static inline uint16_t net_if_get_mtu(struct net_if *iface)
{
	return iface->mtu;
}

struct net_if_api {
	void (*init)(struct net_if *iface);
};

#define NET_IF_INIT(...)

/* Network device intialization macro */

#define NET_DEVICE_INIT(dev_name, drv_name, init_fn,		\
			data, cfg_info, prio, api, mtu)		\
	DEVICE_AND_API_INIT(dev_name, drv_name, init_fn, data,	\
			    cfg_info, NANOKERNEL, prio, api);	\
	NET_IF_INIT(dev_name, 0, mtu)

#ifdef __cplusplus
}
#endif

#endif /* __NET_IFACE_H__ */