/* iprohc.h - ROHC head file */ /* * Copyright (c) 2008 Wind River Systems, Inc. * * The right to copy, distribute or otherwise make use of this software * may be licensed only pursuant to the terms of an applicable Wind River * license agreement. No license to Wind River intellectual property rights * is granted herein. All rights not licensed by Wind River are reserved * by Wind River. */ /* modification history -------------------- 01i,20oct11,ggz Defect WIND00351290. Use ipcom_mutex_lock for unix port 01h,20oct11,ggz Fix for defect WIND00312450 01g,01oct11,ggz Added capability to simulate various ipid change pattern 01f,22feb10,ggz Add TCP/IP profiles 01e,03dec09,ggz Add iprohc_d_choose_profile() for decompressor. Add ESP,UDP profiles 01d,24feb09,tlu Replace ipcom_tmo by ipnet timer untilities to port to LKM 01c,25jun08,tlu Add reference list structure definition 01b,23apr08,tlu Add external declaration for iprohc 01a,20feb08,tlu Created. */ #ifndef IPROHC_H #define IPROHC_H /* **************************************************************************** * INCLUDE FILES **************************************************************************** */ #include #include #include #include #include #include #include #include #ifdef IPNET #include #endif #include "iprohc_config.h" #include "iprohc_constant.h" #include "iprohc_comp.h" #include "iprohc_decomp.h" #include "iprohc_parser.h" /* **************************************************************************** * DEFINES **************************************************************************** */ #define IPROHC_ENABLE_REENTRANT #ifdef IPROHC_ENABLE_REENTRANT #if defined(IP_PORT_VXWORKS) || defined(IP_PORT_UNIX) #define IPROHC_LOCK() ipcom_mutex_lock(iprohc.code_mutex) #define IPROHC_UNLOCK() ipcom_mutex_unlock(iprohc.code_mutex) #define IPROHC_IF_LOCK(interface) ipcom_mutex_lock((interface)->code_mutex) #define IPROHC_IF_UNLOCK(interface) ipcom_mutex_unlock((interface)->code_mutex) #else /* !IP_PORT_VXWORKS, Linux recursive semaphore */ #define IPROHC_LOCK() iprohc_lck() #define IPROHC_UNLOCK() iprohc_unlck() #define IPROHC_IF_LOCK(interface) iprohc_if_lck(interface) #define IPROHC_IF_UNLOCK(interface) iprohc_if_unlck(interface) #endif /* IP_PORT_VXWORKS */ #else #define IPROHC_LOCK() IP_NOOP #define IPROHC_UNLOCK() IP_NOOP #define IPROHC_IF_LOCK(interface) IP_NOOP #define IPROHC_IF_UNLOCK(interface) IP_NOOP #endif /* Syslog priority and facility. */ #undef IPCOM_SYSLOG_PRIORITY #if defined(_WRS_CONFIG_IPROHC_SYSLOG_PRIORITY) #define IPCOM_SYSLOG_PRIORITY _WRS_CONFIG_IPROHC_SYSLOG_PRIORITY #else #define IPCOM_SYSLOG_PRIORITY IPCOM_SYSLOG_PRIO_DEFAULT #endif #undef IPCOM_SYSLOG_FACILITY #define IPCOM_SYSLOG_FACILITY IPCOM_LOG_IPROHC #define IPROHC_LEAVE(xerrval) do { retval = xerrval; goto leave; } while(0) #define IPROHC_ERROUT(xerrval) do { retval = xerrval; goto errout; } while(0) #define IPROHC_VALID_PROFILE_ID(id) ((id == ROHC_PROFILE_UNCOMPRESSED) || \ (id == ROHC_PROFILE_UDP_IP) || \ (id == ROHC_PROFILE_ESP_IP) || \ (id == ROHC_PROFILE_IP) || \ (id == ROHC_PROFILE_TCP_IP)) /* **************************************************************************** * Public TYPES **************************************************************************** */ #ifdef __cplusplus extern "C" { #endif /* *=========================================================================== * Iprohc_ref_list *=========================================================================== * This is the ROHC reference list structure */ typedef struct Iprohc_ref_list_struct { Ipcom_list ref_list; Ip_u8 index; Ip_u8 type; Ip_u8 length; Ip_u8 *data; } Iprohc_ref_list; /* **************************************************************************** * LOCAL TYPES **************************************************************************** */ /* *=========================================================================== * Iprohc_feedback *=========================================================================== * This is the ROHC feedback structure */ typedef struct Iprohc_feedback_struct { Ipcom_list feedback_list; /* Whether the packet is to be transmitted or not */ Ip_bool to_be_transmitted; /* an IPv4 or IPv6 packet */ Ip_u8 packet_type; /* The destination address to send the feedback to */ Iprohc_addr dst; /* The source address the feedback is for */ Iprohc_addr src; /* Buffer contaions an already formatted feedback packet */ Ip_u16 size; Ip_u8 data[IPROHC_MAX_FEEDBCK_BUF]; } Iprohc_feedback; /* *=========================================================================== * Iprohc_interface *=========================================================================== * This is the ROHC monitoring interface structure */ typedef struct Iprohc_interface_struct { Ipcom_list interface_list; /* interface name, such as "fei", or "motfcc" */ char name[IPROHC_IF_NAME_MAX]; /* wheter have interface unit number */ Ip_bool have_unitNum; /* interface unit number, such as 1, 2 */ Ip_u8 unitNum; /* Record Ipcom_netif interface structure */ Ipcom_netif *netif; /* Profile list, value 1 means configured, 0 means not configured */ /* The index profile ID is defined by RFC 3095, RFC 3843 */ Ip_u16 profile_num; /* number of supported profiles */ Ip_bool profiles[IPROHC_MAX_PROFILE_IDS]; /* Feedback buffer */ Ip_u16 feedback_num[IPROHC_MAX_PROFILE_IDS]; /* number of feedbacks */ Ipcom_list feedback_head[IPROHC_MAX_PROFILE_IDS]; /* Compressor structure list */ Iprohc_compressor *compressor; /* De-compressor structure ist */ Iprohc_decompressor *decompressor; #ifdef IPROHC_ENABLE_REENTRANT Ipcom_mutex code_mutex; /* Mutex to protect IPROHC interface data. */ #endif #ifndef IP_PORT_VXWORKS /* for Linux recursive semaphore */ /* the process that currently holds the semaphore and taken counter */ Ip_pid_t pid; Ip_u8 s_counter; #endif /* !IP_PORT_VXWORKS */ } Iprohc_interface; /* *=========================================================================== * Iprohc_profile *=========================================================================== * This is the ROHC profile structure */ struct Iprohc_profile; typedef struct Iprohc_profile_struct { /* Configured, value 1 means configured, 0 means not configured */ Ip_bool configured; /* Profile specific functions */ /* De-register profile specific functions, and free any contents */ Ip_err (*p_deregister) (void); /* Profile compression functions */ /* Find a compression context associated with the packet */ Ip_err (*c_find_context) (Iprohc_compressor *comp, Ipcom_pkt *pkt, Iprohc_c_context **c_context); /* Create a compression context associated with the packet */ Iprohc_c_context * (*c_create_context) (Iprohc_compressor *comp, Ipcom_pkt *pkt); /* Free a compression context */ Ip_err (*c_del_context) (Iprohc_c_context *context); /* Process a feedback element */ Ip_err (*c_process_feedback) (Iprohc_c_context *context, Ip_u8 *feedback, Ip_u8 size); /* Compress a packet */ Ip_err (*c_compress) (Iprohc_c_context *context, Ipcom_pkt *pkt); /* Debug: print a compression context */ void (*c_print_context) (Iprohc_c_context *context); /* Profile de-compression functions */ /* Find a de-compression context associated with the packet */ Iprohc_d_context * (*d_find_context) (Iprohc_decompressor *decomp, Ipcom_pkt *pkt); /* Create a de-compression context associated with the packet */ Iprohc_d_context * (*d_create_context) (Iprohc_decompressor *decomp, Ipcom_pkt *pkt); /* Free a de-compression context */ Ip_err (*d_del_context) (Iprohc_d_context *context); /* De-compress a packet */ Ip_err (*d_decompress) (Iprohc_d_context *context, Ipcom_pkt *pkt); /* Debug: print a de-compression context */ void (*d_print_context) (Iprohc_d_context *context); } Iprohc_profile; /* *=========================================================================== * IPROHC data *=========================================================================== */ typedef struct Iprohc_data_struct { Ip_bool opened; #ifdef IPROHC_ENABLE_REENTRANT Ipcom_mutex code_mutex; /* Mutex to protect IPROHC global data. */ #endif /* ROHC monitoring interfaces */ Ip_u16 if_num; /* number of monitoring IFs. */ Ipcom_list if_head; /* Profile list, indexed by a profile id */ /* The profile ID is defined by RFC 3095, RFC 3843 */ Ip_u16 profile_num; /* number of supported profiles */ Iprohc_profile profiles[IPROHC_MAX_PROFILE_IDS]; /* Maximum Context Identifier */ Ip_u16 max_cid; /* Used Context Identifier Representation */ Ip_bool large_cid; /* FEEDBACK_FOR Parameter Defined */ Ip_bool feedback_for_defined; /* FEEDBACK_FOR Parameter */ Ip_u32 feedback_for; /* F_MAX_PERIOD parameter */ Ip_u16 f_max_period; /* F_MAX_TIME parameter */ Ip_u8 f_max_time; #ifndef IP_PORT_VXWORKS /* for Linux recursive semaphore */ /* the process that currently holds the semaphore and taken counter */ Ip_pid_t pid; Ip_u8 s_counter; #endif /* !IP_PORT_VXWORKS */ /* Syslog output memory. */ char buf[48]; #ifdef IPROHC_USE_TEST #ifdef IPROHC_TCP_IP_SIMULATED_IPID Ip_u8 ipid_sim; #endif #endif } Iprohc_data; IP_EXTERN IP_GLOBAL Iprohc_data iprohc; /* **************************************************************************** * Application APIs **************************************************************************** */ IP_PUBLIC Ip_err iprohc_input_hook(Ipcom_netif *netif, Ipcom_pkt *pkt); IP_PUBLIC Ip_err iprohc_output_hook(Ipcom_netif *netif, Ipcom_pkt *pkt); IP_PUBLIC Ip_err iprohc_ioctl(unsigned long request, struct Ip_rohcreq *rohcmsg); /* **************************************************************************** * GLOBAL FUNCTIONS **************************************************************************** */ IP_PUBLIC Ip_err iprohc_create(void); IP_PUBLIC Ip_err iprohc_start(void); IP_PUBLIC Ip_err iprohc_close(void); IP_PUBLIC Ip_err iprohc_exit(void); IP_PUBLIC void iprohc_show_config(void); IP_PUBLIC const char * iprohc_version(void); IP_PUBLIC Iprohc_interface * iprohc_find_interface(char *ifname); IP_PUBLIC Ip_err iprohc_add_interface(char *name, Ip_bool have_num, Ip_u8 num); IP_PUBLIC Ip_err iprohc_del_interface(char *name, Ip_bool have_num, Ip_u8 num); IP_PUBLIC Ip_err iprohc_remove_interfaces(void); IP_PUBLIC Ip_err iprohc_if_find_profile(Iprohc_interface *interface, Ip_u8 profileid); IP_PUBLIC Ip_err iprohc_if_add_profile(Iprohc_interface *interface, Ip_u8 profileid); IP_PUBLIC Ip_err iprohc_if_del_profile(Iprohc_interface *interface, Ip_u8 profileid); IP_PUBLIC Ip_s8 iprohc_choose_profile(Iprohc_interface *interface, Ipcom_pkt *pkt); IP_PUBLIC Ip_s8 iprohc_d_choose_profile(Iprohc_interface *interface, Ipcom_pkt *pkt); /* Feedback functions */ IP_PUBLIC Iprohc_feedback * iprohc_create_feedback_1(Iprohc_d_context *d_context, Ip_u16 sn); IP_PUBLIC Iprohc_feedback * iprohc_create_feedback_2(Iprohc_d_context *d_context, Iprohc_feedback_acktype acktype, Ip_u16 sn); IP_PUBLIC Ip_err iprohc_feedback_add_option(Iprohc_feedback *feedback, Iprohc_feedback_opt opt_type, Ip_u8 opt_len, Ip_u8 opt_data); IP_PUBLIC Ip_err iprohc_preappend_feedback(Iprohc_interface *interface, Ip_u8 profileid, Iprohc_c_context *c_context, Ipcom_pkt *pkt); IP_PUBLIC Ip_err iprohc_find_profile(Ip_u8 profileid); IP_PUBLIC Ip_err iprohc_add_profile(Ip_u8 profileid); IP_PUBLIC Ip_err iprohc_del_profile(Ip_u8 profileid); IP_PUBLIC void iprohc_update_rnd_nbo(Ip_u16 old_ipid, Ip_u16 ipid, Ip_bool *rnd, Ip_bool *nbo, Ip_bool *sid); /* CRC calculation */ IP_PUBLIC Ip_u8 iprohc_crc3(Ip_u8 *data, int len); IP_PUBLIC Ip_u8 iprohc_crc7(Ip_u8 *data, int len); IP_PUBLIC Ip_u8 iprohc_crc8(Ip_u8 *data, int len); /* Debug utilities */ IP_PUBLIC char * iprohc_profile(Ip_u8 profile_id); IP_PUBLIC void iprohc_print_pkt(Ipcom_pkt *pkt); IP_PUBLIC char * iprohc_pkt_type(Ip_u8 pkt_type); IP_PUBLIC char * iprohc_context_mode(Iprohc_mode mode); IP_PUBLIC char * iprohc_ext_type(Iprohc_extension extension); IP_PUBLIC void iprohc_print_feedback(Iprohc_feedback *feedback); #ifndef IP_PORT_VXWORKS /* for Linux recursive semaphore */ IP_PUBLIC void iprohc_lck(void); IP_PUBLIC void iprohc_unlck(void); IP_PUBLIC void iprohc_if_lck(Iprohc_interface *interface); IP_PUBLIC void iprohc_if_unlck(Iprohc_interface *interface); #endif /* !IP_PORT_VXWORKS */ #ifdef __cplusplus } #endif #endif /* #ifndef IPROHC_H */ /* **************************************************************************** * END OF FILE **************************************************************************** */