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>
20d90841824dc00f65a48a789396c7f428807432caLorenzo Colitti#include <stdlib.h>
21a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
22a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include <arpa/inet.h>
23a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include <netinet/in.h>
24a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include <netinet/ip.h>
25a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include <netinet/ip_icmp.h>
26a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include <netinet/udp.h>
27a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include <netinet/tcp.h>
28a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include <netinet/ip6.h>
29a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include <netinet/icmp6.h>
30a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include <linux/icmp.h>
31a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
32f68200ab1a5c559866a87e51d0d52e3c74b02343Lorenzo Colitti#include "debug.h"
33a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include "checksum.h"
34a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include "clatd.h"
35a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#include "logging.h"
36a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
37f68200ab1a5c559866a87e51d0d52e3c74b02343Lorenzo Colitti#if CLAT_DEBUG
38f68200ab1a5c559866a87e51d0d52e3c74b02343Lorenzo Colitti
39a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown/* print ip header */
40a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drownvoid dump_ip(struct iphdr *header) {
41a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  u_int16_t frag_flags;
42a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  char addrstr[INET6_ADDRSTRLEN];
43a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
44a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  frag_flags = ntohs(header->frag_off);
45a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
46a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("IP packet\n");
47a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("header_len = %x\n",header->ihl);
48a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("version = %x\n",header->version);
49a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("tos = %x\n",header->tos);
50a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("tot_len = %x\n",ntohs(header->tot_len));
51a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("id = %x\n",ntohs(header->id));
52a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("frag: ");
53a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  if(frag_flags & IP_RF) {
54a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("(RF) ");
55a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  }
56a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  if(frag_flags & IP_DF) {
57a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("DF ");
58a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  }
59a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  if(frag_flags & IP_MF) {
60a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("MF ");
61a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  }
62a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("offset = %x\n",frag_flags & IP_OFFMASK);
63a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("ttl = %x\n",header->ttl);
64a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("protocol = %x\n",header->protocol);
65a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("checksum = %x\n",ntohs(header->check));
66a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  inet_ntop(AF_INET, &header->saddr, addrstr, sizeof(addrstr));
67a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("saddr = %s\n",addrstr);
68a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  inet_ntop(AF_INET, &header->daddr, addrstr, sizeof(addrstr));
69a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("daddr = %s\n",addrstr);
70a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown}
71a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
72a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown/* print ip6 header */
73a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drownvoid dump_ip6(struct ip6_hdr *header) {
74a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  char addrstr[INET6_ADDRSTRLEN];
75a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
76a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("ipv6\n");
77a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("version = %x\n",header->ip6_vfc >> 4);
78a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("traffic class = %x\n",header->ip6_flow >> 20);
79a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("flow label = %x\n",ntohl(header->ip6_flow & 0x000fffff));
80a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("payload len = %x\n",ntohs(header->ip6_plen));
81a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("next header = %x\n",header->ip6_nxt);
82a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("hop limit = %x\n",header->ip6_hlim);
83a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
84a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  inet_ntop(AF_INET6, &header->ip6_src, addrstr, sizeof(addrstr));
85a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("source = %s\n",addrstr);
86a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
87a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  inet_ntop(AF_INET6, &header->ip6_dst, addrstr, sizeof(addrstr));
88a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("dest = %s\n",addrstr);
89a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown}
90a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
91a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown/* print icmp header */
92a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drownvoid dump_icmp(struct icmphdr *icmp) {
93a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("ICMP\n");
94a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
95a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("icmp.type = %x ",icmp->type);
96a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  if(icmp->type == ICMP_ECHOREPLY) {
97a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("echo reply");
98a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  } else if(icmp->type == ICMP_ECHO) {
99a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("echo request");
100a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  } else {
101a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("other");
102a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  }
103a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("\n");
104a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("icmp.code = %x\n",icmp->code);
105a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("icmp.checksum = %x\n",ntohs(icmp->checksum));
106a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  if(icmp->type == ICMP_ECHOREPLY || icmp->type == ICMP_ECHO) {
107a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("icmp.un.echo.id = %x\n",ntohs(icmp->un.echo.id));
108a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("icmp.un.echo.sequence = %x\n",ntohs(icmp->un.echo.sequence));
109a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  }
110a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown}
111a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
112a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown/* print icmp6 header */
113a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drownvoid dump_icmp6(struct icmp6_hdr *icmp6) {
114a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("ICMP6\n");
115a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("type = %x",icmp6->icmp6_type);
116a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  if(icmp6->icmp6_type == ICMP6_ECHO_REQUEST) {
117a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("(echo request)");
118a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  } else if(icmp6->icmp6_type == ICMP6_ECHO_REPLY) {
119a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("(echo reply)");
120a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  }
121a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("\n");
122a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("code = %x\n",icmp6->icmp6_code);
123a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
124a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("checksum = %x\n",icmp6->icmp6_cksum);
125a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
126a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  if((icmp6->icmp6_type == ICMP6_ECHO_REQUEST) || (icmp6->icmp6_type == ICMP6_ECHO_REPLY)) {
127a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("icmp6_id = %x\n",icmp6->icmp6_id);
128a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("icmp6_seq = %x\n",icmp6->icmp6_seq);
129a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  }
130a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown}
131a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
132a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown/* print udp header */
133fcac410fa15613873a07143ccd46470b869346a3Brian Carlstromvoid dump_udp_generic(const struct udphdr *udp, uint32_t temp_checksum,
134fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom                      const uint8_t *payload, size_t payload_size) {
135a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  uint16_t my_checksum;
136a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
137a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  temp_checksum = ip_checksum_add(temp_checksum, udp, sizeof(struct udphdr));
138a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  temp_checksum = ip_checksum_add(temp_checksum, payload, payload_size);
139a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  my_checksum = ip_checksum_finish(temp_checksum);
140a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
141a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("UDP\n");
142a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("source = %x\n",ntohs(udp->source));
143a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("dest = %x\n",ntohs(udp->dest));
144a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("len = %x\n",ntohs(udp->len));
145a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("check = %x (mine %x)\n",udp->check,my_checksum);
146a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown}
147a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
148a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown/* print ipv4/udp header */
149fcac410fa15613873a07143ccd46470b869346a3Brian Carlstromvoid dump_udp(const struct udphdr *udp, const struct iphdr *ip,
150fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom              const uint8_t *payload, size_t payload_size) {
151a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  uint32_t temp_checksum;
15207f0265830fcae2632159e9993b93a161d7ea23bLorenzo Colitti  temp_checksum = ipv4_pseudo_header_checksum(ip, sizeof(*udp) + payload_size);
153a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  dump_udp_generic(udp, temp_checksum, payload, payload_size);
154a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown}
155a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
156a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown/* print ipv6/udp header */
157fcac410fa15613873a07143ccd46470b869346a3Brian Carlstromvoid dump_udp6(const struct udphdr *udp, const struct ip6_hdr *ip6,
158fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom               const uint8_t *payload, size_t payload_size) {
159a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  uint32_t temp_checksum;
16007f0265830fcae2632159e9993b93a161d7ea23bLorenzo Colitti  temp_checksum = ipv6_pseudo_header_checksum(ip6, sizeof(*udp) + payload_size, IPPROTO_UDP);
161a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  dump_udp_generic(udp, temp_checksum, payload, payload_size);
162a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown}
163a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
164a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown/* print tcp header */
165d44fac888a441cf21111358f43384f3942399d5dLorenzo Colittivoid dump_tcp_generic(const struct tcphdr *tcp, const uint8_t *options, size_t options_size, uint32_t temp_checksum, const uint8_t *payload, size_t payload_size) {
166a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  uint16_t my_checksum;
167a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
168a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  temp_checksum = ip_checksum_add(temp_checksum, tcp, sizeof(struct tcphdr));
169a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  if(options) {
170a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    temp_checksum = ip_checksum_add(temp_checksum, options, options_size);
171a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  }
172a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  temp_checksum = ip_checksum_add(temp_checksum, payload, payload_size);
173a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  my_checksum = ip_checksum_finish(temp_checksum);
174a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
175a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("TCP\n");
176a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("source = %x\n",ntohs(tcp->source));
177a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("dest = %x\n",ntohs(tcp->dest));
178a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("seq = %x\n",ntohl(tcp->seq));
179a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("ack = %x\n",ntohl(tcp->ack_seq));
180a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("d_off = %x\n",tcp->doff);
181a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("res1 = %x\n",tcp->res1);
182a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#ifdef __BIONIC__
183a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("CWR = %x\n",tcp->cwr);
184a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("ECE = %x\n",tcp->ece);
185a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#else
186a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("CWR/ECE = %x\n",tcp->res2);
187a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown#endif
188a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("urg = %x  ack = %x  psh = %x  rst = %x  syn = %x  fin = %x\n",
189a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown      tcp->urg, tcp->ack, tcp->psh, tcp->rst, tcp->syn, tcp->fin);
190a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("window = %x\n",ntohs(tcp->window));
191a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("check = %x [mine %x]\n",tcp->check,my_checksum);
192a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  printf("urgent = %x\n",tcp->urg_ptr);
193a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
194a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  if(options) {
195a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    size_t i;
196a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
197a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("options: ");
198a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    for(i=0; i<options_size; i++) {
199a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown      printf("%x ",*(options+i));
200a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    }
201a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown    printf("\n");
202a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  }
203a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown}
204a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
205a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown/* print ipv4/tcp header */
206fcac410fa15613873a07143ccd46470b869346a3Brian Carlstromvoid dump_tcp(const struct tcphdr *tcp, const struct iphdr *ip,
207fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom              const uint8_t *payload, size_t payload_size,
208d44fac888a441cf21111358f43384f3942399d5dLorenzo Colitti              const uint8_t *options, size_t options_size) {
209a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  uint32_t temp_checksum;
210a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
21107f0265830fcae2632159e9993b93a161d7ea23bLorenzo Colitti  temp_checksum = ipv4_pseudo_header_checksum(ip, sizeof(*tcp) + options_size + payload_size);
212a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  dump_tcp_generic(tcp, options, options_size, temp_checksum, payload, payload_size);
213a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown}
214a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
215a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown/* print ipv6/tcp header */
216fcac410fa15613873a07143ccd46470b869346a3Brian Carlstromvoid dump_tcp6(const struct tcphdr *tcp, const struct ip6_hdr *ip6,
217fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom               const uint8_t *payload, size_t payload_size,
218d44fac888a441cf21111358f43384f3942399d5dLorenzo Colitti               const uint8_t *options, size_t options_size) {
219a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  uint32_t temp_checksum;
220a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
22107f0265830fcae2632159e9993b93a161d7ea23bLorenzo Colitti  temp_checksum = ipv6_pseudo_header_checksum(ip6, sizeof(*tcp) + options_size + payload_size, IPPROTO_TCP);
222a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  dump_tcp_generic(tcp, options, options_size, temp_checksum, payload, payload_size);
223a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown}
224a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
225a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown/* generic hex dump */
226fcac410fa15613873a07143ccd46470b869346a3Brian Carlstromvoid logcat_hexdump(const char *info, const uint8_t *data, size_t len) {
227f913fe49272286a7f1e58d94a208b6dc06a51fd2Lorenzo Colitti  char output[PACKETLEN*3+2];
228a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  size_t i;
229a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
23057d480d2b425ef20d8b6f84abd4e9e3209fa9422Lorenzo Colitti  output[0] = '\0';
231a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  for(i = 0; i < len && i < PACKETLEN; i++) {
232fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom    snprintf(output + i*3, 4, " %02x", data[i]);
233a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown  }
234f913fe49272286a7f1e58d94a208b6dc06a51fd2Lorenzo Colitti  output[len*3+3] = '\0';
235a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown
236f913fe49272286a7f1e58d94a208b6dc06a51fd2Lorenzo Colitti  logmsg(ANDROID_LOG_WARN,"info %s len %d data%s", info, len, output);
237a45056e35c1af2a0f0a6eed258fd5fdf4846a79fDaniel Drown}
238f68200ab1a5c559866a87e51d0d52e3c74b02343Lorenzo Colitti
239f913fe49272286a7f1e58d94a208b6dc06a51fd2Lorenzo Colittivoid dump_iovec(const struct iovec *iov, int iov_len) {
240f913fe49272286a7f1e58d94a208b6dc06a51fd2Lorenzo Colitti  int i;
241f913fe49272286a7f1e58d94a208b6dc06a51fd2Lorenzo Colitti  char *str;
242f913fe49272286a7f1e58d94a208b6dc06a51fd2Lorenzo Colitti  for (i = 0; i < iov_len; i++) {
243f913fe49272286a7f1e58d94a208b6dc06a51fd2Lorenzo Colitti    asprintf(&str, "iov[%d]: ", i);
244f913fe49272286a7f1e58d94a208b6dc06a51fd2Lorenzo Colitti    logcat_hexdump(str, iov[i].iov_base, iov[i].iov_len);
245f913fe49272286a7f1e58d94a208b6dc06a51fd2Lorenzo Colitti    free(str);
246f913fe49272286a7f1e58d94a208b6dc06a51fd2Lorenzo Colitti  }
247f913fe49272286a7f1e58d94a208b6dc06a51fd2Lorenzo Colitti}
248f68200ab1a5c559866a87e51d0d52e3c74b02343Lorenzo Colitti#endif  // CLAT_DEBUG
249