📄 update386.c
字号:
pd(DEBUGLEVEL2,"send 3times,not rec a ack ,the num is %d",packnumcount); goto endthread; } pd(DEBUGLEVEL2,"recv a ack,count = %d\n",packnumcount); } if(0!=readlen) { pd(DEBUGLEVEL2,"0!=readlen,error"); goto endthread; } pd(DEBUGLEVEL2,"send all packs,total %d packs\n",packnumcount); /*发送升级结束命令,等待ack*/ for(i = 0; i<3;i++) { sendret = sendto(sockfd, &updateend, 1, 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr)); if(sendret != 1) { pe("sendto"); continue; } sleep(2); pd(DEBUGLEVEL2,"has send end pack\n"); n = recvfrom(sockfd, rec, 128, 0,(struct sockaddr *)(&cliaddr), &reclen); if((n>0)&&(rec[0] == UP386_DOWNLOADEND)) { break; } } if(i >=3) { pd(DEBUGLEVEL2,"send 3times,not rec a UP386_DOWNLOADEND ack "); goto endthread; } pd(DEBUGLEVEL2," update success");endthread: threadbook[xb].ifBeUsed = 0; setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int)); close(fd); close(sockfd); return NULL;}/*主要功能:收包线程输入:packet:收到的包地址输出:null返回值:null*/void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet){ static int count = 1; pthread_t jbid; struct ether_header *ethernet, *eth_out; /* ethernet header [1] */ struct sniff_ip *ip, *ip_out; /* IP header */ struct udphdr *udp,*udp_out; /* udp header */ u_char *payload,*buf; char* dhcp,*dhcp_out; unsigned short * port_out; char rec386ver[10] = {0}; int size_ip; int size_payload; int fd; int i; int ret; int sendlen = 0; int needthreadcreate= 0; buf = ALLIGNMENT(up386sbuf[0]) + 2; fd = *(int*)args; eth_out = (struct ether_header *)buf; ip_out = (struct sniff_ip *) (buf + ETH_HLEN); udp_out = (struct udphdr *) (buf +ETH_HLEN + IP_HLEN); dhcp_out = (char *)(buf + ETH_HLEN + IP_HLEN+ UDP_HLEN); port_out = (unsigned short *)(buf + ETH_HLEN + IP_HLEN+ UDP_HLEN + 2); pd(DEBUGLEVEL2,"\nPacket number %d:\n", count); count++; /* define ethernet header */ ethernet = (struct ether_header*)(packet); /* define/compute ip header offset */ ip = (struct sniff_ip*)(packet + ETH_HLEN); udp = (struct udphdr*)(packet + ETH_HLEN + UDP_HLEN); size_ip = IP_HL(ip)*4; if (size_ip < 20) { pd(DEBUGLEVEL2," * Invalid IP header length: %u bytes\n", size_ip); return; } /* print source and destination IP addresses */ pd(DEBUGLEVEL2," From: %s\n", inet_ntoa(ip->ip_src)); pd(DEBUGLEVEL2," To: %s\n", inet_ntoa(ip->ip_dst)); /* determine protocol */ switch(ip->ip_p) { case IPPROTO_TCP: pd(DEBUGLEVEL2," Protocol: TCP\n"); return; case IPPROTO_UDP: pd(DEBUGLEVEL2," Protocol: UDP\n"); break; case IPPROTO_ICMP: pd(DEBUGLEVEL2," Protocol: ICMP\n"); return; case IPPROTO_IP: pd(DEBUGLEVEL2," Protocol: IP\n"); return; default: pd(DEBUGLEVEL2," Protocol: unknown\n"); return; } udp = (struct udphdr *) (packet + ETH_HLEN + size_ip); pd(DEBUGLEVEL2," Src port: %d\n", ntohs(udp->source)); pd(DEBUGLEVEL2," Dst port: %d\n", ntohs(udp->dest)); payload = (u_char *)(packet + ETH_HLEN + size_ip + UDP_HLEN); /* compute tcp payload (segment) size */ size_payload = ntohs(ip->ip_len) - (size_ip + UDP_HLEN); /* * Print payload data; it might be binary, so don't just * treat it as a string. */ if (size_payload > 0) { pd(DEBUGLEVEL2," Payload (%d bytes):\n", size_payload); } if ( ntohs(udp->dest) != MAINTHREADUPDPORT ) { pd(DEBUGLEVEL2,"ERR, dest port != 4455!,is %d\n",ntohs(udp->dest)); return; } dhcp = (char *)payload; for(i = 0;i<size_payload;i++) { pd(DEBUGLEVEL2,"%2x ",dhcp[i]); } if (size_payload !=10) { pd(DEBUGLEVEL2," size is not 10 ,not a ask pack\n"); } dhcp = (char *)payload; switch(*dhcp) { /*386询问是否需要升级*/ case UP386_ASKIFNEED: { pd(DEBUGLEVEL2,"a juno288ask if need update\n"); /*比较版本号*/ memcpy(rec386ver,dhcp+1,9); ret = vercmp386(rec386ver, cur386ver); pd(DEBUGLEVEL2,"588 version %s\n",cur386ver); pd(DEBUGLEVEL2,"386 version %s\n",rec386ver); /*错误的版本号不回复*/ if(-1==ret) { pd(DEBUGLEVEL2,"error version ,%s\n",rec386ver); return; } /*需要升级回复端口号*/ if(1==ret) { pd(DEBUGLEVEL2,"need update\n"); for(i = 0;i<MAX386NUM;i++) { if((0==memcmp(threadbook[i].mac386,ethernet->ether_shost,6))&&(1==threadbook[i].ifBeUsed )) { pd(DEBUGLEVEL2,"this 386 is updateing\n"); needthreadcreate = 1; *port_out = threadbook[i].udpPort; ip_out->ip_len = htons(IP_HLEN + UDP_HLEN + 4); udp_out->len = htons(UDP_HLEN + 4); sendlen = ETH_HLEN + IP_HLEN +UDP_HLEN + 4; goto sendpack; } } *dhcp_out = UP386_NEEDUPDATE; for(i = 0;i<MAX386NUM;i++) { if(0 ==threadbook[i].ifBeUsed) { threadbook[i].ifBeUsed = 1; memcpy(threadbook[i].mac386,ethernet->ether_shost,6); pd(DEBUGLEVEL2,"write a 386 mac,%2x:%2x:%2x:%2x:%2x:%2x:\n", threadbook[i].mac386[0],threadbook[i].mac386[1],threadbook[i].mac386[2], threadbook[i].mac386[3],threadbook[i].mac386[4],threadbook[i].mac386[5]); *port_out = threadbook[i].udpPort; ip_out->ip_len = htons(IP_HLEN + UDP_HLEN + 4); udp_out->len = htons(UDP_HLEN + 4); sendlen = ETH_HLEN + IP_HLEN +UDP_HLEN + 4; if(needthreadcreate ==0) { pd(DEBUGLEVEL2,"creat a new thread\n"); if(pthread_create(&jbid,NULL,startUpdate,(void *)(&i))<0) { pe("thread create"); } } /*等待新启动的线程进入收包状态*/ sleep(1); break; } pd(DEBUGLEVEL2,"8 threads full\n"); } } /*不需升级回复不必升级包*/ else { pd(DEBUGLEVEL2,"need not update\n"); *dhcp_out = UP386_NEEDNOTPDATE; ip_out->ip_len = htons(IP_HLEN + UDP_HLEN + 1); udp_out->len = htons(UDP_HLEN + 1); sendlen = ETH_HLEN + IP_HLEN +UDP_HLEN + 1; }sendpack: /* send reply ,tell the 386 the IP i have alloced for it*/ memcpy(eth_out->ether_dhost,ethernet->ether_shost,ETH_ALEN); ip_out->ip_id =htons( ipheadid++); ip_out->ip_sum = 0; //need to check check sum ip_out->ip_dst.s_addr =ip->ip_src.s_addr; ip_out->ip_src.s_addr = (IPADDR_386GATE); ip_out->ip_sum = (checksum((u_short*)ip_out, 10)); if(pcap_sendpacket(pup386,buf,sendlen) < 0) { pe("pcap_sendpacket"); } pd(DEBUGLEVEL2,"send ok\n"); return; } default: fprintf(stderr,"UNKNOWN netdev type ! \n"); return; }}/** *主要功能:设置调试信息,见设计文档8-4 *输入:调试参数 *输出:NULL *返回值:处理成功或失败 */static int paraSet (int argc, char *argv[]){ int c; int setdebug_flag = 0; int debug_level = 0; pd(DEBUGLEVEL2,"[paraSet] \n"); optind = 0; while ((c = getopt(argc, argv, "t:v:")) != -1) { switch (c) { case 'v': pd(DEBUGLEVEL2,"[paraSet] v para\n"); if((b_atoi(optarg, &debug_level) != 0) || (debug_level < 0)) { pw("[paraSet] v para error, debug_level = %d\n ",debug_level); return -1; } else { debug_init(argv[0], NULL, debug_level); setdebug_flag = 1; pd(DEBUGLEVEL2,"[paraSet] debug_init,debug_level = %d\n",debug_level); } break; case '?': return -1; default: return -1; } } if(!setdebug_flag) { pd(DEBUGLEVEL2,"[paraSet] no v para\n"); debug_init(argv[0], NULL, 0); } return 0;}/** *主要功能:动态更改参数 *输入:NULL *输出:NULL *返回值:NULL */void *lcomMonitor(){ char buf[1024 ] = {0}; int buflen = 0; lcom_head *lhead = (lcom_head *)buf; char *tmp = buf; int tmplen = 0; char **iargv = NULL; int iargc = 0; pd(DEBUGLEVEL2,"[lcomMonitor]\n"); tmp += (sizeof (lcom_head)); while(1) { buflen = lcom_receive((uint8_t *)buf, 1024); if(buflen < 0) { pe("lcom recv a error pack:\n"); continue; } pm(DEBUGLEVEL2,"lcom recv a pack :\n",(uint8_t *)buf,buflen); /*字符串加结束符*/ buf[buflen] = 0; tmplen = buflen - sizeof(lcom_head); if(0>tmplen) { pw("[lcomMonitor]:lcom recv a err pack ,the lenth is shorter than sizeof head\n"); } pm(DEBUGLEVEL2,"lcom recv a pack the string(not cotain head) is :\n",(uint8_t *)tmp,tmplen); switch(lhead->des_func) { case LCOM_FUNC_COMMAND_ARG: pd(DEBUGLEVEL2,"[lcomMonitor]para set\n"); iargc = parse_to_arg("dhcp", tmp, &iargv); if(0!=paraSet(iargc,iargv)) pw("[lcomMonitor],can't set para\n"); break; } } return NULL;}/*主要功能:主函数输入:argc:参数个数 argv参数列表输出:null返回值:null*/int main(int argc, char **argv){ pthread_t pid; int fd_smi = 0; int num_packets = -1; if(0!=paraSet(argc,argv)) { pw("[main]:can't set argvs\n"); return 0; } if(-1==get386Version(cur386ver)) { pd(DEBUGLEVEL2,"can't read my current version\n"); return 0; } /* local socket init */ lcom_socket_init(UPDATE386_ID); update386_local_sock_fd = lcom_get_fd(); if(pthread_create(&pid,NULL,lcomMonitor,NULL)<0) { pe("thread create"); } printf("aaaaaaaaaaaaaaaa\n"); /*初始化线程记录数组*/ init_thread_book(); printf("bbbbbbbbbbbbbbb\n"); /*init the pack buffer,fill in some public parameter*/ sbuf_init(); /*start pcap*/ pd(DEBUGLEVEL2,"pcap_start ...., p : %04x\n", pup386); pup386 = pcap_start( update386dev, update386filter_exp); pd(DEBUGLEVEL2,"pcap_start done, p : %04x\n", pup386); /* now we can set our callback function */ pcap_loop(pup386, num_packets, got_packet, (void *)&fd_smi); /* cleanup */ pthread_join(pid,NULL); pcap_close(pup386); pd(DEBUGLEVEL2,"\nCapture complete.\n"); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -