612 lines
18 KiB
C
612 lines
18 KiB
C
/* ipnet_nat.h - Public API of Wind River NAT */
|
|
|
|
/*
|
|
******************************************************************************
|
|
* HEADER FILE
|
|
*
|
|
* Document no: @(#) $Name: VXWORKS_ITER40_2019102207 $ $RCSfile: ipnet_nat.h,v $ $Revision: 1.15 $
|
|
* $Source: /home/interpeak/CVSRoot/ipnet2/include/ipnet_nat.h,v $
|
|
* $Author: kenneth $ $Date: 2008-03-14 12:51:34 $
|
|
* $State: Exp $ $Locker: $
|
|
*
|
|
* INTERPEAK_COPYRIGHT_STRING
|
|
* Design and implementation by Markus Carlstedt <markus@interpeak.se>
|
|
******************************************************************************
|
|
*/
|
|
#ifndef IPNET_NAT_H
|
|
#define IPNET_NAT_H
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 1 DESCRIPTION
|
|
****************************************************************************
|
|
* NAT API header file.
|
|
*/
|
|
|
|
/*
|
|
DESCRIPTION
|
|
This library contains the APIs used for configuration of Wind River NAT.
|
|
*/
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 2 CONFIGURATION
|
|
****************************************************************************
|
|
*/
|
|
|
|
#include "ipnet_config.h"
|
|
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 3 INCLUDE FILES
|
|
****************************************************************************
|
|
*/
|
|
|
|
#include <ipcom_type.h>
|
|
#include <ipcom_cstyle.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 4 DEFINES
|
|
****************************************************************************
|
|
*/
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 5 TYPES
|
|
****************************************************************************
|
|
*/
|
|
|
|
/*
|
|
*===========================================================================
|
|
* Ipnet_nat_proxy_tuple
|
|
*===========================================================================
|
|
* NAT proxy tuple structure
|
|
*/
|
|
typedef struct Ipnet_nat_proxy_tuple_struct
|
|
{
|
|
Ip_u16 private_port; /* Private side port */
|
|
Ip_u16 public_port; /* Public side port */
|
|
Ip_u32 private_addr; /* Private side address */
|
|
Ip_u32 public_addr; /* Public side address */
|
|
Ip_u8 protocol; /* Protocol */
|
|
}
|
|
Ipnet_nat_proxy_tuple;
|
|
|
|
|
|
/*
|
|
*===========================================================================
|
|
* Ipnet_nat_proxy_param_struct
|
|
*===========================================================================
|
|
* NAT proxy parameter structure.
|
|
*/
|
|
typedef struct Ipnet_nat_proxy_param_struct
|
|
{
|
|
Ipnet_nat_proxy_tuple tuple; /* Tuple */
|
|
Ip_u32 nat_addr; /* NAT address */
|
|
Ip_u16 nat_port; /* NAT port */
|
|
void *mapping; /* Pointer to NAT mapping */
|
|
Ip_bool inbound; /* IP_TRUE if mapping is inbound (created by redirect rule) */
|
|
Ip_bool incoming; /* IP_TRUE if packet was incoming (from public to private) */
|
|
Ip_bool natpt; /* IP_TRUE if packet matched a NAT-PT rule */
|
|
Ip_u32 prefix[3]; /* prefix for NAT-PT rules in network endian */
|
|
void *cookie; /* proxy cookie */
|
|
Ip_u32 fragid; /* Fragment identifier */
|
|
Ip_u16 fragoff; /* Fragment offset */
|
|
Ip_u8 fragmf; /* More fragments bit */
|
|
}
|
|
Ipnet_nat_proxy_param;
|
|
|
|
|
|
/*
|
|
*===========================================================================
|
|
* Ipnet_nat_proxy_func
|
|
*===========================================================================
|
|
* Description: NAT proxy function.
|
|
* Parameters: newhdr - pointer to optionally write new IP header.
|
|
* appdata - pointer to application data.
|
|
* applen - pointer to length of application data.
|
|
* Proxy function must uppdate 'applen' with new
|
|
* value if length is changed.
|
|
* growspace - space available to extend application data.
|
|
* param - pointer to proxy parameters.
|
|
* newdata - pointer to pointer to new application data
|
|
* to used if application data needs to be extended
|
|
* beyond growspace. Proxy function must allocate
|
|
* the buffer with ipcom_malloc() and place the
|
|
* pointer in 'newdata'.
|
|
* Returns: 1 = Packet modified.
|
|
* 0 = Packet untouched.
|
|
* -1 = Drop packet.
|
|
*/
|
|
typedef int (* Ipnet_nat_proxy_func) (Ip_u8 *newhdr,
|
|
Ip_u8 *appdata,
|
|
int *applen,
|
|
int growspace,
|
|
Ipnet_nat_proxy_param *param,
|
|
Ip_u8 **newdata);
|
|
|
|
/*
|
|
*===========================================================================
|
|
* Ipnet_nat_trigger
|
|
*===========================================================================
|
|
* Trigger proxy structure. To be used as cookie in the port trigger proxy
|
|
*/
|
|
typedef struct Ipnet_nat_trigger_struct
|
|
{
|
|
Ip_u8 protocol; /* IP_IPPROTO_TCP or IP_PROTO_UDP */
|
|
Ip_u16 portlo; /* Low port in interval */
|
|
Ip_u16 porthi; /* High port in interval */
|
|
Ip_u32 timeout; /* Timeout in seconds until ports close (0 means default) */
|
|
Ipnet_nat_proxy_func func; /* proxy function (optional) */
|
|
void *cookie; /* proxy cookie (optional) */
|
|
}
|
|
Ipnet_nat_trigger;
|
|
|
|
|
|
/*
|
|
*===========================================================================
|
|
* Ipnet_nat_proxy_timeout_handler
|
|
*===========================================================================
|
|
* NAT proxy timeout handler
|
|
*/
|
|
typedef void (*Ipnet_nat_proxy_timeout_handler)(void *cookie);
|
|
|
|
|
|
/*
|
|
****************************************************************************
|
|
* 6 FUNCTIONS
|
|
****************************************************************************
|
|
*/
|
|
|
|
IP_PUBLIC int ipnet_nat_proxy_ftp(Ip_u8 *newhdr,
|
|
Ip_u8 *appdata,
|
|
int *applen,
|
|
int growspace,
|
|
Ipnet_nat_proxy_param *param,
|
|
Ip_u8 **newdata);
|
|
|
|
|
|
IP_PUBLIC int ipnet_nat_proxy_dns(Ip_u8 *newhdr,
|
|
Ip_u8 *appdata,
|
|
int *applen,
|
|
int growspace,
|
|
Ipnet_nat_proxy_param *param,
|
|
Ip_u8 **newdata);
|
|
|
|
|
|
IP_PUBLIC int ipnet_nat_proxy_trigger(Ip_u8 *newhdr,
|
|
Ip_u8 *appdata,
|
|
int *applen,
|
|
int growspace,
|
|
Ipnet_nat_proxy_param *param,
|
|
Ip_u8 **newdata);
|
|
|
|
|
|
IP_PUBLIC int ipnet_nat_proxy_ipsec(Ip_u8 *newhdr,
|
|
Ip_u8 *appdata,
|
|
int *applen,
|
|
int growspace,
|
|
Ipnet_nat_proxy_param *param,
|
|
Ip_u8 **newdata);
|
|
|
|
|
|
IP_PUBLIC int ipnet_nat_proxy_pptp(Ip_u8 *newhdr,
|
|
Ip_u8 *appdata,
|
|
int *applen,
|
|
int growspace,
|
|
Ipnet_nat_proxy_param *param,
|
|
Ip_u8 **newdata);
|
|
|
|
|
|
IP_PUBLIC int ipnet_nat_proxy_h323(Ip_u8 *newhdr,
|
|
Ip_u8 *appdata,
|
|
int *applen,
|
|
int growspace,
|
|
Ipnet_nat_proxy_param *param,
|
|
Ip_u8 **newdata);
|
|
|
|
|
|
IP_PUBLIC int ipnet_nat_proxy_sip(Ip_u8 *newhdr,
|
|
Ip_u8 *appdata,
|
|
int *applen,
|
|
int growspace,
|
|
Ipnet_nat_proxy_param *param,
|
|
Ip_u8 **newdata);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipnet_nat_enable - enable NAT
|
|
*
|
|
* The ipnet_nat_enable() routine enables NAT and reads configuration settings
|
|
* for it.
|
|
*
|
|
* Parameters:
|
|
*
|
|
* None.
|
|
*
|
|
* RETURNS: Either 'IPCOM_SUCCESS' or an error code (see 'ipcom_err.h').
|
|
*
|
|
* ERRNO:
|
|
*/
|
|
IP_PUBLIC Ip_err ipnet_nat_enable(void);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipnet_nat_disable - disable NAT
|
|
*
|
|
* The ipnet_nat_disable() routine disables NAT and flushes all mappings.
|
|
*
|
|
* Parameters:
|
|
*
|
|
* None.
|
|
*
|
|
* RETURNS: Either 'IPCOM_SUCCESS' or an error code (see 'ipcom_err.h').
|
|
*
|
|
* ERRNO:
|
|
*/
|
|
IP_PUBLIC Ip_err ipnet_nat_disable(void);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipnet_nat_add_rule - add a NAT rule
|
|
*
|
|
* The ipnet_nat_add_rule() routine adds a NAT rule to the curent set of NAT
|
|
* rules.
|
|
*
|
|
* Parameter:
|
|
* \is
|
|
* \i <rule>
|
|
* A pointer to a string containing the rule.
|
|
* \ie
|
|
*
|
|
* RETURNS: Either 'IPCOM_SUCCESS' or an error code (see 'ipcom_err.h').
|
|
*
|
|
* ERRNO:
|
|
*/
|
|
IP_PUBLIC Ip_err ipnet_nat_add_rule
|
|
(
|
|
const char *rule
|
|
);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipnet_nat_remove_rule - remove a NAT rule
|
|
*
|
|
* The ipnet_nat_remove_rule() routine removes a NAT rule from the curent set of
|
|
* NAT rules.
|
|
*
|
|
* Parameter:
|
|
* \is
|
|
* \i <rule>
|
|
* A pointer to a string containing the rule.
|
|
* \ie
|
|
*
|
|
* RETURNS: Either 'IPCOM_SUCCESS' or an error code (see 'ipcom_err.h').
|
|
*
|
|
* ERRNO:
|
|
*/
|
|
IP_PUBLIC Ip_err ipnet_nat_remove_rule
|
|
(
|
|
const char *rule
|
|
);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipnet_nat_flush_rules - remove all NAT rules
|
|
*
|
|
* The ipnet_nat_flush_rules() routine removes all NAT rules.
|
|
*
|
|
* Parameters:
|
|
*
|
|
* None.
|
|
*
|
|
* RETURNS: Either 'IPCOM_SUCCESS' or an error code (see 'ipcom_err.h').
|
|
*
|
|
* ERRNO:
|
|
*/
|
|
IP_PUBLIC Ip_err ipnet_nat_flush_rules(void);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipnet_nat_flush_mappings - remove all NAT mappings
|
|
*
|
|
* The ipnet_nat_flush_mappings() routine removes all NAT mappings.
|
|
*
|
|
* Parameters:
|
|
*
|
|
* None.
|
|
*
|
|
* RETURNS: Either 'IPCOM_SUCCESS' or an error code (see 'ipcom_err.h').
|
|
*
|
|
* ERRNO:
|
|
*/
|
|
IP_PUBLIC Ip_err ipnet_nat_flush_mappings(void);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipnet_nat_proxy_add_mapping - add a public-to-private NAT mapping
|
|
*
|
|
* The ipnet_nat_proxy_add_mapping() routine adds a mapping between a host on the
|
|
* private side of the NAT and a host on the public side of the NAT. Such a
|
|
* mapping is typically used to open a port through the NAT, which is usually
|
|
* closed to incoming connections. It can also be used to open an outgoing path
|
|
* through the NAT, if there is no matching rule.
|
|
*
|
|
* The <proxy_tuple> parameter specifies the private and public addresses and
|
|
* ports, as well as the protocol. If the source port of the connecting host is
|
|
* unknown, it can be set to zero to allow any source port to be used. Likewise,
|
|
* if the source address of the connecting host is unknown, it can be set to zero
|
|
* to allow any host connect. Once the mapping has been used for the first time,
|
|
* it can only be used by the host that connected first. Setting both the
|
|
* the private and public addresses to zero is not allowed.
|
|
*
|
|
* The protocol can be any protocol, except for ICMP. For non-TCP/UDP protocols,
|
|
* the ports must be set to zero. Additionally, the source address can be set to
|
|
* zero to allow any host to connect. The source port is be the same on the
|
|
* private host and the NAT gateway unless the <use_napt> parameter is set to
|
|
* 'IP_TRUE'. In this case, a new port is automatically allocated and port
|
|
* translation takes place.
|
|
*
|
|
* Optionally, packets matching the mapping can be configured to call an
|
|
* application proxy if the <proxy_func> and <proxy_cookie> parameters are set.
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i <proxy_tuple>
|
|
* A pointer to the proxy tuple.
|
|
* \i <timeout>
|
|
* A timeout, after which the port is closed if no packets arrive. A timeout of
|
|
* '0' means that default values are applied).
|
|
* \i <parent>
|
|
* A pointer to the NAT mapping that caused the call to the proxy function. This
|
|
* pointer must have the same pointer value as was received in the call to
|
|
* the proxy function in the argument 'param-\>mapping'
|
|
* \i <use_napt>
|
|
* Set to 'IP_TRUE' for port translation.
|
|
* \i <use_inbound>
|
|
* Set to 'IP_TRUE' to indicate that the session will start inbound.
|
|
* \i <proxy_func>
|
|
* An optional proxy function.
|
|
* \i <proxy_cookie>
|
|
* An optional proxy cookie.
|
|
* \ie
|
|
*
|
|
* RETURNS: The NAT port, or '-1' on failure.
|
|
*
|
|
* ERRNO:
|
|
*/
|
|
IP_PUBLIC int ipnet_nat_proxy_add_mapping
|
|
(
|
|
Ipnet_nat_proxy_tuple *proxy_tuple,
|
|
Ip_u32 timeout,
|
|
void *parent,
|
|
Ip_bool use_napt,
|
|
Ip_bool use_inbound,
|
|
Ipnet_nat_proxy_func proxy_func,
|
|
void *proxy_cookie
|
|
);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipnet_nat_proxy_set_mapping_timeout - set a timeout for a mapping
|
|
*
|
|
* The ipnet_nat_proxy_set_mapping_timeout() routine sets a timeout for a
|
|
* mapping.
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i <sec>
|
|
* The number of seconds after which the mapping times out.
|
|
* \i <mapping>
|
|
* A pointer to the NAT mapping that caused the call to the proxy function. This
|
|
* pointer must have the same pointer value as was received in the call to
|
|
* the proxy function in the argument 'param-\>mapping'
|
|
* \ie
|
|
*
|
|
* RETURNS: No return value.
|
|
*
|
|
* ERRNO:
|
|
*/
|
|
IP_PUBLIC void ipnet_nat_proxy_set_mapping_timeout
|
|
(
|
|
Ip_u32 sec,
|
|
void *mapping
|
|
);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipnet_nat_proxy_get_time - return the elapsed time since the last boot
|
|
*
|
|
* The ipnet_nat_proxy_get_time() routine returns the time elapsed since booting,
|
|
* in seconds.
|
|
*
|
|
* Parameters:
|
|
*
|
|
* None.
|
|
*
|
|
* RETURNS: The number of seconds since booting.
|
|
*
|
|
* ERRNO:
|
|
*/
|
|
IP_PUBLIC Ip_u32 ipnet_nat_proxy_get_time(void);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipnet_nat_proxy_timeout_schedule - schedule a timeout handler
|
|
*
|
|
* The ipnet_nat_proxy_timeout_schedule() routine sets a
|
|
* timeout period, in seconds, after which a user-defined timeout handler is
|
|
* called.
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i <sec>
|
|
* The length of time, in seconds, after which the function is called.
|
|
* \i <handler>
|
|
* A pointer to the function to be called.
|
|
* \i <cookie>
|
|
* A cookie for use by the called function.
|
|
* \i <ptmo>
|
|
* A pointer that stores the location of a pointer to the timeout structure used
|
|
* by the timeout handler. The pointer must be provided by the user and kept until
|
|
* the timeout handler has been called.
|
|
* \ie
|
|
*
|
|
* RETURNS: '0' for success; a negative value for failure.
|
|
*
|
|
* ERRNO:
|
|
*/
|
|
IP_PUBLIC int ipnet_nat_proxy_timeout_schedule
|
|
(
|
|
Ip_u32 sec,
|
|
Ipnet_nat_proxy_timeout_handler handler,
|
|
void *cookie,
|
|
void **ptmo
|
|
);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipnet_nat_proxy_timeout_reschedule - reschedule a timeout handler
|
|
*
|
|
* The ipnet_nat_proxy_timeout_reschedule() routine resets the timeout period, in
|
|
* seconds, on a running timer with a new timeout period, after which a
|
|
* user-defined timeout handler is called.
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i <sec>
|
|
* The length of time, in seconds, after which the function is called.
|
|
* \i <handler>
|
|
* A pointer to the function to be called.
|
|
* \i <cookie>
|
|
* A cookie for use by the called function.
|
|
* \i <ptmo>
|
|
* A pointer that stores the location of a pointer to the timeout structure used
|
|
* by the timeout handler. The pointer must be provided by the user and kept until
|
|
* the timeout handler has been called.
|
|
* \ie
|
|
*
|
|
* RETURNS: '0' for success; a negative value for failure.
|
|
*
|
|
* ERRNO:
|
|
*/
|
|
IP_PUBLIC int ipnet_nat_proxy_timeout_reschedule
|
|
(
|
|
Ip_u32 sec,
|
|
Ipnet_nat_proxy_timeout_handler handler,
|
|
void *cookie,
|
|
void **ptmo
|
|
);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipnet_nat_proxy_timeout_cancel - cancel a timeout
|
|
*
|
|
* The ipnet_nat_proxy_timeout_cancel() routine cancels a scheduled timeout.
|
|
*
|
|
* Parameter:
|
|
* \is
|
|
* \i <tmo>
|
|
* A pointer to the timeout structure.
|
|
* \ie
|
|
*
|
|
* RETURNS: No return value.
|
|
*
|
|
* ERRNO:
|
|
*/
|
|
IP_PUBLIC void ipnet_nat_proxy_timeout_cancel
|
|
(
|
|
void *tmo
|
|
);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipnet_nat_add_proxy - add a proxy to NAT
|
|
*
|
|
* The ipnet_nat_add_proxy() routine adds a proxy (ALG) to NAT.
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i <label>
|
|
* An ASCII string identifier.
|
|
* \i <proto>
|
|
* The IP protocol the proxy applies to. Either a protocol name or numerical
|
|
* string is allowed.
|
|
* \i <func>
|
|
* A pointer to the ALG function.
|
|
* \i <cookie>
|
|
* A cookie that is supplied in the call to the proxy function. The memory
|
|
* location referred to by the cookie must be valid as long as the proxy has not
|
|
* been removed.
|
|
* \ie
|
|
*
|
|
* RETURNS: Either 'IPCOM_SUCCESS' or an error code (see 'ipcom_err.h').
|
|
*
|
|
* ERRNO:
|
|
*/
|
|
IP_PUBLIC Ip_err ipnet_nat_add_proxy
|
|
(
|
|
const char *label,
|
|
const char *proto,
|
|
Ipnet_nat_proxy_func func, void *cookie
|
|
);
|
|
|
|
|
|
/*******************************************************************************
|
|
*
|
|
* ipnet_nat_remove_proxy - remove a proxy from NAT
|
|
*
|
|
* The ipnet_nat_remove_proxy() routine removes a proxy (ALG) from NAT.
|
|
*
|
|
* Parameters:
|
|
* \is
|
|
* \i <label>
|
|
* An ASCII string identifier.
|
|
* \i <proto>
|
|
* The IP protocol the proxy applies to. Either a protocol name or numerical
|
|
* string is allowed.
|
|
* \ie
|
|
*
|
|
* RETURNS: Either 'IPCOM_SUCCESS' or an error code (see 'ipcom_err.h').
|
|
*
|
|
* ERRNO:
|
|
*/
|
|
IP_PUBLIC Ip_err ipnet_nat_remove_proxy
|
|
(
|
|
const char *label,
|
|
const char *proto
|
|
);
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
|
|
#endif
|
|
|
|
/*
|
|
****************************************************************************
|
|
* END OF FILE
|
|
****************************************************************************
|
|
*/
|