Blame src/vma/util/libvma.h

Packit 6d2c1b
/*
Packit 6d2c1b
 * Copyright (c) 2001-2020 Mellanox Technologies, Ltd. All rights reserved.
Packit 6d2c1b
 *
Packit 6d2c1b
 * This software is available to you under a choice of one of two
Packit 6d2c1b
 * licenses.  You may choose to be licensed under the terms of the GNU
Packit 6d2c1b
 * General Public License (GPL) Version 2, available from the file
Packit 6d2c1b
 * COPYING in the main directory of this source tree, or the
Packit 6d2c1b
 * BSD license below:
Packit 6d2c1b
 *
Packit 6d2c1b
 *     Redistribution and use in source and binary forms, with or
Packit 6d2c1b
 *     without modification, are permitted provided that the following
Packit 6d2c1b
 *     conditions are met:
Packit 6d2c1b
 *
Packit 6d2c1b
 *      - Redistributions of source code must retain the above
Packit 6d2c1b
 *        copyright notice, this list of conditions and the following
Packit 6d2c1b
 *        disclaimer.
Packit 6d2c1b
 *
Packit 6d2c1b
 *      - Redistributions in binary form must reproduce the above
Packit 6d2c1b
 *        copyright notice, this list of conditions and the following
Packit 6d2c1b
 *        disclaimer in the documentation and/or other materials
Packit 6d2c1b
 *        provided with the distribution.
Packit 6d2c1b
 *
Packit 6d2c1b
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Packit 6d2c1b
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Packit 6d2c1b
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Packit 6d2c1b
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
Packit 6d2c1b
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
Packit 6d2c1b
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
Packit 6d2c1b
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
Packit 6d2c1b
 * SOFTWARE.
Packit 6d2c1b
 */
Packit 6d2c1b
Packit 6d2c1b
Packit 6d2c1b
#ifndef _LIBVMA_H
Packit 6d2c1b
#define _LIBVMA_H
Packit 6d2c1b
Packit 6d2c1b
#include <netinet/in.h>
Packit 6d2c1b
Packit 6d2c1b
#include "vtypes.h"
Packit 6d2c1b
#include "vma/lwip/opt.h"
Packit 6d2c1b
Packit 6d2c1b
/* --------------------------------------------------------------------- */
Packit 6d2c1b
/* library static and global variables                                   */
Packit 6d2c1b
/* --------------------------------------------------------------------- */
Packit 6d2c1b
Packit 6d2c1b
/* max string length to store any IPv4/IPv6 address */
Packit 6d2c1b
#define MAX_ADDR_STR_LEN 49
Packit 6d2c1b
#define MAX_IF_NAME_LEN 10
Packit 6d2c1b
#define MAX_CONF_FILE_ENTRY_STR_LEN 512
Packit 6d2c1b
// from lwip
Packit 6d2c1b
#define NETIF_MAX_HWADDR_LEN 6U
Packit 6d2c1b
Packit 6d2c1b
#ifdef __cplusplus
Packit 6d2c1b
extern "C" {
Packit 6d2c1b
#endif
Packit 6d2c1b
Packit 6d2c1b
typedef enum
Packit 6d2c1b
{
Packit 6d2c1b
	ROLE_TCP_SERVER,
Packit 6d2c1b
	ROLE_TCP_CLIENT,
Packit 6d2c1b
	ROLE_UDP_RECEIVER,
Packit 6d2c1b
	ROLE_UDP_SENDER,
Packit 6d2c1b
	ROLE_UDP_CONNECT
Packit 6d2c1b
} role_t;
Packit 6d2c1b
Packit 6d2c1b
typedef enum {
Packit 6d2c1b
	TRANS_OS = 1,
Packit 6d2c1b
	TRANS_VMA,
Packit 6d2c1b
	TRANS_SDP,
Packit 6d2c1b
	TRANS_SA,
Packit 6d2c1b
	TRANS_ULP,
Packit 6d2c1b
	TRANS_DEFAULT
Packit 6d2c1b
} transport_t;
Packit 6d2c1b
Packit 6d2c1b
typedef enum {
Packit 6d2c1b
	PROTO_UNDEFINED,
Packit 6d2c1b
	PROTO_UDP,
Packit 6d2c1b
	PROTO_TCP,
Packit 6d2c1b
	PROTO_ALL
Packit 6d2c1b
} in_protocol_t;
Packit 6d2c1b
Packit 6d2c1b
typedef enum {
Packit 6d2c1b
	DEV_CLONE,
Packit 6d2c1b
	DEV_REPLACE
Packit 6d2c1b
} dev_conf_mode_t;
Packit 6d2c1b
Packit 6d2c1b
typedef enum {
Packit 6d2c1b
	IN_ADDR_DHCP,
Packit 6d2c1b
	IN_ADDR_STATIC
Packit 6d2c1b
} in_addr_alloc_mode_t;
Packit 6d2c1b
Packit 6d2c1b
typedef enum {
Packit 6d2c1b
	MAC_AUTO_GEN,
Packit 6d2c1b
	MAC_MANUAL
Packit 6d2c1b
} mac_alloc_mode_t;
Packit 6d2c1b
Packit 6d2c1b
Packit 6d2c1b
/* some state to string functions */
Packit 6d2c1b
static inline const char *__vma_get_transport_str(transport_t transport )
Packit 6d2c1b
{
Packit 6d2c1b
	switch (transport) {
Packit 6d2c1b
	case TRANS_OS:
Packit 6d2c1b
		return "OS";
Packit 6d2c1b
		break;
Packit 6d2c1b
	case TRANS_VMA:
Packit 6d2c1b
		return "VMA";
Packit 6d2c1b
		break;
Packit 6d2c1b
	case TRANS_SDP:
Packit 6d2c1b
		return "SDP";
Packit 6d2c1b
		break;
Packit 6d2c1b
	case TRANS_SA:
Packit 6d2c1b
		return "SA";
Packit 6d2c1b
		break;
Packit 6d2c1b
	case TRANS_ULP:
Packit 6d2c1b
		return "ULP";
Packit 6d2c1b
		break;
Packit 6d2c1b
	case TRANS_DEFAULT:
Packit 6d2c1b
		return "DEFAULT";
Packit 6d2c1b
		break;
Packit 6d2c1b
	}
Packit 6d2c1b
	return ( "UNKNOWN-TRANSPORT" );
Packit 6d2c1b
}
Packit 6d2c1b
Packit 6d2c1b
/* some state to string functions */
Packit 6d2c1b
static inline const char *__vma_get_protocol_str(in_protocol_t protocol)
Packit 6d2c1b
{
Packit 6d2c1b
	switch (protocol) {
Packit 6d2c1b
	case PROTO_UNDEFINED: 	return "UNDEFINED";
Packit 6d2c1b
	case PROTO_UDP:		return "UDP";
Packit 6d2c1b
	case PROTO_TCP:		return "TCP";
Packit 6d2c1b
	case PROTO_ALL:		return "*";
Packit 6d2c1b
	default:
Packit 6d2c1b
		break;
Packit 6d2c1b
	}
Packit 6d2c1b
	return ("unknown-protocol");
Packit 6d2c1b
}
Packit 6d2c1b
Packit 6d2c1b
static inline const char *__vma_get_role_str(int role)
Packit 6d2c1b
{
Packit 6d2c1b
	switch (role) {
Packit 6d2c1b
		case ROLE_TCP_CLIENT:
Packit 6d2c1b
			return("tcp_client");
Packit 6d2c1b
			break;
Packit 6d2c1b
		case ROLE_TCP_SERVER:
Packit 6d2c1b
			return("tcp_server");
Packit 6d2c1b
			break;
Packit 6d2c1b
		case ROLE_UDP_RECEIVER:
Packit 6d2c1b
			return("udp_receiver");
Packit 6d2c1b
			break;
Packit 6d2c1b
		case ROLE_UDP_SENDER:
Packit 6d2c1b
			return("udp_sender");
Packit 6d2c1b
			break;
Packit 6d2c1b
		case ROLE_UDP_CONNECT:
Packit 6d2c1b
			return("udp_connect");
Packit 6d2c1b
			break;
Packit 6d2c1b
		default:
Packit 6d2c1b
			break;
Packit 6d2c1b
	}
Packit 6d2c1b
	return("unknown role");
Packit 6d2c1b
}
Packit 6d2c1b
Packit 6d2c1b
struct dbl_lst_node
Packit 6d2c1b
{
Packit 6d2c1b
	struct dbl_lst_node *prev, *next;
Packit 6d2c1b
	void *data;
Packit 6d2c1b
};
Packit 6d2c1b
Packit 6d2c1b
struct dbl_lst
Packit 6d2c1b
{
Packit 6d2c1b
	struct dbl_lst_node *head;
Packit 6d2c1b
	struct dbl_lst_node *tail;
Packit 6d2c1b
};
Packit 6d2c1b
Packit 6d2c1b
struct address_port_rule
Packit 6d2c1b
{
Packit 6d2c1b
	int match_by_addr;			/* if 0 ignore address match		*/
Packit 6d2c1b
	struct in_addr ipv4;			/* IPv4 address for mapping		*/
Packit 6d2c1b
	unsigned char prefixlen;		/* length of CIDR prefix (ie /24)	*/
Packit 6d2c1b
	int match_by_port;			/* if 0 ignore port match		*/
Packit 6d2c1b
	unsigned short sport, eport;		/* start port - end port, inclusive	*/
Packit 6d2c1b
};
Packit 6d2c1b
Packit 6d2c1b
/* data structure for holding address family mapping rules */
Packit 6d2c1b
/* note we filter non relevant programs during parsing ...  */
Packit 6d2c1b
struct use_family_rule
Packit 6d2c1b
{
Packit 6d2c1b
	struct address_port_rule first;
Packit 6d2c1b
	struct address_port_rule second;
Packit 6d2c1b
	unsigned char use_second;
Packit 6d2c1b
	transport_t target_transport;		/* if match - use this transport	*/
Packit 6d2c1b
	in_protocol_t protocol;			/* protocol family for mapping		*/
Packit 6d2c1b
};
Packit 6d2c1b
Packit 6d2c1b
/* data structure for holding the devices vma will handle */
Packit 6d2c1b
struct vma_device
Packit 6d2c1b
{
Packit 6d2c1b
	dev_conf_mode_t conf_mode;		/* clone or replace insterface		*/
Packit 6d2c1b
	u8_t hw_addr[NETIF_MAX_HWADDR_LEN];	/* interface physical address		*/
Packit 6d2c1b
	u8_t hw_addr_len;			/* interface physical address length	*/
Packit 6d2c1b
	in_addr_alloc_mode_t in_addr_alloc_mode;/* static or dhcp			*/
Packit 6d2c1b
	mac_alloc_mode_t mac_alloc_mode;	/* manual or autogen			*/
Packit 6d2c1b
	struct in_addr ipv4;			/* interface IPv4 address 		*/
Packit 6d2c1b
	unsigned char prefixlen;		/* prefix len of interface IPv4 address */
Packit 6d2c1b
	char if_name[MAX_IF_NAME_LEN + 1];	/*base interface name			*/
Packit 6d2c1b
};
Packit 6d2c1b
Packit 6d2c1b
struct instance_id
Packit 6d2c1b
{
Packit 6d2c1b
	char *prog_name_expr;
Packit 6d2c1b
	char *user_defined_id;
Packit 6d2c1b
};
Packit 6d2c1b
Packit 6d2c1b
/* data structure for holding the instances descriptors */
Packit 6d2c1b
struct instance
Packit 6d2c1b
{
Packit 6d2c1b
	struct instance_id id;			/* instance id				*/
Packit 6d2c1b
	struct dbl_lst tcp_clt_rules_lst;	/* tcp client's rules list		*/
Packit 6d2c1b
	struct dbl_lst tcp_srv_rules_lst;	/* tcp server's rules list		*/
Packit 6d2c1b
	struct dbl_lst udp_snd_rules_lst;	/* udp sender rules list		*/
Packit 6d2c1b
	struct dbl_lst udp_rcv_rules_lst;	/* udp receiver rules list		*/
Packit 6d2c1b
	struct dbl_lst udp_con_rules_lst;	/* udp connect rules list		*/
Packit 6d2c1b
};
Packit 6d2c1b
Packit 6d2c1b
extern struct dbl_lst __instance_list;
Packit 6d2c1b
extern int __vma_min_level;
Packit 6d2c1b
Packit 6d2c1b
#define VMA_NETMASK(n) ((n == 0) ? 0 : ~((1UL<<(32 - n)) - 1))
Packit 6d2c1b
#define IF_NAME_LEN 10
Packit 6d2c1b
Packit 6d2c1b
/* match.cpp */
Packit 6d2c1b
transport_t __vma_match_tcp_client(transport_t my_transport, const char *app_id, const struct sockaddr *sin_first, const socklen_t  sin_addrlen_first, const struct sockaddr *sin_second, const socklen_t  sin_addrlen_second);
Packit 6d2c1b
Packit 6d2c1b
transport_t __vma_match_tcp_server(transport_t my_transport, const char *app_id, const struct sockaddr *sin, const socklen_t  addrlen);
Packit 6d2c1b
Packit 6d2c1b
transport_t __vma_match_udp_sender(transport_t my_transport, const char *app_id, const struct sockaddr * sin, const socklen_t addrlen);
Packit 6d2c1b
Packit 6d2c1b
transport_t __vma_match_udp_receiver(transport_t my_transport, const char *app_id, const struct sockaddr * sin, const socklen_t addrlen);
Packit 6d2c1b
Packit 6d2c1b
transport_t __vma_match_udp_connect(transport_t my_transport, const char *app_id, const struct sockaddr *sin_first, const socklen_t  sin_addrlen_first, const struct sockaddr *sin_second, const socklen_t  sin_addrlen_second);
Packit 6d2c1b
Packit 6d2c1b
/* config.c */
Packit 6d2c1b
int __vma_config_empty(void);
Packit 6d2c1b
Packit 6d2c1b
int __vma_parse_config_file(const char *config_file);
Packit 6d2c1b
Packit 6d2c1b
int __vma_parse_config_line(const char *config_line);
Packit 6d2c1b
Packit 6d2c1b
void __vma_print_conf_file(struct dbl_lst conf_lst);
Packit 6d2c1b
Packit 6d2c1b
void __vma_free_resources(void);
Packit 6d2c1b
Packit 6d2c1b
int __vma_match_program_name(struct instance *instance);
Packit 6d2c1b
Packit 6d2c1b
int __vma_match_user_defined_id(struct instance *instance, const char *app_id);
Packit 6d2c1b
Packit 6d2c1b
transport_t __vma_match_by_program(in_protocol_t my_protocol, const char *app_id);
Packit 6d2c1b
Packit 6d2c1b
/* log.c */
Packit 6d2c1b
#if 0
Packit 6d2c1b
static inline
Packit 6d2c1b
void __vma_log(
Packit 6d2c1b
	int level,
Packit 6d2c1b
	char *format,
Packit 6d2c1b
	... )
Packit 6d2c1b
{
Packit 6d2c1b
	NOT_IN_USE(level)
Packit 6d2c1b
	vlog_
Packit 6d2c1b
};
Packit 6d2c1b
#endif
Packit 6d2c1b
Packit 6d2c1b
#define __vma_log(level, format, args...) \
Packit 6d2c1b
	printf(format, ##args)
Packit 6d2c1b
Packit 6d2c1b
static inline int __vma_log_get_level(void)
Packit 6d2c1b
{
Packit 6d2c1b
	return __vma_min_level;
Packit 6d2c1b
}
Packit 6d2c1b
Packit 6d2c1b
static inline void __vma_log_set_min_level(int level )
Packit 6d2c1b
{
Packit 6d2c1b
	__vma_min_level= level;
Packit 6d2c1b
};
Packit 6d2c1b
Packit 6d2c1b
//TODO AlexV: implement this function
Packit 6d2c1b
static inline int __vma_log_set_log_stderr(void) {return 0;};
Packit 6d2c1b
Packit 6d2c1b
//TODO AlexV: implement this function
Packit 6d2c1b
static inline int __vma_log_set_log_syslog(void) {return 0;};
Packit 6d2c1b
Packit 6d2c1b
//TODO AlexV: implement this function
Packit 6d2c1b
static inline int __vma_log_set_log_file(char *filename )
Packit 6d2c1b
{
Packit 6d2c1b
	NOT_IN_USE(filename);
Packit 6d2c1b
	return 0;
Packit 6d2c1b
};
Packit 6d2c1b
Packit 6d2c1b
int __vma_sockaddr_to_vma(const struct sockaddr *addr_in, socklen_t addrlen, struct sockaddr_in *addr_out, int *was_ipv6 );
Packit 6d2c1b
Packit 6d2c1b
#ifdef __cplusplus
Packit 6d2c1b
};
Packit 6d2c1b
#endif
Packit 6d2c1b
Packit 6d2c1b
#endif