diff options
Diffstat (limited to 'kni_intercept.c')
| -rw-r--r-- | kni_intercept.c | 45 |
1 files changed, 39 insertions, 6 deletions
diff --git a/kni_intercept.c b/kni_intercept.c index 2553775..4765984 100644 --- a/kni_intercept.c +++ b/kni_intercept.c @@ -30,11 +30,13 @@ size_t add_option(char* buff, size_t size, uint16_t opt_type, uint16_t opt_len, return 0; } *((uint16_t*)buff)=opt_type; - *((uint16_t*)(buff+sizeof(uint16_t))=opt_len; + *((uint16_t*)(buff+sizeof(uint16_t)))=opt_len; memcpy(buff+sizeof(uint16_t)*2, opt_cont, opt_len); return opt_len+sizeof(uint16_t)*2; } -int kni_set_tlvinfo(char* buf, int buflen, struct kni_lqueue_datainfo datainfo) + + +int kni_set_tlvinfo(char* buf, int buflen, struct kni_repaired_fds datainfo) { int tlv_len = 0; @@ -45,10 +47,10 @@ int kni_set_tlvinfo(char* buf, int buflen, struct kni_lqueue_datainfo datainfo) tlv_len += sizeof(struct kni_tlv_header); - tlv_len+=add_option(buf+tlv_len,buflen-tlv_len, KNI_TLV_TYPE_PROTOCOL, (uint16_t)sizeof(int), &(datainfo.protocol)); - tlv_len+=add_option(buf+tlv_len,buflen-tlv_len, KNI_TLV_TYPE_KEYRING_ID, (uint16_t)sizeof(int), &(datainfo.keyring)); + tlv_len+=add_option(buf+tlv_len,buflen-tlv_len, KNI_TLV_TYPE_PROTOCOL, (uint16_t)sizeof(int), (char*)&(datainfo.protocol)); + tlv_len+=add_option(buf+tlv_len,buflen-tlv_len, KNI_TLV_TYPE_KEYRING_ID, (uint16_t)sizeof(int), (char*)&(datainfo.keyring)); - assert(tlv_len=<buflen); + assert(tlv_len<=buflen); return tlv_len; @@ -278,6 +280,37 @@ int tun_error(int i,int* fds) } +int tun_alloc(char *dev) +{ + struct ifreq ifr; + int fd, err; + + if ((fd = open("/dev/net/tun", O_RDWR)) < 0) + { + printf("open function errno %d is %s\n",errno,strerror(errno)); + return -1; + } + + memset(&ifr, 0, sizeof(ifr)); + ifr.ifr_flags = IFF_TUN | IFF_NO_PI;//������tun����Ϣ + + if (*dev) + { + strncpy(ifr.ifr_name, dev, IFNAMSIZ); + } + + if ((err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0) + { + printf("ioctl function err is %d,errno %d is %s\n",err,errno,strerror(errno)); + close(fd); + return -1; + } + strcpy(dev, ifr.ifr_name); + + return fd; +} + + /* Flags: IFF_TUN - TUN device (no Ethernet headers) * IFF_TAP - TAP device @@ -351,7 +384,6 @@ int tun_alloc_mq(char *dev, int queues, int *fds,char* tun_path) MESA_load_profile_string_def((char*)KNI_CONF_FILENAME,(char*)KNI_TUN_MODE,(char*)"tun_name",g_kni_comminfo.tun_name,KNI_CONF_MAXLEN,"tun0"); -// g_kni_comminfo.tun_threadnum=g_iThreadNum; if(g_kni_comminfo.tun_threadnum<=0) { MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,KNI_MODULE_INIT,"thread_num:%d,action:%s",g_kni_comminfo.thread_num,KNI_ACTION_EXIT); @@ -359,6 +391,7 @@ int tun_alloc_mq(char *dev, int queues, int *fds,char* tun_path) } g_kni_comminfo.fd_tun=ALLOC(int, g_kni_comminfo.tun_threadnum); + ret=tun_alloc_mq(g_kni_comminfo.tun_name,g_kni_comminfo.tun_threadnum,g_kni_comminfo.fd_tun,tun_path); |
