void print_ipv4( int fd, char *datagram) { struct ipv4_header *iph; iph = (struct ipv4_header *) datagram; print_proto(fd,"[IPv4/ version:%hhd ipheaderlen:%hhd tos:%#x totlen:%d " "id:%#x fragoffset:%#x ttl:%hhu proto:%hhd checksum:%#x " "source:%s dest:%s]",FLAG_VAL(iph->lenvers,IPV4_VERS,4), FLAG_VAL(iph->lenvers,IPV4_HDRLEN,0),iph->tos, ntohs(iph->totlen),ntohs(iph->id), ntohs(iph->fragoffset), iph->ttl,iph->proto,ntohs(iph->ipchecksum), ipv4_ntoa(ntohl(iph->sourceaddr),sourceip), ipv4_ntoa(ntohl(iph->destaddr), destip)); }
static void print_sk_buff(unsigned int hooknum, struct sk_buff *skb) { struct ethhdr *ethh = eth_hdr(skb); struct iphdr *iph = ip_hdr(skb); struct tcphdr *tcph = NULL; struct udphdr *udph = NULL; int i; unsigned short tcp_data_len = 0; unsigned char *tcp_data = NULL; unsigned short udp_data_len = 0; unsigned char *udp_data = NULL; #if 1 if (iph->protocol != IPPROTO_TCP) { return; } #endif switch (hooknum) { case NF_INET_PRE_ROUTING: printk("\nPre Routing <%d>\n", ++g_cnt); break; case NF_INET_LOCAL_IN: printk("\nLocal In <%d>\n", ++g_cnt); break; case NF_INET_FORWARD: printk("\nForward <%d>\n", ++g_cnt); break; case NF_INET_LOCAL_OUT: printk("\nLocal Out <%d>\n", ++g_cnt); break; case NF_INET_POST_ROUTING: printk("\nPost Routing <%d>\n", ++g_cnt); break; default: return; } //mac if (ethh) { printk("Src MAC: <%x:%x:%x:%x:%x:%x>\n", \ ethh->h_source[0], ethh->h_source[1], ethh->h_source[2], \ ethh->h_source[3], ethh->h_source[4], ethh->h_source[5]); printk("Dest MAC: <%x:%x:%x:%x:%x:%x>\n", \ ethh->h_dest[0], ethh->h_dest[1], ethh->h_dest[2], \ ethh->h_dest[3], ethh->h_dest[4], ethh->h_dest[5]); } else { printk("ethh = NULL\n"); } //ip if (iph) { printk("Src Ip: <%s>\n", ipv4_ntoa(iph->saddr)); printk("Dest Ip: <%s>\n", ipv4_ntoa(iph->daddr)); //TCP、UDP、ICMP、IGMP switch (iph->protocol) { case IPPROTO_ICMP: printk("ICMP:\n"); break; case IPPROTO_IGMP: printk("IGMP:\n"); break; case IPPROTO_TCP: printk("TCP:\n"); tcph = (struct tcphdr *)(skb->data + iph->ihl * 4); printk("Src port: <%u>\n", ntohs(tcph->source)); printk("Dest port: <%u>\n", ntohs(tcph->dest)); printk("Seq: <%u>\n", ntohl(tcph->seq)); printk("Ack seq: <%u>\n", ntohl(tcph->ack_seq)); printk("urg: <%d>, ack: <%d>\n", tcph->urg, tcph->ack); printk("psh: <%d>, rst: <%d>\n", tcph->psh, tcph->rst); printk("syn: <%d>, fin: <%d>\n", tcph->syn, tcph->fin); //printk("tot len = <%u>\n", ntohs(iph->tot_len)); //printk("ihl * 4 = <%u>\n", iph->ihl * 4); //printk("doff * 4 = <%u>\n", tcph->doff * 4); tcp_data_len = ntohs(iph->tot_len) - iph->ihl * 4 - tcph->doff * 4; printk("tcp data len = <%u>\n", tcp_data_len); if (tcp_data_len > 0) { tcp_data = skb->data + iph->ihl * 4 + tcph->doff * 4; printk("tcp data: "); for (i = 0; i < tcp_data_len; i++) { printk("%x ", tcp_data[i]); } printk("\n"); } break; case IPPROTO_UDP: printk("UDP:\n"); udph = (struct udphdr *)(skb->data + iph->ihl * 4); printk("Src port = <%u>\n", ntohs(udph->source)); printk("Dest port = <%u>\n", ntohs(udph->dest)); udp_data_len = ntohs(iph->tot_len) - iph->ihl * 4 - 8; printk("udp data len = <%u>\n", udp_data_len); if (udp_data_len > 0) { udp_data = skb->data + iph->ihl * 4 + 8; printk("udp data: "); for (i = 0; i < udp_data_len; i++) { printk("%x ", udp_data[i]); } printk("\n"); } break; default: printk("Others protocol <%u>\n", iph->protocol); } } else { printk("iph = NULL\n"); } }