From 1b80c39df739ba94eec4e053a734b16a47b34ea6 Mon Sep 17 00:00:00 2001 From: liuyang Date: Wed, 18 Jul 2018 10:37:20 +0800 Subject: [PATCH] =?UTF-8?q?20180718=201=E3=80=81errno=E6=89=93=E5=8D=B0?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E4=BF=A1=E6=81=AF=202=E3=80=81=E5=8F=91?= =?UTF-8?q?=E5=8C=85=E6=97=B6=E5=AF=BB=E6=89=BE=E5=8F=91=E5=8C=85=E7=BD=91?= =?UTF-8?q?=E5=8D=A1=E6=A0=B9=E6=8D=AEroutdir=E6=96=B9=E5=90=91=EF=BC=8C?= =?UTF-8?q?=E8=80=8C=E9=9D=9E=E6=8C=87=E5=AE=9A=E6=9F=90=E4=B8=AA=E7=BD=91?= =?UTF-8?q?=E5=8D=A1=E6=98=AF=E5=AE=A2=E6=88=B7=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kni.c | 213 +++++++++++++++++++++++++++++++++++++++++++++++++++------- kni.h | 8 ++- 2 files changed, 194 insertions(+), 27 deletions(-) diff --git a/kni.c b/kni.c index 67e3748..13615ae 100644 --- a/kni.c +++ b/kni.c @@ -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_sendlensmac,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