|
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
|