dump.c revision f913fe49272286a7f1e58d94a208b6dc06a51fd2
1a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown/*
2a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown * Copyright 2011 Daniel Drown
3a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown *
4a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown * Licensed under the Apache License, Version 2.0 (the "License");
5a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown * you may not use this file except in compliance with the License.
6a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown * You may obtain a copy of the License at
7a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown *
8a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown * http://www.apache.org/licenses/LICENSE-2.0
9a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown *
10a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown * Unless required by applicable law or agreed to in writing, software
11a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown * distributed under the License is distributed on an "AS IS" BASIS,
12a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown * See the License for the specific language governing permissions and
14a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown * limitations under the License.
15a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown *
16a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown * dump.c - print various headers for debugging
17a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown */
18a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include <stdio.h>
19a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include <stdint.h>
20a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
21a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include <arpa/inet.h>
22a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include <netinet/in.h>
23a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include <netinet/ip.h>
24a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include <netinet/ip_icmp.h>
25a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include <netinet/udp.h>
26a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include <netinet/tcp.h>
27a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include <netinet/ip6.h>
28a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include <netinet/icmp6.h>
29a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include <linux/icmp.h>
30a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
31f68200ab1a5c559866a87e51d0d52e3c74b02343Lorenzo Colitti#include "debug.h"
32a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include "checksum.h"
33a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include "clatd.h"
34a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include "logging.h"
35a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
36f68200ab1a5c559866a87e51d0d52e3c74b02343Lorenzo Colitti#if CLAT_DEBUG
37f68200ab1a5c559866a87e51d0d52e3c74b02343Lorenzo Colitti
38a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown/* print ip header */
39a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drownvoid dump_ip(struct iphdr *header) {
40a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  u_int16_t frag_flags;
41a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  char addrstr[INET6_ADDRSTRLEN];
42a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
43a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  frag_flags = ntohs(header->frag_off);
44a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
45a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("IP packet\n");
46a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("header_len = %x\n",header->ihl);
47a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("version = %x\n",header->version);
48a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("tos = %x\n",header->tos);
49a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("tot_len = %x\n",ntohs(header->tot_len));
50a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("id = %x\n",ntohs(header->id));
51a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("frag: ");
52a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  if(frag_flags & IP_RF) {
53a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("(RF) ");
54a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  }
55a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  if(frag_flags & IP_DF) {
56a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("DF ");
57a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  }
58a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  if(frag_flags & IP_MF) {
59a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("MF ");
60a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  }
61a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("offset = %x\n",frag_flags & IP_OFFMASK);
62a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("ttl = %x\n",header->ttl);
63a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("protocol = %x\n",header->protocol);
64a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("checksum = %x\n",ntohs(header->check));
65a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  inet_ntop(AF_INET, &header->saddr, addrstr, sizeof(addrstr));
66a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("saddr = %s\n",addrstr);
67a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  inet_ntop(AF_INET, &header->daddr, addrstr, sizeof(addrstr));
68a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("daddr = %s\n",addrstr);
69a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown}
70a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
71a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown/* print ip6 header */
72a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drownvoid dump_ip6(struct ip6_hdr *header) {
73a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  char addrstr[INET6_ADDRSTRLEN];
74a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
75a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("ipv6\n");
76a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("version = %x\n",header->ip6_vfc >> 4);
77a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("traffic class = %x\n",header->ip6_flow >> 20);
78a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("flow label = %x\n",ntohl(header->ip6_flow & 0x000fffff));
79a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("payload len = %x\n",ntohs(header->ip6_plen));
80a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("next header = %x\n",header->ip6_nxt);
81a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("hop limit = %x\n",header->ip6_hlim);
82a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
83a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  inet_ntop(AF_INET6, &header->ip6_src, addrstr, sizeof(addrstr));
84a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("source = %s\n",addrstr);
85a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
86a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  inet_ntop(AF_INET6, &header->ip6_dst, addrstr, sizeof(addrstr));
87a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("dest = %s\n",addrstr);
88a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown}
89a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
90a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown/* print icmp header */
91a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drownvoid dump_icmp(struct icmphdr *icmp) {
92a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("ICMP\n");
93a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
94a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("icmp.type = %x ",icmp->type);
95a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  if(icmp->type == ICMP_ECHOREPLY) {
96a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("echo reply");
97a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  } else if(icmp->type == ICMP_ECHO) {
98a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("echo request");
99a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  } else {
100a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("other");
101a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  }
102a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("\n");
103a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("icmp.code = %x\n",icmp->code);
104a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("icmp.checksum = %x\n",ntohs(icmp->checksum));
105a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  if(icmp->type == ICMP_ECHOREPLY || icmp->type == ICMP_ECHO) {
106a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("icmp.un.echo.id = %x\n",ntohs(icmp->un.echo.id));
107a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("icmp.un.echo.sequence = %x\n",ntohs(icmp->un.echo.sequence));
108a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  }
109a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown}
110a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
111a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown/* print icmp6 header */
112a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drownvoid dump_icmp6(struct icmp6_hdr *icmp6) {
113a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("ICMP6\n");
114a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("type = %x",icmp6->icmp6_type);
115a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  if(icmp6->icmp6_type == ICMP6_ECHO_REQUEST) {
116a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("(echo request)");
117a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  } else if(icmp6->icmp6_type == ICMP6_ECHO_REPLY) {
118a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("(echo reply)");
119a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  }
120a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("\n");
121a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("code = %x\n",icmp6->icmp6_code);
122a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
123a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("checksum = %x\n",icmp6->icmp6_cksum);
124a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
125a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  if((icmp6->icmp6_type == ICMP6_ECHO_REQUEST) || (icmp6->icmp6_type == ICMP6_ECHO_REPLY)) {
126a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("icmp6_id = %x\n",icmp6->icmp6_id);
127a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("icmp6_seq = %x\n",icmp6->icmp6_seq);
128a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  }
129a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown}
130a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
131a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown/* print udp header */
132a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drownvoid dump_udp_generic(const struct udphdr *udp, uint32_t temp_checksum, const char *payload, size_t payload_size) {
133a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  uint16_t my_checksum;
134a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
135a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  temp_checksum = ip_checksum_add(temp_checksum, udp, sizeof(struct udphdr));
136a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  temp_checksum = ip_checksum_add(temp_checksum, payload, payload_size);
137a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  my_checksum = ip_checksum_finish(temp_checksum);
138a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
139a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("UDP\n");
140a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("source = %x\n",ntohs(udp->source));
141a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("dest = %x\n",ntohs(udp->dest));
142a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("len = %x\n",ntohs(udp->len));
143a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("check = %x (mine %x)\n",udp->check,my_checksum);
144a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown}
145a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
146a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown/* print ipv4/udp header */
147a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drownvoid dump_udp(const struct udphdr *udp, const struct iphdr *ip, const char *payload, size_t payload_size) {
148a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  uint32_t temp_checksum;
1490278627f576832860af2d84e04e383ecaa92d74fLorenzo Colitti  temp_checksum = ipv4_pseudo_header_checksum(0, ip, sizeof(*udp) + payload_size);
150a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  dump_udp_generic(udp, temp_checksum, payload, payload_size);
151a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown}
152a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
153a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown/* print ipv6/udp header */
154a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drownvoid dump_udp6(const struct udphdr *udp, const struct ip6_hdr *ip6, const char *payload, size_t payload_size) {
155a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  uint32_t temp_checksum;
1560278627f576832860af2d84e04e383ecaa92d74fLorenzo Colitti  temp_checksum = ipv6_pseudo_header_checksum(0, ip6, sizeof(*udp) + payload_size);
157a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  dump_udp_generic(udp, temp_checksum, payload, payload_size);
158a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown}
159a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
160a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown/* print tcp header */
161a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drownvoid dump_tcp_generic(const struct tcphdr *tcp, const char *options, size_t options_size, uint32_t temp_checksum, const char *payload, size_t payload_size) {
162a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  uint16_t my_checksum;
163a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
164a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  temp_checksum = ip_checksum_add(temp_checksum, tcp, sizeof(struct tcphdr));
165a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  if(options) {
166a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    temp_checksum = ip_checksum_add(temp_checksum, options, options_size);
167a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  }
168a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  temp_checksum = ip_checksum_add(temp_checksum, payload, payload_size);
169a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  my_checksum = ip_checksum_finish(temp_checksum);
170a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
171a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("TCP\n");
172a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("source = %x\n",ntohs(tcp->source));
173a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("dest = %x\n",ntohs(tcp->dest));
174a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("seq = %x\n",ntohl(tcp->seq));
175a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("ack = %x\n",ntohl(tcp->ack_seq));
176a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("d_off = %x\n",tcp->doff);
177a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("res1 = %x\n",tcp->res1);
178a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#ifdef __BIONIC__
179a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("CWR = %x\n",tcp->cwr);
180a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("ECE = %x\n",tcp->ece);
181a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#else
182a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("CWR/ECE = %x\n",tcp->res2);
183a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#endif
184a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("urg = %x  ack = %x  psh = %x  rst = %x  syn = %x  fin = %x\n",
185a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown      tcp->urg, tcp->ack, tcp->psh, tcp->rst, tcp->syn, tcp->fin);
186a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("window = %x\n",ntohs(tcp->window));
187a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("check = %x [mine %x]\n",tcp->check,my_checksum);
188a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("urgent = %x\n",tcp->urg_ptr);
189a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
190a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  if(options) {
191a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    size_t i;
192a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
193a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("options: ");
194a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    for(i=0; i<options_size; i++) {
195a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown      printf("%x ",*(options+i));
196a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    }
197a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("\n");
198a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  }
199a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown}
200a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
201a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown/* print ipv4/tcp header */
202a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drownvoid dump_tcp(const struct tcphdr *tcp, const struct iphdr *ip, const char *payload, size_t payload_size, const char *options, size_t options_size) {
203a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  uint32_t temp_checksum;
204a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
2050278627f576832860af2d84e04e383ecaa92d74fLorenzo Colitti  temp_checksum = ipv4_pseudo_header_checksum(0, ip, sizeof(*tcp) + options_size + payload_size);
206a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  dump_tcp_generic(tcp, options, options_size, temp_checksum, payload, payload_size);
207a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown}
208a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
209a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown/* print ipv6/tcp header */
210a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drownvoid dump_tcp6(const struct tcphdr *tcp, const struct ip6_hdr *ip6, const char *payload, size_t payload_size, const char *options, size_t options_size) {
211a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  uint32_t temp_checksum;
212a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
2130278627f576832860af2d84e04e383ecaa92d74fLorenzo Colitti  temp_checksum = ipv6_pseudo_header_checksum(0, ip6, sizeof(*tcp) + options_size + payload_size);
214a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  dump_tcp_generic(tcp, options, options_size, temp_checksum, payload, payload_size);
215a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown}
216a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
217a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown/* generic hex dump */
218a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drownvoid logcat_hexdump(const char *info, const char *data, size_t len) {
219f913fe49272286a7f1e58d94a208b6dc06a51fd2Lorenzo Colitti  char output[PACKETLEN*3+2];
220a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  size_t i;
221a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
222a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  for(i = 0; i < len && i < PACKETLEN; i++) {
223f913fe49272286a7f1e58d94a208b6dc06a51fd2Lorenzo Colitti    snprintf(output + i*3, 4, " %02x", (uint8_t)data[i]);
224a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  }
225f913fe49272286a7f1e58d94a208b6dc06a51fd2Lorenzo Colitti  output[len*3+3] = '\0';
226a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
227f913fe49272286a7f1e58d94a208b6dc06a51fd2Lorenzo Colitti  logmsg(ANDROID_LOG_WARN,"info %s len %d data%s", info, len, output);
228a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown}
229f68200ab1a5c559866a87e51d0d52e3c74b02343Lorenzo Colitti
230f913fe49272286a7f1e58d94a208b6dc06a51fd2Lorenzo Colittivoid dump_iovec(const struct iovec *iov, int iov_len) {
231f913fe49272286a7f1e58d94a208b6dc06a51fd2Lorenzo Colitti  int i;
232f913fe49272286a7f1e58d94a208b6dc06a51fd2Lorenzo Colitti  char *str;
233f913fe49272286a7f1e58d94a208b6dc06a51fd2Lorenzo Colitti  for (i = 0; i < iov_len; i++) {
234f913fe49272286a7f1e58d94a208b6dc06a51fd2Lorenzo Colitti    asprintf(&str, "iov[%d]: ", i);
235f913fe49272286a7f1e58d94a208b6dc06a51fd2Lorenzo Colitti    logcat_hexdump(str, iov[i].iov_base, iov[i].iov_len);
236f913fe49272286a7f1e58d94a208b6dc06a51fd2Lorenzo Colitti    free(str);
237f913fe49272286a7f1e58d94a208b6dc06a51fd2Lorenzo Colitti  }
238f913fe49272286a7f1e58d94a208b6dc06a51fd2Lorenzo Colitti}
239f68200ab1a5c559866a87e51d0d52e3c74b02343Lorenzo Colitti#endif  // CLAT_DEBUG
240