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

📄 trace.c

📁 OLSR Implementation for XORP
💻 C
📖 第 1 页 / 共 2 页
字号:
		lastlog = now;	}	fprintf(fd, "%s ", action);	fprintf(fd, "address : %s, ", convert_address_to_string(addr));	fprintf(fd, " timer %d\n", timer);	if (tracehistory && !tracepackets && ifp)		dumpif(fd, ifp);	fflush(fd);	if (ferror(fd))		traceoff();}void dumpif(FILE *fd, struct interface *ifp){	if (ifp->int_input.ifd_count || ifp->int_output.ifd_count) 	{		fprintf(fd, "*** Packet history for interface %s ***\n", ifp->int_name);		dumptrace(fd, "from", &ifp->int_input);		fprintf(fd, "*** end packet history ***\n");	}}void dumptrace(FILE *fd, char *dir, struct ifdebug *ifd){	struct iftrace *t;	const char *cp = !strcmp(dir, "to") ? "Output" : "Input";	if (ifd->ifd_front == ifd->ifd_records && ifd->ifd_front->ift_size == 0) 	{		fprintf(fd, "%s: no packets.\n", cp);		fflush(fd);		return;	}	fprintf(fd, "%s trace:\n", cp);	t = ifd->ifd_front - ifd->ifd_count;	if (t < ifd->ifd_records)		t += NRECORDS;	for ( ; ifd->ifd_count; ifd->ifd_count--, t++) 	{		if (t >= ifd->ifd_records + NRECORDS)			t = ifd->ifd_records;		if (t->ift_size == 0)			continue;		dumppacket(fd, dir, &t->ift_who, t->ift_packet, t->ift_size, &t->ift_stamp);	}}void dumppacket(FILE *fd, char *dir, struct sockaddr *sa, char *cp, int size, struct timeval *stamp){	//v4->v6 modify	char str[INET6_ADDRSTRLEN];	struct olsr *msg = (struct olsr *)cp;	struct olsrmsg *m = msg->olsr_msg, *mes;	struct hellomsg *h;	struct hellinfo *hinf;	struct olsr_ip_addr *haddr, *hadr;	struct in6_addr address;	struct tcmsg *tc;	struct olsr_ip_addr *maddr;	struct sockaddr_in6 *who = (struct sockaddr_in6 *)sa;	if (fd == NULL)		return;	if (tracepackets && tracecontents == 0) 	{		fflush(fd);		return;	}	fprintf(fd, "\n********** Packet length:  %d **********\n",ntohs(msg->olsr_packlen));	/* the following "for" is revised by Y.Ge */	//for (mes = m; (char *)mes < (char *)msg + ntohs(msg->olsr_packlen); mes = (struct olsrmsg *)((char *)mes + ntohs(mes->olsr_nextmsg)))	for (mes = m; (char *)mes < (char *)msg + ntohs(msg->olsr_packlen); mes = (struct olsrmsg *)((char *)mes + ntohs(mes->olsr_msgsize)))	{			fprintf(fd, "\n             --------------------         ");		/*v4->v6 del		if (mes->olsr_msgtype && mes->olsr_msgtype < OLSRTYPE_MAX)			fprintf(fd, "\n %s %s %s %.19s:\n", olsrtypes[mes->olsr_msgtype], dir, inet_ntoa(who->sin_addr), ctime((time_t *)&stamp->tv_sec));		else 		{			fprintf(fd, "Bad packet type  0x%x %s %s %.19s\n", mes->olsr_msgtype, dir, inet_ntoa(who->sin_addr), ctime((time_t *)&stamp->tv_sec));			fprintf(fd, "size=%d cp=%p packet=%p\n", size, cp, packet);			fflush(fd);			return;		}*/			//v4->v6 add		if (mes->olsr_msgtype && mes->olsr_msgtype < OLSRTYPE_MAX)			fprintf(fd, "\n %s %s %s %.19s:\n", olsrtypes[mes->olsr_msgtype],dir, inet_ntop(AF_INET6,&who->sin6_addr,str,sizeof(str)),ctime((time_t *)&stamp->tv_sec));		else 		{			fprintf(fd, "Bad packet type  0x%x %s %s %.19s\n", mes->olsr_msgtype,dir, inet_ntop(AF_INET6,&who->sin6_addr,str,sizeof(str)),ctime((time_t *)&stamp->tv_sec));			fprintf(fd, "size=%d cp=%p packet=%p\n", size, cp, packet);			fflush(fd);			return;		}		fprintf(fd, "Message type:  %d \n", mes->olsr_msgtype);		//fprintf(fd, "Broadcast ?:   %s \n", mes->olsr_broad ? "YES" : "NO");  //commented by Y.Ge		//fprintf(fd, "Next message:  %d \n\n", ntohs(mes->olsr_nextmsg));  //commented bby Y.Ge		switch (mes->olsr_msgtype) 		{			case HELLO_PACKET:			case UPDATE_NEIGHBOR:				h = mes->olsr_hello;				/*fprintf(fd, "Packet seq number:  %d \n", ntohs(h->hell_seqnum));				fprintf(fd, "MPR Sequence number:  %d \n\n", ntohs(h->hell_mprseqnum));*/ //commented by Y.Ge				/* the following "for" is revised by Y.Ge */				//for (hinf = h->hell_info; (char *)hinf < (char *)mes + ntohs(mes->olsr_nextmsg); hinf = (struct hellinfo *)((char *)hinf + ntohs(hinf->next_linktype)))				for (hinf = h->hell_info; (char *)hinf < (char *)mes + ntohs(mes->olsr_msgsize); hinf = (struct hellinfo *)((char *)hinf + ntohs(hinf->link_msg_size)))				{					//fprintf(fd, "Link type:  %d \n", hinf->link_type);  //commented by Y.Ge					//fprintf(fd, "Next link type:  %d \n", ntohs(hinf->next_linktype));  //commented by Y.Ge								fprintf(fd, "Link type:  %d \n", hinf->link_code);  //commented by Y.Ge					fprintf(fd, "Next link type:  %d \n", ntohs(hinf->link_msg_size));  //commented by Y.Ge					haddr = hinf->neigh_addr; 					/* the following "for" is revised by Y.Ge */					//for (hadr = haddr; (char *)hadr < (char *)hinf + ntohs(hinf->next_linktype); hadr++)					for (hadr = haddr; (char *)hadr < (char *)hinf + ntohs(hinf->link_msg_size); hadr++)					{						/*v4->v6 del address.s_addr = *hadr;		  						fprintf(fd, "Neighbor addr %s\n", inet_ntoa(address));*/		  						//v4->v6 add						memcpy(&(address.s6_addr),hadr,sizeof(struct in6_addr));						fprintf(fd, "Neighbor addr %s\n", inet_ntop(AF_INET6,&address,str,sizeof(str)));					}				}				break;			case TC_PACKET:				tc = mes->olsr_tc;				//fprintf(fd, "Packet seq number: %d \n", ntohs(tc->tc_seqnum)); //commented by Y.Ge				fprintf(fd, "Packet seq number: %d \n", ntohs(mes->olsr_msgseq)); //added by Y.Ge				fprintf(fd, "MPRS Sequence number: %d \n", ntohs(tc->tc_mprseqnum));				//fprintf(fd, "Hop Count:  %d \n", tc->tc_hopcnt); //commented by Y.Ge				fprintf(fd, "Hop Count:  %d \n", mes->olsr_hopcount); //added by Y.Ge					/*v4->v6 del address.s_addr = tc->tc_origaddr;				fprintf(fd, "Originator address %s\n", inet_ntoa(address));*/	 				//v4->v6 add				//memcpy(&(address.s6_addr),&(tc->tc_origaddr),sizeof(struct in6_addr)); //commented by Y.Ge				memcpy(&(address.s6_addr),&(mes->olsr_source),sizeof(struct in6_addr)); //added by Y.Ge				fprintf(fd, "Originator address %s\n",inet_ntop(AF_INET6,&address,str,sizeof(struct olsr_ip_addr)));				/* the following "for" is revised by Y.Ge */				//for (maddr = tc->tc_mprsaddr; (char *)maddr < (char *)mes + ntohs(mes->olsr_nextmsg);  maddr++)				for (maddr = tc->tc_mprsaddr; (char *)maddr < (char *)mes + ntohs(mes->olsr_msgsize);  maddr++)				{					/*v4->v6 del address.s_addr = *maddr;					fprintf(fd, "MPRS address %s\n", inet_ntoa(address));*/	    					//v4->v6 add					memcpy(&(address.s6_addr),maddr,sizeof(struct in6_addr));					fprintf(fd, "MPRS address %s\n",					inet_ntop(AF_INET6,&address,str,sizeof(str)));				} 				break;			case OLSRD_TRACEON:				fprintf(fd, "\tfile=%*s\n", size, m->olsr_tracefile);				break;			case OLSRD_TRACEOFF:				break;		}	}	fflush(fd);	if (ferror(fd))		traceoff();}/********************* added by Y.Ge *****************/void dumppacket_toscreen(struct sockaddr *sa, char *cp, int size, struct timeval *stamp){	//v4->v6 modify	char str[INET6_ADDRSTRLEN];	struct olsr *msg = (struct olsr *)cp;	struct olsrmsg *m = msg->olsr_msg, *mes;	struct hellomsg *h;	struct hellinfo *hinf;	struct olsr_ip_addr *haddr, *hadr;	struct in6_addr address;	struct tcmsg *tc;	struct olsr_ip_addr *maddr;	struct sockaddr_in6 *who = (struct sockaddr_in6 *)sa;	printf("\n********** Packet length:  %d **********\n",ntohs(msg->olsr_packlen));	/* the following "for" is revised by Y.Ge */	//for (mes = m; (char *)mes < (char *)msg + ntohs(msg->olsr_packlen); mes = (struct olsrmsg *)((char *)mes + ntohs(mes->olsr_nextmsg)))	for (mes = m; (char *)mes < (char *)msg + ntohs(msg->olsr_packlen); mes = (struct olsrmsg *)((char *)mes + ntohs(mes->olsr_msgsize)))	{			printf("\n             --------------------         ");		/*v4->v6 del		if (mes->olsr_msgtype && mes->olsr_msgtype < OLSRTYPE_MAX)			fprintf(fd, "\n %s %s %s %.19s:\n", olsrtypes[mes->olsr_msgtype], dir, inet_ntoa(who->sin_addr), ctime((time_t *)&stamp->tv_sec));		else 		{			fprintf(fd, "Bad packet type  0x%x %s %s %.19s\n", mes->olsr_msgtype, dir, inet_ntoa(who->sin_addr), ctime((time_t *)&stamp->tv_sec));			fprintf(fd, "size=%d cp=%p packet=%p\n", size, cp, packet);			fflush(fd);			return;		}*/			//v4->v6 add		printf ("%d, olsrytpemax: %d\n", mes->olsr_msgtype, OLSRTYPE_MAX);		if (mes->olsr_msgtype && mes->olsr_msgtype < OLSRTYPE_MAX)			printf("\n %s %s %.19s:\n", olsrtypes[mes->olsr_msgtype],inet_ntop(AF_INET6,&who->sin6_addr,str,sizeof(str)),ctime((time_t *)&stamp->tv_sec));		else 		{			printf("Bad packet type  0x%x %s %.19s\n", mes->olsr_msgtype, inet_ntop(AF_INET6,&who->sin6_addr,str,sizeof(str)),ctime((time_t *)&stamp->tv_sec));			printf("size=%d cp=%p packet=%p\n", size, cp, packet);			return;		}		printf("Message type:  %d \n", mes->olsr_msgtype);		//fprintf(fd, "Broadcast ?:   %s \n", mes->olsr_broad ? "YES" : "NO");  //commented by Y.Ge		//fprintf(fd, "Next message:  %d \n\n", ntohs(mes->olsr_nextmsg));  //commented bby Y.Ge		switch (mes->olsr_msgtype) 		{			case HELLO_PACKET:			case UPDATE_NEIGHBOR:				h = mes->olsr_hello;				/*fprintf(fd, "Packet seq number:  %d \n", ntohs(h->hell_seqnum));				printf(fd, "MPR Sequence number:  %d \n\n", ntohs(h->hell_mprseqnum));*/ //commented by Y.Ge				/* the following "for" is revised by Y.Ge */				//for (hinf = h->hell_info; (char *)hinf < (char *)mes + ntohs(mes->olsr_nextmsg); hinf = (struct hellinfo *)((char *)hinf + ntohs(hinf->next_linktype)))				for (hinf = h->hell_info; (char *)hinf < (char *)mes + ntohs(mes->olsr_msgsize); hinf = (struct hellinfo *)((char *)hinf + ntohs(hinf->link_msg_size)))				{					//fprintf(fd, "Link type:  %d \n", hinf->link_type);  //commented by Y.Ge					//fprintf(fd, "Next link type:  %d \n", ntohs(hinf->next_linktype));  //commented by Y.Ge								printf("Link type:  %d \n", hinf->link_code);  //commented by Y.Ge					printf("Next link type:  %d \n", ntohs(hinf->link_msg_size));  //commented by Y.Ge					haddr = hinf->neigh_addr; 					/* the following "for" is revised by Y.Ge */					//for (hadr = haddr; (char *)hadr < (char *)hinf + ntohs(hinf->next_linktype); hadr++)					for (hadr = haddr; (char *)hadr < (char *)hinf + ntohs(hinf->link_msg_size); hadr++)					{						/*v4->v6 del address.s_addr = *hadr;		  						printf("Neighbor addr %s\n", inet_ntoa(address));*/		  						//v4->v6 add						memcpy(&(address.s6_addr),hadr,sizeof(struct in6_addr));						printf("Neighbor addr %s\n", inet_ntop(AF_INET6,&address,str,sizeof(str)));					}				}				break;			case TC_PACKET:				tc = mes->olsr_tc;				printf("Packet seq number: %d \n", ntohs(mes->olsr_msgseq));								printf("MPRS Sequence number: %d \n", ntohs(tc->tc_mprseqnum));				printf("Hop Count:  %d \n", mes->olsr_hopcount);					/*v4->v6 del address.s_addr = tc->tc_origaddr;				printf("Originator address %s\n", inet_ntoa(address));*/	 				//v4->v6 add				memcpy(&(address.s6_addr),&(mes->olsr_source),sizeof(struct in6_addr));				printf("Originator address %s\n",inet_ntop(AF_INET6,&address,str,sizeof(struct olsr_ip_addr)));				/* the following "for" is revised by Y.Ge */				//for (maddr = tc->tc_mprsaddr; (char *)maddr < (char *)mes + ntohs(mes->olsr_nextmsg);  maddr++)				for (maddr = tc->tc_mprsaddr; (char *)maddr < (char *)mes + ntohs(mes->olsr_msgsize);  maddr++)				{					/*v4->v6 del address.s_addr = *maddr;					printf("MPRS address %s\n", inet_ntoa(address));*/	    					//v4->v6 add					memcpy(&(address.s6_addr),maddr,sizeof(struct in6_addr));					printf("MPRS address %s\n",					inet_ntop(AF_INET6,&address,str,sizeof(str)));				} 				break;			case OLSRD_TRACEON:				printf("\tfile=%*s\n", size, m->olsr_tracefile);				break;			case OLSRD_TRACEOFF:				break;		}	}}/***************** end of revision ****************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -