/* // Copyright (c) 2017 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. */ #ifndef __INCLUDE_LIB_ALG_H__ #define __INCLUDE_LIB_ALG_H__ #include "rte_ether.h" uint16_t sip_session_number;/* SIP session count */ #define IS_STRING_SAME(pStr, strId) (bcmp((pStr), strId, strlen(strId)) == 0) #define TAG_TO_DATAPOS(str) (strlen(str) + 1) #define SKIP_SPACES(pStr) \ { \ while (*(char *)(pStr) == ' ') \ (char *)(pStr)++; \ } enum pkt_dir {PRIVATE, PUBLIC}; /* enum for SIP Call direction - NAT ALG */ enum sip_alg_call_direction { SIP_CALL_INCOMING, /* Incoming call public to private */ SIP_CALL_OUTGOING /* Outgoing call private to public */ }; /* enum of SIP port type - NAT ALG */ enum sip_alg_port_type { SIP_UDP, /* SIP SDP port 5460 */ SIP_RTP, /* RTP port number */ SIP_RTCP /* RTCP port number */ }; /* * Data structure for NAT SIP ALG table key * Key - IP address & L4 port number. */ struct sip_alg_key { /* * IP address based on direction. * outgoing - public IP, incoming - destinatio IP of pkt */ uint32_t ip_address; uint16_t l4port; /* SIP SDP, RTP, RTCP port number */ uint8_t filler1; uint8_t filler2; }; /* * Data structure for NAT SIP ALG table entry. * Placeholder for storing SIP ALG entries. */ struct sip_alg_table_entry { uint32_t ip_address; /* * IP address based on direction. * outgoing - public IP, incoming - destinatio IP of pkt */ uint16_t l4port; /* SIP UDP (5061), RTP, RTCP port number */ uint8_t sip_alg_call_direction; /* Call incoming (pub to prv) or outgoing (prv to pub) */ uint8_t sip_alg_call_id[100];/* unique identfier for a SIP call */ uint8_t l4port_type;/* SIP_UDP or RTP or RTCP */ uint8_t filler1; uint16_t filler2; uint32_t filler3; } __rte_cache_aligned; /* Function declarations */ /** * To initalize SIP ALG library and should be called- * - before other SIP ALG library funcitons * @param params * pipeline parameter structure pointer * @param app * pipeline application conext structure pointer * @return * void return */ void lib_sip_alg_init(void); /** * Main SIP ALG DPI function for processing SIP ALG functionlity * @param pkt * mbuf packet pointer * @param pkt_direction * Indicates whether pkt is from PRIVATE or PUBLIC direction * @param modIp * NAPT tranlated IP address based on direction * @param modL4Port * NAPT translated L4 port based on direction * @param pubIP * Original IP address before translation * @param pubL4Port * Original L4 port before translation * @param modRtpPort * RTP port * @param modRtcpPort * RTCP port * @return * 0 means success, -1 means failure */ int sip_alg_dpi(struct rte_mbuf *pkt, enum pkt_dir pkt_direction, uint32_t modIp, uint16_t modL4Port, uint32_t pubIp, uint16_t pubL4Port, uint16_t modRtpPort, uint16_t modRtcpPort); /** * To get audio ports from SIP Packet * @param pkt * mbuf packet pointer * @param rtpPort * rtp port in parameter * @param rtcpPort * rtcp port in parameter * @return * 0 means success, -1 means failre */ int natSipAlgGetAudioPorts( struct rte_mbuf *pkt, uint16_t *rtpPort, uint16_t *rtcp_port); int natSipAlgMsgFieldPos( char *pData, const char *pIdStr, int *pos, int searchLen); int natSipAlgMsgFieldPosFindCrlf( char *pData, const char *pIdStr, int *pPos, int searchLen); int natSipAlgMsgFieldPosFindSpace( char *pData, const char *pIdStr, int *pPos, int searchLen); int remove_sip_alg_entry( uint32_t ipaddr, uint16_t portid); #endif