292 lines
6.7 KiB
C
292 lines
6.7 KiB
C
|
|
#include <sys/ioctl.h>
|
||
|
|
#include <sys/socket.h>
|
||
|
|
#include <netinet/in.h>
|
||
|
|
#include <arpa/inet.h>
|
||
|
|
#include <math.h>
|
||
|
|
#include <net/if.h>
|
||
|
|
#include <unistd.h>
|
||
|
|
#include <stdio.h>
|
||
|
|
#include <stdlib.h>
|
||
|
|
#include <time.h>
|
||
|
|
#include <errno.h>
|
||
|
|
#include <pthread.h>
|
||
|
|
#include <inttypes.h>
|
||
|
|
#include <string.h>
|
||
|
|
#include <stdint.h>
|
||
|
|
#include <inttypes.h>
|
||
|
|
#include <sys/stat.h>
|
||
|
|
#include <sys/time.h>
|
||
|
|
#include <errno.h>
|
||
|
|
#include <stddef.h>
|
||
|
|
|
||
|
|
#include "common.h"
|
||
|
|
#include "stream.h"
|
||
|
|
#include "MESA_handle_logger.h"
|
||
|
|
|
||
|
|
|
||
|
|
int pag_send_av_udp(int Datasize, const char *pData, u_int src_ip, u_int dst_ip, u_short src_prt, u_short dst_prt)
|
||
|
|
{
|
||
|
|
printf("empty function,should not be called by preprocesosor!\n");
|
||
|
|
exit(-1);
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
int create_pthread(void *(*worker)(void *), void * params, void* logger)
|
||
|
|
{
|
||
|
|
pthread_t thread_desc;
|
||
|
|
pthread_attr_t attr;
|
||
|
|
|
||
|
|
memset(&thread_desc, 0, sizeof(thread_desc));
|
||
|
|
memset(&attr, 0, sizeof(attr));
|
||
|
|
|
||
|
|
if(0 != pthread_attr_init(&(attr)))
|
||
|
|
{
|
||
|
|
MESA_handle_runtime_log(logger, RLOG_LV_FATAL, FRAG_REASSEMBLY_MODULE_NAME, "pthread_attr_init(): %d %s", errno, strerror(errno));
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
if(0 != pthread_attr_setdetachstate(&(attr), PTHREAD_CREATE_DETACHED))
|
||
|
|
{
|
||
|
|
MESA_handle_runtime_log(logger, RLOG_LV_FATAL, FRAG_REASSEMBLY_MODULE_NAME, "pthread_attr_setdetachstate(): %d %s", errno, strerror(errno));
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
if(0 != pthread_create(&(thread_desc), &(attr), (void *(*)(void *))(worker), (void *)(params)))
|
||
|
|
{
|
||
|
|
MESA_handle_runtime_log(logger, RLOG_LV_FATAL, FRAG_REASSEMBLY_MODULE_NAME, "pthread_create(): %d %s", errno, strerror(errno));
|
||
|
|
pthread_attr_destroy(&(attr));
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
pthread_attr_destroy(&(attr));
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
int string_split (const char* src, char dest[][MAX_PATH_LEN], int dest_maxnum, char sep)
|
||
|
|
{
|
||
|
|
if(NULL==src) return 0;
|
||
|
|
int dest_cnt = 0;
|
||
|
|
const char* start_token = src;
|
||
|
|
const char* end_token = src;
|
||
|
|
const char* end_pos = src+strlen(src);
|
||
|
|
|
||
|
|
while(end_token<end_pos&&dest_cnt<dest_maxnum)
|
||
|
|
{
|
||
|
|
end_token = (char*)memchr(start_token, sep, end_pos-start_token);
|
||
|
|
if(end_token!=NULL)
|
||
|
|
{
|
||
|
|
memcpy(dest[dest_cnt], start_token, end_token-start_token);
|
||
|
|
start_token = end_token+1;
|
||
|
|
end_token += 1;
|
||
|
|
dest_cnt++;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
memcpy(dest[dest_cnt], start_token, end_pos-start_token);
|
||
|
|
end_token = end_pos;
|
||
|
|
dest_cnt++;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return dest_cnt;
|
||
|
|
}
|
||
|
|
|
||
|
|
int mkdir_r(const char *path)
|
||
|
|
{
|
||
|
|
int i=0, len=0;
|
||
|
|
int ret=0;
|
||
|
|
len = strlen(path);
|
||
|
|
char dir_path[len+1];
|
||
|
|
dir_path[len] = '\0';
|
||
|
|
|
||
|
|
strncpy(dir_path, path, len);
|
||
|
|
|
||
|
|
for (i=0; i<len; i++)
|
||
|
|
{
|
||
|
|
if (dir_path[i] == '/' && i > 0)
|
||
|
|
{
|
||
|
|
dir_path[i]='\0';
|
||
|
|
if (access(dir_path, F_OK) < 0)
|
||
|
|
{
|
||
|
|
ret=mkdir(dir_path,0755);
|
||
|
|
if (ret < 0)
|
||
|
|
{
|
||
|
|
printf("mkdir=%s:msg=%s\n", dir_path, strerror(errno));
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
dir_path[i]='/';
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
//read ip from string like "127.0.1-32;"
|
||
|
|
int MESA_split_read_IP(char *ipstr, int ipnum, unsigned int *output_ip)
|
||
|
|
{
|
||
|
|
char buf[1024] = { 0 };
|
||
|
|
char *begin, *end;
|
||
|
|
int i;
|
||
|
|
int rc = 0;
|
||
|
|
begin = ipstr;
|
||
|
|
end = NULL;
|
||
|
|
for(i = 0; i < ipnum; )
|
||
|
|
{
|
||
|
|
if(NULL != (end = strchr(begin, ';') ) )
|
||
|
|
{
|
||
|
|
memset(buf, 0, 524);
|
||
|
|
strncpy(buf, begin, end - begin);
|
||
|
|
begin = end + 1;
|
||
|
|
char *pchr = strchr(buf, '-');
|
||
|
|
int tmp = 0, tmp2 = 0;
|
||
|
|
if(pchr == NULL)
|
||
|
|
{
|
||
|
|
tmp = 1;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
char *ptmp2 = strrchr(buf, '.');
|
||
|
|
tmp2 = atoi(ptmp2 + 1);
|
||
|
|
tmp = atoi(pchr + 1);
|
||
|
|
tmp = tmp - tmp2 + 1;
|
||
|
|
*pchr = '\0';
|
||
|
|
if(tmp <= 0)
|
||
|
|
{
|
||
|
|
printf("MESA_split_read_IP Bad bsendip format %s\n", ipstr);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
rc = inet_addr(buf);
|
||
|
|
if(rc == -1)
|
||
|
|
{
|
||
|
|
printf("MESA_split_read_IP Bad bsendip format %s\n", ipstr);
|
||
|
|
}
|
||
|
|
unsigned int tmpid = ntohl(rc);
|
||
|
|
for(int j = 0; j < tmp; j++)
|
||
|
|
{
|
||
|
|
if(i >= ipnum)
|
||
|
|
{
|
||
|
|
printf("Bad bsendip format,bsendipnum %d not right\n", ipnum);
|
||
|
|
}
|
||
|
|
output_ip[i] = (unsigned int)htonl( (tmpid + j) );
|
||
|
|
i++;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return(0);
|
||
|
|
}
|
||
|
|
|
||
|
|
unsigned int get_ip_by_ifname(const char *ifname)
|
||
|
|
{
|
||
|
|
int sockfd;
|
||
|
|
struct ifreq ifr;
|
||
|
|
unsigned int ip;
|
||
|
|
|
||
|
|
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
|
||
|
|
if (-1 == sockfd)
|
||
|
|
{
|
||
|
|
goto error;
|
||
|
|
}
|
||
|
|
|
||
|
|
strcpy(ifr.ifr_name,ifname);
|
||
|
|
if (ioctl(sockfd, SIOCGIFADDR, &ifr) < 0)
|
||
|
|
{
|
||
|
|
goto error;
|
||
|
|
}
|
||
|
|
|
||
|
|
ip = ((struct sockaddr_in*)&(ifr.ifr_addr))->sin_addr.s_addr;
|
||
|
|
close(sockfd);
|
||
|
|
return ip;
|
||
|
|
|
||
|
|
error:
|
||
|
|
close(sockfd);
|
||
|
|
return INADDR_NONE;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* this function is copy from other system. */
|
||
|
|
/*
|
||
|
|
char *memcasemem(const char *strsrc,int len1,const char *substr,int len2)
|
||
|
|
{
|
||
|
|
|
||
|
|
char *p1,*p2,*pend;
|
||
|
|
char *p;
|
||
|
|
char *substrS;
|
||
|
|
int i,lenth;
|
||
|
|
|
||
|
|
if((strsrc==NULL)||substr==NULL)
|
||
|
|
return NULL;
|
||
|
|
if(len1<len2) return NULL;
|
||
|
|
|
||
|
|
lenth=len2;
|
||
|
|
substrS=(char *)malloc(sizeof(char)*(lenth+1));
|
||
|
|
if(substrS==NULL)
|
||
|
|
return NULL;
|
||
|
|
for(i=0;i<lenth;i++)
|
||
|
|
{
|
||
|
|
substrS[i]=tolower(*(substr+i));
|
||
|
|
}
|
||
|
|
substrS[lenth]=0;
|
||
|
|
|
||
|
|
lenth=len1;
|
||
|
|
pend =(char *)strsrc + lenth;
|
||
|
|
for(p1 =(char *) strsrc; p1 != pend;p1++)
|
||
|
|
{
|
||
|
|
for(p2 = p1,p = substrS;*p != '\0'&& p2 != pend;p++,p2++)
|
||
|
|
{
|
||
|
|
if(tolower(*p2) != *p)
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
if(*p == '\0')
|
||
|
|
{
|
||
|
|
free(substrS);
|
||
|
|
return p1;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
free(substrS);
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
*/
|
||
|
|
/*from sapp*/
|
||
|
|
extern "C" const char *printaddr (const struct layer_addr *paddrinfo, int threadindex)
|
||
|
|
{
|
||
|
|
static char maxbuf[64+1][128];
|
||
|
|
char *buf=maxbuf[threadindex];
|
||
|
|
char ip_str[64];
|
||
|
|
struct stream_tuple4_v4 *paddr;
|
||
|
|
struct stream_tuple4_v6 *paddr6;
|
||
|
|
|
||
|
|
if(NULL == paddrinfo){
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
if(paddrinfo->addrtype==ADDR_TYPE_IPV4)
|
||
|
|
{
|
||
|
|
paddr=(struct stream_tuple4_v4 *)paddrinfo->paddr;
|
||
|
|
memset(buf,0,64);
|
||
|
|
//strcpy (buf, int_ntoa (paddr->saddr));
|
||
|
|
inet_ntop(AF_INET, &paddr->saddr, ip_str, 64);
|
||
|
|
strcpy (buf, ip_str);
|
||
|
|
sprintf (buf + strlen (buf), ".%u>", ntohs(paddr->source));
|
||
|
|
//strcat (buf, int_ntoa (paddr->daddr));
|
||
|
|
inet_ntop(AF_INET, &paddr->daddr, ip_str, 64);
|
||
|
|
strcat (buf, ip_str);
|
||
|
|
sprintf (buf + strlen (buf), ".%u", ntohs(paddr->dest));
|
||
|
|
}
|
||
|
|
//to addjust
|
||
|
|
else if(paddrinfo->addrtype==ADDR_TYPE_IPV6)
|
||
|
|
{
|
||
|
|
paddr6=(struct stream_tuple4_v6 *)(paddrinfo->paddr);
|
||
|
|
memset(buf,0,128);
|
||
|
|
inet_ntop(AF_INET6, paddr6->saddr, ip_str, 64);
|
||
|
|
strcpy (buf, ip_str);
|
||
|
|
sprintf (buf + strlen (buf), ".%u>", ntohs(paddr6->source));
|
||
|
|
inet_ntop(AF_INET6, paddr6->daddr, ip_str, 64);
|
||
|
|
strcat (buf, ip_str);
|
||
|
|
sprintf (buf + strlen (buf), ".%u", ntohs(paddr6->dest));
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
return (const char *)"Not support layer type";
|
||
|
|
}
|
||
|
|
return buf;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|