1、errno打印错误信息
2、发包时寻找发包网卡根据routdir方向,而非指定某个网卡是客户端
This commit is contained in:
liuyang
2018-07-18 10:37:20 +08:00
parent 9d6b266f97
commit 1b80c39df7
2 changed files with 194 additions and 27 deletions

213
kni.c
View File

@@ -31,7 +31,7 @@
#include "kni.h"
int g_kni_version_VERSION_20180711_3;
int g_kni_version_VERSION_20180718;
struct kni_var_comm g_kni_comminfo;
struct kni_var_struct g_kni_structinfo;
@@ -39,6 +39,7 @@ struct kni_var_maat g_kni_maatinfo;
struct kni_fs2_info g_kni_fs2_info;
struct kni_switch_info g_kni_switch_info;
char g_kni_cardname[KNI_CARD_NUM][KNI_CONF_MAXLEN];
int g_kni_threadseq[KNI_MAX_THREADNUM];
const char *g_kni_fs2_name[FS2_COLUMN_NUM] ={"RECV_PKTS","FWD_PKTS","DROP_PKTS","WRITE_PKTS","READ_PKTS","SEND_PKTS"};
@@ -267,7 +268,7 @@ static int kni_send_fds(int socket, int *fds, int n,int protocol)
// if (sendmsg (socket, &msg, 0) < 0)
if (sendmsg (socket, &msg, flags) < 0)
{
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"kni_send_fds","sendmsg()error,errno:%d",errno);
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"kni_send_fds","sendmsg()error,errno:%d,%s",errno,strerror(errno));
return -1;
}
@@ -328,14 +329,14 @@ int tun_alloc_mq(char *dev, int queues, int *fds)
{
if ((fd = open(clonedev, O_RDWR)) < 0)
{
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,KNI_MODULE_INIT,"tun_alloc_mq():open error,errno is:%d,action:%s",errno,KNI_ACTION_EXIT);
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,KNI_MODULE_INIT,"tun_alloc_mq():open error,errno is:%d,%s,action:%s",errno,strerror(errno),KNI_ACTION_EXIT);
tun_error(i,fds);
return -1;
}
err = ioctl(fd, TUNSETIFF, (void *)&ifr);
if (err)
{
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,KNI_MODULE_INIT,"tun_alloc_mq():ioctl error,errno is:%d,action:%s",errno,KNI_ACTION_EXIT);
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,KNI_MODULE_INIT,"tun_alloc_mq():ioctl error,errno is:%d,%s,action:%s",errno,strerror(errno),KNI_ACTION_EXIT);
close(fd);
tun_error(i,fds);
return -1;
@@ -345,12 +346,12 @@ int tun_alloc_mq(char *dev, int queues, int *fds)
flag= fcntl(fd, F_GETFL, 0);
if(flag<0)
{
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,KNI_MODULE_INIT,"fcntl():getfl error,errno is:%d",errno);
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,KNI_MODULE_INIT,"fcntl():getfl error,errno is:%d,%s",errno,strerror(errno));
}
if( fcntl( fd, F_SETFL, flag|O_NONBLOCK ) < 0 )
{
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,KNI_MODULE_INIT,"fcntl():setfl error,errno is:%d",errno);
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,KNI_MODULE_INIT,"fcntl():setfl error,errno is:%d,%s",errno,strerror(errno));
}
//end
@@ -414,7 +415,7 @@ int tun_read_data(int fd,char* recv_buf,int max_buflen)
}
else if(recv_len <0)
{
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,KNI_MODULE_WRITETUN,"tun_read_data error,msg is: %s\n",strerror(errno));
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,KNI_MODULE_WRITETUN,"tun_read_data error %d, %s\n",errno,strerror(errno));
return -1;
}
else
@@ -440,7 +441,7 @@ char tun_write_data(int fd,char* send_buf,int send_buflen,struct streaminfo* pst
if((succ_sendlen<0)&&(pstream!=NULL))
{
MESA_kill_tcp(pstream,(const void*)send_buf);
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,KNI_MODULE_WRITETUN,"write() error!msg is %s",strerror(errno));
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,KNI_MODULE_WRITETUN,"write() error %d, %s",errno,strerror(errno));
ret=APP_STATE_DROPPKT|APP_STATE_DROPME;
}
else if(succ_sendlen<send_buflen)
@@ -480,7 +481,85 @@ int tun_write_data_v6(int fd,char* send_buf,int send_buflen)
}
int kni_sendpkt_eth(int thread_seq,int iplen,char* ip,struct stream_tuple4_v4* ipv4_addr,int iprever_flag,uchar* smac,uchar* dmac)
int kni_sendpkt_routdir(int thread_seq,int iplen,char* ip,struct stream_tuple4_v4* ipv4_addr,int iprever_flag,int routdir,uchar* smac,uchar* dmac)
{
int ret=0;
int buflen=iplen+KNI_ETHER_LEN;
unsigned char buf[2000]={0};
unsigned short eth_type=0x0800;
uchar* tmp_smac;
uchar* tmp_dmac;
char* if_name=NULL;
if(iprever_flag==0)
{
tmp_smac=smac;
tmp_dmac=dmac;
}
else
{
tmp_smac=dmac;
tmp_dmac=smac;
}
if_name=g_kni_cardname[1-routdir];
struct ifreq ifr;
size_t ifname_len=strlen(if_name);
if(ifname_len<sizeof(ifr.ifr_name))
{
memset(ifr.ifr_name,0,IFNAMSIZ);
memcpy(ifr.ifr_name,if_name,ifname_len);
}
else
{
printf("interface name is too long\n");
return -1;
}
if(-1==ioctl(g_kni_comminfo.ipv4_fd[thread_seq],SIOCGIFINDEX,&ifr))
{
printf("get if index error:%d,%s",errno,strerror(errno));
return -1;
}
struct sockaddr_ll addr={0};
addr.sll_family=AF_PACKET;
addr.sll_halen=ETHER_ADDR_LEN;
addr.sll_ifindex=ifr.ifr_ifindex;
addr.sll_protocol=htons(ETH_P_IP);
memcpy(addr.sll_addr,tmp_dmac,ETHER_ADDR_LEN);
if(ioctl(g_kni_comminfo.ipv4_fd[thread_seq],SIOCGIFHWADDR,&ifr)==-1)
{
return -1;
}
sendpacket_build_ethernet((unsigned char*)tmp_dmac,(unsigned char*)tmp_smac,eth_type,(const unsigned char*)ip,iplen,(unsigned char*)buf);
ret=sendto(g_kni_comminfo.ipv4_fd[thread_seq],buf,buflen,0,(struct sockaddr*)&addr,sizeof(addr));
if(ret<0)
{
MESA_handle_runtime_log(g_kni_comminfo.logger,RLOG_LV_FATAL,KNI_MODULE_SENDPKT,"sendto() error,errno:%d,msg:%s!",errno,strerror(errno));
}
else
{
kni_debug_info_v4((char*)KNI_MODULE_SENDPKT,KNI_FLAG_SSL,(struct ip*)ip);
}
return ret;
}
int kni_sendpkt_eth(int thread_seq,int iplen,char* ip,struct stream_tuple4_v4* ipv4_addr,int iprever_flag,int routdir,uchar* smac,uchar* dmac)
{
int ret=0;
int buflen=iplen+KNI_ETHER_LEN;
@@ -525,7 +604,7 @@ int kni_sendpkt_eth(int thread_seq,int iplen,char* ip,struct stream_tuple4_v4* i
if(-1==ioctl(g_kni_comminfo.ipv4_fd[thread_seq],SIOCGIFINDEX,&ifr))
{
printf("get if index error:%d",errno);
printf("get if index error:%d,%s",errno,strerror(errno));
return -1;
}
@@ -643,6 +722,16 @@ long kni_readtun_htable_cb_v4(void* data,const unsigned char* key,unsigned int s
{
memcpy(args->smac,datainfo->smac,KNI_MACADDR_LEN);
memcpy(args->dmac,datainfo->dmac,KNI_MACADDR_LEN);
if(args->iprevers==0)
{
args->routdir=datainfo->route_dir;
}
else
{
// args->routdir=MESA_dir_reverse(datainfo->route_dir);
args->routdir=1-datainfo->route_dir;
}
if(datainfo->wndpro_flag[1-args->iprevers]>0)
{
@@ -698,7 +787,7 @@ int init_domain_fd()
if ( ( i_fd = socket( AF_UNIX, SOCK_STREAM, 0 ) ) < 0 )
// if ( ( i_fd = socket( AF_UNIX, SOCK_DGRAM, 0 ) ) < 0 )
{
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,KNI_MODULE_INIT,"init_domain_fd():socket error,errno is %d,action:%s",errno,KNI_ACTION_EXIT);
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,KNI_MODULE_INIT,"init_domain_fd():socket error,errno is %d,%s,,action:%s",errno,strerror(errno),KNI_ACTION_EXIT);
return -1;
}
@@ -712,7 +801,7 @@ int init_domain_fd()
if ( connect( i_fd, ( struct sockaddr * )&addr, i_addr_len ) < 0 )
{
close(i_fd);
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,KNI_MODULE_INIT,"init_domain_fd():connect error,errno is %d,action:%s",errno,KNI_ACTION_EXIT);
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,KNI_MODULE_INIT,"init_domain_fd():connect error,errno is %d,%s,action:%s",errno,strerror(errno),KNI_ACTION_EXIT);
return -1;
}
@@ -746,7 +835,8 @@ int kni_process_readdata(int thread_seq,int buflen,char* buf)
if(result==1)
{
kni_sendpkt_eth(thread_seq,buflen,buf,&ipv4_addr,iprever_flag,args.smac,args.dmac);
// kni_sendpkt_eth(thread_seq,buflen,buf,&ipv4_addr,iprever_flag,args.routdir,args.smac,args.dmac);
kni_sendpkt_routdir(thread_seq,buflen,buf,&ipv4_addr,iprever_flag,args.routdir,args.smac,args.dmac);
}
}
@@ -928,21 +1018,21 @@ int tcprepair_set_state(int sk,struct kni_tcp_state* tcp)
if (setsockopt(sk, SOL_TCP, TCP_REPAIR, &yes, sizeof(yes))==-1)
{
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"tcprepair_set_state","setsockopt() TCP_REPAIR error,errno:%d",errno);
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"tcprepair_set_state","setsockopt() TCP_REPAIR error,errno:%d,%s",errno,strerror(errno));
return -1;
}
if (setsockopt(sk, SOL_IP, IP_TRANSPARENT, &yes, sizeof(yes)) < 0)
{
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"tcprepair_set_state","setsockopt() IP_TRANSPARENT error,errno:%d",errno);
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"tcprepair_set_state","setsockopt() IP_TRANSPARENT error,errno:%d,%s",errno,strerror(errno));
return -1;
}
if (setsockopt(sk, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) == -1)
{
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"tcprepair_set_state","setsockopt() SO_REUSEADDR error,errno:%d",errno);
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"tcprepair_set_state","setsockopt() SO_REUSEADDR error,errno:%d,%s",errno,strerror(errno));
return -1;
}
/*
@@ -960,28 +1050,28 @@ int tcprepair_set_state(int sk,struct kni_tcp_state* tcp)
val = TCP_SEND_QUEUE;
if (setsockopt(sk, SOL_TCP, TCP_REPAIR_QUEUE, &val, sizeof(val)))
{
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"tcprepair_set_state","setsockopt() TCP_REPAIR_QUEUE,TCP_SEND_QUEUE error,errno:%d",errno);
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"tcprepair_set_state","setsockopt() TCP_REPAIR_QUEUE,TCP_SEND_QUEUE error,errno:%d,%s",errno,strerror(errno));
return -1;
}
val = tcp->seq;
if (setsockopt(sk, SOL_TCP, TCP_QUEUE_SEQ, &val, sizeof(val)))
{
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"tcprepair_set_state","setsockopt() TCP_QUEUE_SEQ error,errno:%d",errno);
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"tcprepair_set_state","setsockopt() TCP_QUEUE_SEQ error,errno:%d,%s",errno,strerror(errno));
return -1;
}
val = TCP_RECV_QUEUE;
if (setsockopt(sk, SOL_TCP, TCP_REPAIR_QUEUE, &val, sizeof(val)))
{
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"tcprepair_set_state","setsockopt() TCP_REPAIR_QUEUE,TCP_RECV_QUEUE error,errno:%d",errno);
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"tcprepair_set_state","setsockopt() TCP_REPAIR_QUEUE,TCP_RECV_QUEUE error,errno:%d,%s",errno,strerror(errno));
return -1;
}
val = tcp->ack;
if (setsockopt(sk, SOL_TCP, TCP_QUEUE_SEQ, &val, sizeof(val)))
{
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"tcprepair_set_state","setsockopt() TCP_QUEUE_SEQ error,errno:%d",errno);
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"tcprepair_set_state","setsockopt() TCP_QUEUE_SEQ error,errno:%d,%s",errno,strerror(errno));
return -1;
}
@@ -1009,7 +1099,7 @@ int tcprepair_set_state(int sk,struct kni_tcp_state* tcp)
if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)))
{
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"tcprepair_set_state","bind() error,errno:%d",errno);
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"tcprepair_set_state","bind() error,errno:%d,%s",errno,strerror(errno));
return -1;
}
@@ -1020,7 +1110,7 @@ int tcprepair_set_state(int sk,struct kni_tcp_state* tcp)
if (connect(sk, (struct sockaddr *) &addr, sizeof(addr)))
{
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"tcprepair_set_state","connect() error,errno:%d",errno);
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"tcprepair_set_state","connect() error,errno:%d,%s",errno,strerror(errno));
return -1;
}
@@ -1048,14 +1138,14 @@ int tcprepair_set_state(int sk,struct kni_tcp_state* tcp)
if (setsockopt(sk, SOL_TCP, TCP_REPAIR_OPTIONS,opts, onr * sizeof(struct tcp_repair_opt)) < 0)
{
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"tcprepair_set_state","setsockopt() TCP_REPAIR_OPTIONS error,errno:%d",errno);
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"tcprepair_set_state","setsockopt() TCP_REPAIR_OPTIONS error,errno:%d,%s",errno,strerror(errno));
return -1;
}
val = 0;
if (setsockopt(sk, SOL_TCP, TCP_REPAIR, &val, sizeof(val)))
{
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"tcprepair_set_state","setsockopt() TCP_REPAIR close error,errno:%d",errno);
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"tcprepair_set_state","setsockopt() TCP_REPAIR close error,errno:%d,%s",errno,strerror(errno));
return -1;
}
@@ -1465,7 +1555,8 @@ int kni_htable_add(const struct streaminfo* pstream,const struct ip* ip_hdr,stru
}
else
{
datainfo->route_dir=MESA_dir_reverse(pstream->routedir);
// datainfo->route_dir=MESA_dir_reverse(pstream->routedir);
datainfo->route_dir=1-pstream->routedir;
memcpy(datainfo->smac,mac_addr->dst_mac,MAC_ADDR_LEN);
memcpy(datainfo->dmac,mac_addr->src_mac,MAC_ADDR_LEN);
}
@@ -2012,6 +2103,77 @@ int init_kni_stat_htable()
}
int kni_read_cardname()
{
int offset=0;
char* token=NULL;
char buf[KNI_CONF_MAXLEN]={0};
int routdir=0;
FILE* fp=fopen("./conf/send_raw_pkt.conf","r");
if(fp==NULL)
{
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"kni_read_cardname","fopen ./conf/send_raw_pkt.conf err,errno:%d,%s",errno,strerror(errno));
return -1;
}
while(feof(fp)==0)
{
routdir=0;
memset(buf,0,KNI_CONF_MAXLEN);
if((fgets(buf,KNI_CONF_MAXLEN,fp)==NULL))
{
break;
}
if(buf[0]=='#')
{
continue;
}
token=strtok(buf,"\t, ");
offset=1;
while(token!=NULL)
{
switch(offset)
{
case KNI_OFFSET_ROUTDIR:
routdir=atoi(token);
if((routdir!=0)&&(routdir!=1))
{
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"kni_read_cardname","routdir :%d error",routdir);
return -1;
}
break;
case KNI_OFFSET_CARDNAME:
memcpy(g_kni_cardname[routdir],token,strlen(token));
break;
default:
break;
}
token=strtok(NULL,"\t, ");
offset++;
}
}
fclose(fp);
fp=NULL;
MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,"kni_read_cardname","card name:%s,%s",g_kni_cardname[0],g_kni_cardname[1]);
return 0;
}
extern "C" char kni_init()
@@ -2154,6 +2316,7 @@ extern "C" char kni_init()
//test init raw_socket
kni_read_cardname();
g_kni_comminfo.ipv4_fd=(int*)malloc(g_kni_comminfo.thread_num*sizeof(int));
for(i=0;i<g_kni_comminfo.thread_num;i++)
{

8
kni.h
View File

@@ -60,11 +60,14 @@
#define KNI_ACTION_EXIT "exit..."
//init profile info
#define KNI_CONF_MAXLEN 256
#define KNI_CONF_MAXLEN 1024
#define KNI_CONF_FILENAME "./kniconf/kni.conf"
#define KNI_CONF_MODE "Module"
#define KNI_CONF_FILENAME_MAIN "./conf/main.conf"
#define KNI_OFFSET_ROUTDIR 1
#define KNI_OFFSET_CARDNAME 3
#define KNI_CARD_NUM 2
@@ -355,9 +358,10 @@ struct kni_tcp_state
struct args_read_tun
{
int thread_seq;
int thread_seq; //in
int iprevers; //in
int iplen; //in
int routdir; //out
char* a_packet; //in
unsigned char smac[KNI_MACADDR_LEN]; //out
unsigned char dmac[KNI_MACADDR_LEN]; //ouit