⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 update386.c

📁 arm9软件自动升级功能的例子。 实现arm9软件的自动升级
💻 C
📖 第 1 页 / 共 2 页
字号:
			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 + -