📄 trace.c
字号:
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 + -