#pragma once #include #include #include #include #include #include #include #include #include "MESA/MESA_handle_logger.h" #include "MESA/MESA_htable.h" #include "MESA/MESA_prof_load.h" #include "field_stat2.h" #include "Maat_rule.h" #include "Maat_command.h" #include "mrtunnat.h" #define KNI_STRING_MAX 2048 #define KNI_PATH_MAX 256 #define KNI_SYMBOL_MAX 64 #define KNI_DOMAIN_MAX 256 #ifndef MAX #define MAX(a, b) (((a) > (b)) ? (a) : (b)) #endif #ifndef MIN #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #endif #define likely(expr) __builtin_expect((expr), 1) #define unlikely(expr) __builtin_expect((expr), 0) #define ALLOC(type, number) ((type *)calloc(sizeof(type), number)) #define FREE(p) {free(*p);*p=NULL;} #define KNI_LOG_ERROR(handler, fmt, ...) \ do { \ char location[KNI_PATH_MAX]; \ snprintf(location, KNI_PATH_MAX, "%s: line %d", __FILE__, __LINE__); \ MESA_handle_runtime_log(handler, RLOG_LV_FATAL, location, fmt, ##__VA_ARGS__); } while(0) #define KNI_LOG_INFO(handler, fmt, ...) \ do { \ char location[KNI_PATH_MAX]; \ snprintf(location, KNI_PATH_MAX, "%s: line %d", __FILE__, __LINE__); \ MESA_handle_runtime_log(handler, RLOG_LV_INFO, location, fmt, ##__VA_ARGS__); } while(0) #define KNI_LOG_DEBUG(handler, fmt, ...) \ do { \ char location[KNI_PATH_MAX]; \ snprintf(location, KNI_PATH_MAX, "%s: line %d", __FILE__, __LINE__); \ MESA_handle_runtime_log(handler, RLOG_LV_DEBUG, location, fmt, ##__VA_ARGS__); } while(0) //default tcp opt #define KNI_DEFAULT_WINSCLE 0 #define KNI_DEFAULT_MSS 1460 #define KNI_DEFAULT_MTU 1500 #define KNI_MTU 3000 struct kni_tcpopt_info{ uint16_t mss; uint8_t wscale; uint8_t ts; uint8_t sack; }; //field_stat #define KNI_FIELD_MAX 32 enum kni_field{ KNI_FIELD_TOT_PKT, KNI_FIELD_BYP_PKT, KNI_FIELD_INTCP_PKT, KNI_FIELD_IPV6_PKT, KNI_FIELD_NULL_PKT, KNI_FIELD_NO_SYN_EXP, KNI_FIELD_NO_SA_EXP, KNI_FIELD_UNKNOWN_STATE_EXP, KNI_FIELD_TOT_STM, KNI_FIELD_BYP_STM, KNI_FIELD_INTCP_STM, KNI_FIELD_SSL_STM, KNI_FIELD_HTTP_STM, KNI_FIELD_SENDLOG_SUCC, KNI_FIELD_SENDLOG_FAIL, KNI_FIELD_UNKNOWN_STM, KNI_FIELD_STM_NO_DATA, KNI_FIELD_PME_NEW, KNI_FIELD_PME_FREE, KNI_FIELD_ID2PME_ADD_SUCC, KNI_FIELD_ID2PME_ADD_FAIL, KNI_FIELD_ID2PME_DEL_SUCC, KNI_FIELD_ID2PME_DEL_FAIL, KNI_FIELD_IPV4HDR_PARSE_FAIL, KNI_FIELD_IPV6HDR_PARSE_FAIL, KNI_FIELD_KEEPALIVE_REPLAY_ADD_SUCC, KNI_FIELD_KEEPALIVE_REPLAY_ADD_FAIL, KNI_FIELD_EXCEED_MTU, }; struct kni_field_stat_handle{ screen_stat_handle_t handle; int fields[KNI_FIELD_MAX]; }; struct pkt_info{ union{ struct iphdr *v4; struct ip6_hdr *v6; }iphdr; uint16_t iphdr_len; uint16_t ip_totlen; struct tcphdr *tcphdr; uint16_t tcphdr_len; char *data; uint16_t data_len; }; enum kni_ipv4hdr_parse_error{ KNI_IPV4HDR_PARSE_ERROR_NULL_PACKET = -1, }; enum kni_ipv6hdr_parse_error{ KNI_IPV6HDR_PARSE_ERROR_NULL_PACKET = -1, KNI_IPV6HDR_PARSE_ERROR_NO_TCPHDR = -2, KNI_IPV6HDR_PARSE_ERROR_INVALID_TYPE = -3, }; int kni_stream_addr_trans(const struct layer_addr *addr, addr_type_t addr_type, char *output, int len); uint16_t kni_ip_checksum(const void *buf, size_t hdr_len); uint16_t kni_tcp_checksum(const void *_buf, size_t len, in_addr_t src_addr, in_addr_t dest_addr); uint16_t kni_tcp_checksum_v6(const void *_buf, size_t len, struct in6_addr src_addr, struct in6_addr dest_addr); uint16_t kni_udp_checksum(const void *_buf, size_t len, in_addr_t src_addr, in_addr_t dest_addr); struct kni_tcpopt_info* kni_get_tcpopt(struct tcphdr* tcphdr, int tcphdr_len); int kni_ipv4_addr_get_by_eth(const char *ifname, uint32_t *ip); int kni_ipv4_header_parse(const void *a_packet, struct pkt_info *pktinfo); int kni_ipv6_header_parse(const void *a_packet, struct pkt_info *pktinfo); char* kni_ipv4_errmsg_get(enum kni_ipv4hdr_parse_error _errno); char* kni_ipv6_errmsg_get(enum kni_ipv6hdr_parse_error _errno); MESA_htable_handle kni_create_htable(const char *profile, const char *section, void *free_data_cb, void *expire_notify_cb, void *logger);