| |
| #include "cc.h" |
| #include "uip.h" |
| |
| #include <string.h> |
| #include <stdio.h> |
| |
| struct ip_hdr { |
| /* IP header. */ |
| u8_t vhl, |
| tos, |
| len[2], |
| ipid[2], |
| ipoffset[2], |
| ttl, |
| proto; |
| u16_t ipchksum; |
| u8_t srcipaddr[4], |
| destipaddr[4]; |
| }; |
| |
| #define TCP_FIN 0x01 |
| #define TCP_SYN 0x02 |
| #define TCP_RST 0x04 |
| #define TCP_PSH 0x08 |
| #define TCP_ACK 0x10 |
| #define TCP_URG 0x20 |
| #define TCP_CTL 0x3f |
| |
| struct tcpip_hdr { |
| /* IP header. */ |
| u8_t vhl, |
| tos, |
| len[2], |
| ipid[2], |
| ipoffset[2], |
| ttl, |
| proto; |
| u16_t ipchksum; |
| u8_t srcipaddr[4], |
| destipaddr[4]; |
| /* TCP header. */ |
| u16_t srcport, |
| destport; |
| u8_t seqno[4], |
| ackno[4], |
| tcpoffset, |
| flags, |
| wnd[2]; |
| u16_t tcpchksum; |
| u8_t urgp[2]; |
| u8_t optdata[4]; |
| }; |
| |
| #define ICMP_ECHO_REPLY 0 |
| #define ICMP_ECHO 8 |
| |
| struct icmpip_hdr { |
| /* IP header. */ |
| u8_t vhl, |
| tos, |
| len[2], |
| ipid[2], |
| ipoffset[2], |
| ttl, |
| proto; |
| u16_t ipchksum; |
| u8_t srcipaddr[4], |
| destipaddr[4]; |
| /* The ICMP and IP headers. */ |
| /* ICMP (echo) header. */ |
| u8_t type, icode; |
| u16_t icmpchksum; |
| u16_t id, seqno; |
| }; |
| |
| |
| /* The UDP and IP headers. */ |
| struct udpip_hdr { |
| /* IP header. */ |
| u8_t vhl, |
| tos, |
| len[2], |
| ipid[2], |
| ipoffset[2], |
| ttl, |
| proto; |
| u16_t ipchksum; |
| u8_t srcipaddr[4], |
| destipaddr[4]; |
| |
| /* UDP header. */ |
| u16_t srcport, |
| destport; |
| u16_t udplen; |
| u16_t udpchksum; |
| }; |
| |
| #define ETHBUF ((struct eth_hdr *)&uip_buf[0]) |
| #define IPBUF ((struct ip_hdr *)&uip_buf[UIP_LLH_LEN]) |
| #define UDPBUF ((struct udpip_hdr *)&uip_buf[UIP_LLH_LEN]) |
| #define ICMPBUF ((struct icmpip_hdr *)&uip_buf[UIP_LLH_LEN]) |
| #define TCPBUF ((struct tcpip_hdr *)&uip_buf[UIP_LLH_LEN]) |
| |
| |
| /*---------------------------------------------------------------------------*/ |
| static void |
| tcpflags(unsigned char flags, char *flagsstr) |
| { |
| if(flags & TCP_FIN) { |
| *flagsstr++ = 'F'; |
| } |
| if(flags & TCP_SYN) { |
| *flagsstr++ = 'S'; |
| } |
| if(flags & TCP_RST) { |
| *flagsstr++ = 'R'; |
| } |
| if(flags & TCP_ACK) { |
| *flagsstr++ = 'A'; |
| } |
| if(flags & TCP_URG) { |
| *flagsstr++ = 'U'; |
| } |
| |
| *flagsstr = 0; |
| } |
| /*---------------------------------------------------------------------------*/ |
| static char * CC_FASTCALL |
| n(u16_t num, char *ptr) |
| { |
| u16_t d; |
| u8_t a, f; |
| |
| if(num == 0) { |
| *ptr = '0'; |
| return ptr + 1; |
| } else { |
| f = 0; |
| for(d = 10000; d >= 1; d /= 10) { |
| a = (num / d) % 10; |
| if(f == 1 || a > 0) { |
| *ptr = a + '0'; |
| ++ptr; |
| f = 1; |
| } |
| } |
| } |
| return ptr; |
| } |
| /*---------------------------------------------------------------------------*/ |
| static char * CC_FASTCALL |
| d(char *ptr) |
| { |
| *ptr = '.'; |
| return ptr + 1; |
| } |
| /*---------------------------------------------------------------------------*/ |
| static char * CC_FASTCALL |
| s(char *str, char *ptr) |
| { |
| strcpy(ptr, str); |
| return ptr + strlen(str); |
| } |
| /*---------------------------------------------------------------------------*/ |
| int |
| tcpdump_print(char *buf, u16_t buflen) |
| { |
| char flags[8]; |
| if(IPBUF->proto == UIP_PROTO_ICMP) { |
| if(ICMPBUF->type == ICMP_ECHO) { |
| return s(" ping", |
| n(IPBUF->destipaddr[3], d( |
| n(IPBUF->destipaddr[2], d( |
| n(IPBUF->destipaddr[1], d( |
| n(IPBUF->destipaddr[0], |
| s(" ", |
| n(IPBUF->srcipaddr[3], d( |
| n(IPBUF->srcipaddr[2], d( |
| n(IPBUF->srcipaddr[1], d( |
| n(IPBUF->srcipaddr[0], |
| buf)))))))))))))))) - buf; |
| |
| /* return sprintf(buf, "%d.%d.%d.%d %d.%d.%d.%d ping", |
| IPBUF->srcipaddr[0], IPBUF->srcipaddr[1], |
| IPBUF->srcipaddr[2], IPBUF->srcipaddr[3], |
| IPBUF->destipaddr[0], IPBUF->destipaddr[1], |
| IPBUF->destipaddr[2], IPBUF->destipaddr[3]);*/ |
| } else if(ICMPBUF->type == ICMP_ECHO_REPLY) { |
| return s(" pong", |
| n(IPBUF->destipaddr[3], d( |
| n(IPBUF->destipaddr[2], d( |
| n(IPBUF->destipaddr[1], d( |
| n(IPBUF->destipaddr[0], |
| s(" ", |
| n(IPBUF->srcipaddr[3], d( |
| n(IPBUF->srcipaddr[2], d( |
| n(IPBUF->srcipaddr[1], d( |
| n(IPBUF->srcipaddr[0], |
| buf)))))))))))))))) - buf; |
| /* return sprintf(buf, "%d.%d.%d.%d %d.%d.%d.%d pong", |
| IPBUF->srcipaddr[0], IPBUF->srcipaddr[1], |
| IPBUF->srcipaddr[2], IPBUF->srcipaddr[3], |
| IPBUF->destipaddr[0], IPBUF->destipaddr[1], |
| IPBUF->destipaddr[2], IPBUF->destipaddr[3]);*/ |
| } |
| } else if(IPBUF->proto == UIP_PROTO_UDP) { |
| return s(" UDP", |
| n(htons(UDPBUF->destport), d( |
| n(IPBUF->destipaddr[3], d( |
| n(IPBUF->destipaddr[2], d( |
| n(IPBUF->destipaddr[1], d( |
| n(IPBUF->destipaddr[0], |
| s(" ", |
| n(htons(UDPBUF->srcport), d( |
| n(IPBUF->srcipaddr[3], d( |
| n(IPBUF->srcipaddr[2], d( |
| n(IPBUF->srcipaddr[1], d( |
| n(IPBUF->srcipaddr[0], |
| buf)))))))))))))))))))) - buf; |
| /* return sprintf(buf, "%d.%d.%d.%d.%d %d.%d.%d.%d.%d UDP", |
| IPBUF->srcipaddr[0], IPBUF->srcipaddr[1], |
| IPBUF->srcipaddr[2], IPBUF->srcipaddr[3], |
| htons(UDPBUF->srcport), |
| IPBUF->destipaddr[0], IPBUF->destipaddr[1], |
| IPBUF->destipaddr[2], IPBUF->destipaddr[3], |
| htons(UDPBUF->destport));*/ |
| } else if(IPBUF->proto == UIP_PROTO_TCP) { |
| tcpflags(TCPBUF->flags, flags); |
| return s(flags, |
| s(" ", |
| n(htons(TCPBUF->destport), d( |
| n(IPBUF->destipaddr[3], d( |
| n(IPBUF->destipaddr[2], d( |
| n(IPBUF->destipaddr[1], d( |
| n(IPBUF->destipaddr[0], |
| s(" ", |
| n(htons(TCPBUF->srcport), d( |
| n(IPBUF->srcipaddr[3], d( |
| n(IPBUF->srcipaddr[2], d( |
| n(IPBUF->srcipaddr[1], d( |
| n(IPBUF->srcipaddr[0], |
| buf))))))))))))))))))))) - buf; |
| /* return sprintf(buf, "%d.%d.%d.%d.%d %d.%d.%d.%d.%d %s", |
| IPBUF->srcipaddr[0], IPBUF->srcipaddr[1], |
| IPBUF->srcipaddr[2], IPBUF->srcipaddr[3], |
| htons(TCPBUF->srcport), |
| IPBUF->destipaddr[0], IPBUF->destipaddr[1], |
| IPBUF->destipaddr[2], IPBUF->destipaddr[3], |
| htons(TCPBUF->destport), |
| flags); */ |
| } |
| } |
| /*---------------------------------------------------------------------------*/ |