diff options
-rw-r--r-- | ipacm/inc/IPACM_Conntrack_NATApp.h | 3 | ||||
-rw-r--r-- | ipacm/inc/IPACM_Log.h | 7 | ||||
-rw-r--r-- | ipacm/src/IPACM_Conntrack_NATApp.cpp | 8 | ||||
-rw-r--r-- | ipacm/src/IPACM_Log.cpp | 87 | ||||
-rw-r--r-- | ipacm/src/Makefile.am | 2 | ||||
-rw-r--r-- | ipanat/inc/ipa_nat_drvi.h | 1 | ||||
-rw-r--r-- | ipanat/inc/ipa_nat_logi.h | 11 | ||||
-rw-r--r-- | ipanat/src/Makefile.am | 1 | ||||
-rw-r--r-- | ipanat/src/ipa_nat_drvi.c | 115 | ||||
-rw-r--r-- | ipanat/src/ipa_nat_logi.c | 69 |
10 files changed, 267 insertions, 37 deletions
diff --git a/ipacm/inc/IPACM_Conntrack_NATApp.h b/ipacm/inc/IPACM_Conntrack_NATApp.h index 682316f..777a23f 100644 --- a/ipacm/inc/IPACM_Conntrack_NATApp.h +++ b/ipacm/inc/IPACM_Conntrack_NATApp.h @@ -67,7 +67,7 @@ typedef struct _nat_table_entry int n =0; \ n = snprintf(log_buf, sizeof(log_buf), "%s:%d %s() %s", __FILE__, __LINE__, __FUNCTION__, "Error:");\ snprintf((log_buf+n), (sizeof(log_buf)-n)-1, "Invalid table handle\n");\ - logmessage(log_buf);\ + logmessage(log_buf, LOG_ERR);\ } class NatApp @@ -103,6 +103,7 @@ public: static NatApp* GetInstance(); int AddTable(uint32_t); + uint32_t GetTableHdl(uint32_t); int DeleteTable(uint32_t); int AddEntry(const nat_table_entry *); diff --git a/ipacm/inc/IPACM_Log.h b/ipacm/inc/IPACM_Log.h index 785b654..f75e73c 100644 --- a/ipacm/inc/IPACM_Log.h +++ b/ipacm/inc/IPACM_Log.h @@ -48,6 +48,7 @@ extern "C" #include <stdio.h> #include <string.h> +#include <syslog.h> #define LOG_SIZE 200 @@ -58,7 +59,7 @@ extern "C" int n =0; \ n = snprintf(log_buf, sizeof(log_buf), "%s:%d %s() ", __FILE__, __LINE__, __FUNCTION__);\ snprintf((log_buf+n), (sizeof(log_buf)-n-1), fmt, ##__VA_ARGS__);\ - logmessage(log_buf);\ + logmessage(log_buf, LOG_DEBUG);\ } @@ -66,10 +67,10 @@ extern "C" int n =0; \ n = snprintf(log_buf, sizeof(log_buf), "%s:%d %s() %s", __FILE__, __LINE__, __FUNCTION__, "Error:");\ snprintf((log_buf+n), (sizeof(log_buf)-n-1), fmt, ##__VA_ARGS__);\ - logmessage(log_buf);\ + logmessage(log_buf, LOG_ERR);\ } -extern void logmessage(char *msg); +extern void logmessage(char *msg, int log_level); extern char log_buf[LOG_SIZE]; #ifdef __cplusplus diff --git a/ipacm/src/IPACM_Conntrack_NATApp.cpp b/ipacm/src/IPACM_Conntrack_NATApp.cpp index 9c14004..28de036 100644 --- a/ipacm/src/IPACM_Conntrack_NATApp.cpp +++ b/ipacm/src/IPACM_Conntrack_NATApp.cpp @@ -608,5 +608,13 @@ int NatApp::ResetPwrSaveIf(uint32_t client_lan_ip) return -1; } +uint32_t NatApp::GetTableHdl(uint32_t in_ip_addr) +{ + if(in_ip_addr == pub_ip_addr) + { + return nat_table_hdl; + } + return -1; +} diff --git a/ipacm/src/IPACM_Log.cpp b/ipacm/src/IPACM_Log.cpp index 3333358..74ae2aa 100644 --- a/ipacm/src/IPACM_Log.cpp +++ b/ipacm/src/IPACM_Log.cpp @@ -39,30 +39,91 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "IPACM_Log.h" #include <stdlib.h> +#include <unistd.h> +/* write logging to a local file */ +#define LOG_USE_FILE "/etc/IPACM_LOG_F" #define FILE_NAME "/usr/ipacm_log.txt" -static FILE *fp = NULL; +/* To use syslog for logging and + use logread cmd to read */ +#define LOG_USE_SYS "/etc/IPACM_LOG_S" + +/* Maximum log file size. 1MB(1048576) */ +#define MAX_LOG_FILE_SIZE (1048576ul/4) + char log_buf[LOG_SIZE]; -void logmessage(char *msg) +void logmessage(char *msg, int log_level) { +#ifdef DEBUG + static FILE *fp = NULL; + static bool is_sys_log_open = false; + static bool dft_syslog = false; + int log_sys = 0, log_file = 0; + printf("%s\n", msg); -#if 0 - if(fp == NULL) + + if(dft_syslog == false) + { + /* By Default sys log is open */ + fp = fopen(LOG_USE_SYS, "w+"); + if(fp != NULL) + { + dft_syslog = true; + fclose(fp); + fp = NULL; + } + } + + if(access(LOG_USE_SYS, F_OK) != -1 ) + { + log_sys = 1; + } + else if(access(LOG_USE_FILE, F_OK) != -1) + { + log_file = 1; + } + else + { + log_sys = 0; + log_file = 0; + } + + if(log_sys) { - fp = fopen(FILE_NAME, "wb+"); - if(fp == NULL) - { - printf("unable to open file\n"); - return; - } + if(is_sys_log_open == false) + { + setlogmask(LOG_UPTO(LOG_DEBUG)); + openlog("IPACM", LOG_PID, LOG_LOCAL0); + + is_sys_log_open = true; + } + syslog(log_level, msg); } + else if(log_file) + { + if(fp == NULL) + { + fp = fopen(FILE_NAME, "w+"); + if(fp == NULL) + { + printf("unable to open file\n"); + return; + } + } + + if(ftell(fp) > MAX_LOG_FILE_SIZE) + { + rewind(fp); + fprintf(fp, "====Rewinding=====\n"); + } - fprintf(fp, msg); - fflush(fp); + fprintf(fp, msg); + fflush(fp); + } #endif - return; + return; } diff --git a/ipacm/src/Makefile.am b/ipacm/src/Makefile.am index c43343a..57e3386 100644 --- a/ipacm/src/Makefile.am +++ b/ipacm/src/Makefile.am @@ -1,8 +1,8 @@ -EXTRA_CPPFLAGS = -DDEBUG AM_CPPFLAGS = -I./../inc \ -I$(top_srcdir)/ipanat/inc \ ${LIBXML_CFLAGS} AM_CPPFLAGS += -Wall -Wundef -Wno-trigraphs +AM_CPPFLAGS += -DDEBUG ipacm_SOURCES = IPACM_Main.cpp \ IPACM_Conntrack_NATApp.cpp\ diff --git a/ipanat/inc/ipa_nat_drvi.h b/ipanat/inc/ipa_nat_drvi.h index 25309e1..2a5a5ba 100644 --- a/ipanat/inc/ipa_nat_drvi.h +++ b/ipanat/inc/ipa_nat_drvi.h @@ -468,6 +468,7 @@ void ipa_nati_del_dead_ipv4_head_nodes(uint8_t tbl_indx); void ipa_nati_print_rule(struct ipa_nat_rule *rule, uint32_t rule_id); void ipa_nat_dump_ipv4_table(uint32_t tbl_hdl); void ipa_nati_print_index_rule(struct ipa_nat_indx_tbl_rule *param, uint32_t rule_id); +int ipa_nati_query_nat_rules(uint32_t tbl_hdl, nat_table_type tbl_type); #endif #endif /* #ifndef IPA_NAT_DRVI_H */ diff --git a/ipanat/inc/ipa_nat_logi.h b/ipanat/inc/ipa_nat_logi.h index e98445a..b4eee0f 100644 --- a/ipanat/inc/ipa_nat_logi.h +++ b/ipanat/inc/ipa_nat_logi.h @@ -48,34 +48,33 @@ extern "C" #include <stdio.h> #include <string.h> +#include <syslog.h> #define NAT_LOG_SIZE 200 #define PERROR(fmt) printf("%s:%d %s()", __FILE__, __LINE__, __FUNCTION__);\ perror(fmt); - #define IPADBG(fmt, ...) {\ int n =0; \ n = snprintf(nat_log_buf, sizeof(nat_log_buf), "%s:%d %s() ", __FILE__, __LINE__, __FUNCTION__);\ snprintf((nat_log_buf+n), (sizeof(nat_log_buf)-n-1), fmt, ##__VA_ARGS__);\ - log_nat_message(nat_log_buf);\ + log_nat_message(nat_log_buf, LOG_DEBUG);\ } - #define IPAERR(fmt, ...) {\ int n =0; \ n = snprintf(nat_log_buf, sizeof(nat_log_buf), "%s:%d %s() %s", __FILE__, __LINE__, __FUNCTION__, "Error:");\ snprintf((nat_log_buf+n), (sizeof(nat_log_buf)-n-1), fmt, ##__VA_ARGS__);\ - log_nat_message(nat_log_buf);\ + log_nat_message(nat_log_buf, LOG_ERR);\ } #define IPADUMP(fmt, ...) {\ int n =0; \ snprintf((nat_log_buf+n), (sizeof(nat_log_buf)-1), fmt, ##__VA_ARGS__);\ - log_nat_message(nat_log_buf);\ + log_nat_message(nat_log_buf, LOG_INFO);\ } -extern void log_nat_message(char *msg); +extern void log_nat_message(char *msg, int log_level); extern char nat_log_buf[NAT_LOG_SIZE]; #ifdef __cplusplus diff --git a/ipanat/src/Makefile.am b/ipanat/src/Makefile.am index f8b775c..a688893 100644 --- a/ipanat/src/Makefile.am +++ b/ipanat/src/Makefile.am @@ -1,5 +1,6 @@ AM_CFLAGS = -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs AM_CFLAGS += -I./../inc +AM_CFLAGS += -DDEBUG c_sources = ipa_nat_drv.c \ ipa_nat_drvi.c \ diff --git a/ipanat/src/ipa_nat_drvi.c b/ipanat/src/ipa_nat_drvi.c index 106abac..dbe9102 100644 --- a/ipanat/src/ipa_nat_drvi.c +++ b/ipanat/src/ipa_nat_drvi.c @@ -2262,7 +2262,6 @@ void ipa_nat_dump_ipv4_table(uint32_t tbl_hdl) INDX_TBL_TBL_ENTRY_FIELD)) { ipa_nati_print_index_rule(&indx_tbl_ptr[cnt], cnt); - //ipa_nati_dump_index_rule_buf(&indx_tbl_ptr[cnt], sizeof(struct ipa_nat_indx_tbl_rule), cnt); } } if(!atl_one) @@ -2284,7 +2283,6 @@ void ipa_nat_dump_ipv4_table(uint32_t tbl_hdl) INDX_TBL_TBL_ENTRY_FIELD)) { ipa_nati_print_index_rule(&indx_tbl_ptr[cnt], cnt); - //ipa_nati_dump_index_rule_buf(&indx_tbl_ptr[cnt], sizeof(struct ipa_nat_indx_tbl_rule), cnt); } } if(!atl_one) @@ -2320,4 +2318,117 @@ void ipa_nati_print_index_rule(struct ipa_nat_indx_tbl_rule *param, uint32_t rul IPADUMP("\n"); return; } + +int ipa_nati_query_nat_rules(uint32_t tbl_hdl, nat_table_type tbl_type) +{ + + struct ipa_nat_rule *tbl_ptr; + struct ipa_nat_indx_tbl_rule *indx_tbl_ptr; + int cnt =0, ret = 0; + + if (IPA_NAT_INVALID_NAT_ENTRY == tbl_hdl || + tbl_hdl > IPA_NAT_MAX_IP4_TBLS) + { + IPAERR("invalid table handle passed \n"); + return ret; + } + + /* Print ipv4 rules */ + if (tbl_type == IPA_NAT_BASE_TBL) + { + IPADBG("Counting ipv4 active rules:\n"); + tbl_ptr = (struct ipa_nat_rule *) + ipv4_nat_cache.ip4_tbl[tbl_hdl-1].ipv4_rules_addr; + for( cnt=0; + cnt<ipv4_nat_cache.ip4_tbl[tbl_hdl-1].table_entries; + cnt++) + { + if (Read16BitFieldValue( tbl_ptr[cnt].ip_cksm_enbl, + ENABLE_FIELD)) + { + ret++; + } + } + if(!ret) + { + IPADBG("No active base rules\n"); + } + + IPADBG("Number of active base rules: %d\n", ret); + } + + /* Print ipv4 expansion rules */ + if (tbl_type == IPA_NAT_EXPN_TBL) + { + IPADBG("Counting ipv4 active expansion rules:\n"); + tbl_ptr = (struct ipa_nat_rule *) + ipv4_nat_cache.ip4_tbl[tbl_hdl-1].ipv4_expn_rules_addr; + for( cnt=0; + cnt<ipv4_nat_cache.ip4_tbl[tbl_hdl-1].expn_table_entries; + cnt++) + { + if (Read16BitFieldValue(tbl_ptr[cnt].ip_cksm_enbl, + ENABLE_FIELD)) + { + ret++; + } + } + if(!ret) + { + IPADBG("No active base expansion rules\n"); + } + + IPADBG("Number of active base expansion rules: %d\n", ret); + } + + /* Print ipv4 index rules */ + if (tbl_type == IPA_NAT_INDX_TBL) + { + IPADBG("Counting ipv4 index active rules: \n"); + indx_tbl_ptr = (struct ipa_nat_indx_tbl_rule *) + ipv4_nat_cache.ip4_tbl[tbl_hdl-1].index_table_addr; + for( cnt=0; + cnt<ipv4_nat_cache.ip4_tbl[tbl_hdl-1].table_entries; + cnt++) + { + if (Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx, + INDX_TBL_TBL_ENTRY_FIELD)) + { + ret++; + } + } + if(!ret) + { + IPADBG("No active index table rules\n"); + } + + IPADBG("Number of active index table rules: %d\n", ret); + } + + /* Print ipv4 index expansion rules */ + if (tbl_type == IPA_NAT_INDEX_EXPN_TBL) + { + IPADBG("Counting ipv4 index expansion active rules: \n"); + indx_tbl_ptr = (struct ipa_nat_indx_tbl_rule *) + ipv4_nat_cache.ip4_tbl[tbl_hdl-1].index_table_expn_addr; + for ( cnt=0; + cnt<ipv4_nat_cache.ip4_tbl[tbl_hdl-1].expn_table_entries; + cnt++) + { + if (Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx, + INDX_TBL_TBL_ENTRY_FIELD)) + { + ret++; + } + } + if(!ret) + { + IPADBG("No active index expansion rules\n"); + } + + IPADBG("Number of active index expansion rules: %d\n", ret); + } + + return ret; +} #endif diff --git a/ipanat/src/ipa_nat_logi.c b/ipanat/src/ipa_nat_logi.c index 11991c9..ead8154 100644 --- a/ipanat/src/ipa_nat_logi.c +++ b/ipanat/src/ipa_nat_logi.c @@ -39,28 +39,75 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "ipa_nat_logi.h" #include <stdlib.h> +#include <unistd.h> +/* write logging to a local file */ +#define LOG_USE_FILE "/etc/IPACM_LOG_F" #define NAT_FILE_NAME "/usr/ipanat_log.txt" -static FILE *nat_fp = NULL; +/* To use syslog for logging and + use logread cmd to read */ +#define LOG_USE_SYS "/etc/IPACM_LOG_S" + +/* Maximum log file size. 1MB(1048576) */ +#define MAX_LOG_FILE_SIZE (1048576ul/4) + char nat_log_buf[NAT_LOG_SIZE]; -void log_nat_message(char *msg) +void log_nat_message(char *msg, int log_level) { +#ifdef DEBUG + static FILE *nat_fp = NULL; + static int is_natsys_log_open = 0; + int log_sys = 0, log_file = 0; + printf("%s", msg); -#if 0 - if(nat_fp == NULL) + if(access(LOG_USE_SYS, F_OK) != -1 ) + { + log_sys = 1; + } + else if(access(LOG_USE_FILE, F_OK) != -1) + { + log_file = 1; + } + else { - nat_fp = fopen(NAT_FILE_NAME, "wb+"); - if(nat_fp == NULL) - { + log_sys = 0; + log_file = 0; + } + + if(log_sys) + { + if(is_natsys_log_open == 0) + { + setlogmask(LOG_UPTO(LOG_DEBUG)); + openlog("IPANAT", LOG_PID, LOG_LOCAL0); + + is_natsys_log_open = 1; + } + syslog(log_level, msg); + } + else if(log_file) + { + if(nat_fp == NULL) + { + nat_fp = fopen(NAT_FILE_NAME, "wb+"); + if(nat_fp == NULL) + { printf("unable to open file\n"); return; - } - } + } + } + + if(ftell(nat_fp) > MAX_LOG_FILE_SIZE) + { + rewind(nat_fp); + fprintf(nat_fp, "====Rewinding=====\n"); + } - fprintf(nat_fp, msg); - fflush(nat_fp); + fprintf(nat_fp, msg); + fflush(nat_fp); + } #endif return; } |