/*
 * Copyright 2011 Daniel Drown
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * dump.c - print various headers for debugging
 */
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

#include <arpa/inet.h>
#include <linux/icmp.h>
#include <netinet/icmp6.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/ip6.h>
#include <netinet/ip_icmp.h>
#include <netinet/tcp.h>
#include <netinet/udp.h>

#include "checksum.h"
#include "clatd.h"
#include "debug.h"
#include "logging.h"

#if CLAT_DEBUG

/* print ip header */
void dump_ip(struct iphdr *header) {
  u_int16_t frag_flags;
  char addrstr[INET6_ADDRSTRLEN];

  frag_flags = ntohs(header->frag_off);

  printf("IP packet\n");
  printf("header_len = %x\n", header->ihl);
  printf("version = %x\n", header->version);
  printf("tos = %x\n", header->tos);
  printf("tot_len = %x\n", ntohs(header->tot_len));
  printf("id = %x\n", ntohs(header->id));
  printf("frag: ");
  if (frag_flags & IP_RF) {
    printf("(RF) ");
  }
  if (frag_flags & IP_DF) {
    printf("DF ");
  }
  if (frag_flags & IP_MF) {
    printf("MF ");
  }
  printf("offset = %x\n", frag_flags & IP_OFFMASK);
  printf("ttl = %x\n", header->ttl);
  printf("protocol = %x\n", header->protocol);
  printf("checksum = %x\n", ntohs(header->check));
  inet_ntop(AF_INET, &header->saddr, addrstr, sizeof(addrstr));
  printf("saddr = %s\n", addrstr);
  inet_ntop(AF_INET, &header->daddr, addrstr, sizeof(addrstr));
  printf("daddr = %s\n", addrstr);
}

/* print ip6 header */
void dump_ip6(struct ip6_hdr *header) {
  char addrstr[INET6_ADDRSTRLEN];

  printf("ipv6\n");
  printf("version = %x\n", header->ip6_vfc >> 4);
  printf("traffic class = %x\n", header->ip6_flow >> 20);
  printf("flow label = %x\n", ntohl(header->ip6_flow & 0x000fffff));
  printf("payload len = %x\n", ntohs(header->ip6_plen));
  printf("next header = %x\n", header->ip6_nxt);
  printf("hop limit = %x\n", header->ip6_hlim);

  inet_ntop(AF_INET6, &header->ip6_src, addrstr, sizeof(addrstr));
  printf("source = %s\n", addrstr);

  inet_ntop(AF_INET6, &header->ip6_dst, addrstr, sizeof(addrstr));
  printf("dest = %s\n", addrstr);
}

/* print icmp header */
void dump_icmp(struct icmphdr *icmp) {
  printf("ICMP\n");

  printf("icmp.type = %x ", icmp->type);
  if (icmp->type == ICMP_ECHOREPLY) {
    printf("echo reply");
  } else if (icmp->type == ICMP_ECHO) {
    printf("echo request");
  } else {
    printf("other");
  }
  printf("\n");
  printf("icmp.code = %x\n", icmp->code);
  printf("icmp.checksum = %x\n", ntohs(icmp->checksum));
  if (icmp->type == ICMP_ECHOREPLY || icmp->type == ICMP_ECHO) {
    printf("icmp.un.echo.id = %x\n", ntohs(icmp->un.echo.id));
    printf("icmp.un.echo.sequence = %x\n", ntohs(icmp->un.echo.sequence));
  }
}

/* print icmp6 header */
void dump_icmp6(struct icmp6_hdr *icmp6) {
  printf("ICMP6\n");
  printf("type = %x", icmp6->icmp6_type);
  if (icmp6->icmp6_type == ICMP6_ECHO_REQUEST) {
    printf("(echo request)");
  } else if (icmp6->icmp6_type == ICMP6_ECHO_REPLY) {
    printf("(echo reply)");
  }
  printf("\n");
  printf("code = %x\n", icmp6->icmp6_code);

  printf("checksum = %x\n", icmp6->icmp6_cksum);

  if ((icmp6->icmp6_type == ICMP6_ECHO_REQUEST) || (icmp6->icmp6_type == ICMP6_ECHO_REPLY)) {
    printf("icmp6_id = %x\n", icmp6->icmp6_id);
    printf("icmp6_seq = %x\n", icmp6->icmp6_seq);
  }
}

/* print udp header */
void dump_udp_generic(const struct udphdr *udp, uint32_t temp_checksum, const uint8_t *payload,
                      size_t payload_size) {
  uint16_t my_checksum;

  temp_checksum = ip_checksum_add(temp_checksum, udp, sizeof(struct udphdr));
  temp_checksum = ip_checksum_add(temp_checksum, payload, payload_size);
  my_checksum   = ip_checksum_finish(temp_checksum);

  printf("UDP\n");
  printf("source = %x\n", ntohs(udp->source));
  printf("dest = %x\n", ntohs(udp->dest));
  printf("len = %x\n", ntohs(udp->len));
  printf("check = %x (mine %x)\n", udp->check, my_checksum);
}

/* print ipv4/udp header */
void dump_udp(const struct udphdr *udp, const struct iphdr *ip, const uint8_t *payload,
              size_t payload_size) {
  uint32_t temp_checksum;
  temp_checksum = ipv4_pseudo_header_checksum(ip, sizeof(*udp) + payload_size);
  dump_udp_generic(udp, temp_checksum, payload, payload_size);
}

/* print ipv6/udp header */
void dump_udp6(const struct udphdr *udp, const struct ip6_hdr *ip6, const uint8_t *payload,
               size_t payload_size) {
  uint32_t temp_checksum;
  temp_checksum = ipv6_pseudo_header_checksum(ip6, sizeof(*udp) + payload_size, IPPROTO_UDP);
  dump_udp_generic(udp, temp_checksum, payload, payload_size);
}

/* print tcp header */
void 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) {
  uint16_t my_checksum;

  temp_checksum = ip_checksum_add(temp_checksum, tcp, sizeof(struct tcphdr));
  if (options) {
    temp_checksum = ip_checksum_add(temp_checksum, options, options_size);
  }
  temp_checksum = ip_checksum_add(temp_checksum, payload, payload_size);
  my_checksum   = ip_checksum_finish(temp_checksum);

  printf("TCP\n");
  printf("source = %x\n", ntohs(tcp->source));
  printf("dest = %x\n", ntohs(tcp->dest));
  printf("seq = %x\n", ntohl(tcp->seq));
  printf("ack = %x\n", ntohl(tcp->ack_seq));
  printf("d_off = %x\n", tcp->doff);
  printf("res1 = %x\n", tcp->res1);
#ifdef __BIONIC__
  printf("CWR = %x\n", tcp->cwr);
  printf("ECE = %x\n", tcp->ece);
#else
  printf("CWR/ECE = %x\n", tcp->res2);
#endif
  printf("urg = %x  ack = %x  psh = %x  rst = %x  syn = %x  fin = %x\n", tcp->urg, tcp->ack,
         tcp->psh, tcp->rst, tcp->syn, tcp->fin);
  printf("window = %x\n", ntohs(tcp->window));
  printf("check = %x [mine %x]\n", tcp->check, my_checksum);
  printf("urgent = %x\n", tcp->urg_ptr);

  if (options) {
    size_t i;

    printf("options: ");
    for (i = 0; i < options_size; i++) {
      printf("%x ", *(options + i));
    }
    printf("\n");
  }
}

/* print ipv4/tcp header */
void dump_tcp(const struct tcphdr *tcp, const struct iphdr *ip, const uint8_t *payload,
              size_t payload_size, const uint8_t *options, size_t options_size) {
  uint32_t temp_checksum;

  temp_checksum = ipv4_pseudo_header_checksum(ip, sizeof(*tcp) + options_size + payload_size);
  dump_tcp_generic(tcp, options, options_size, temp_checksum, payload, payload_size);
}

/* print ipv6/tcp header */
void dump_tcp6(const struct tcphdr *tcp, const struct ip6_hdr *ip6, const uint8_t *payload,
               size_t payload_size, const uint8_t *options, size_t options_size) {
  uint32_t temp_checksum;

  temp_checksum =
    ipv6_pseudo_header_checksum(ip6, sizeof(*tcp) + options_size + payload_size, IPPROTO_TCP);
  dump_tcp_generic(tcp, options, options_size, temp_checksum, payload, payload_size);
}

/* generic hex dump */
void logcat_hexdump(const char *info, const uint8_t *data, size_t len) {
  char output[PACKETLEN * 3 + 2];
  size_t i;

  output[0] = '\0';
  for (i = 0; i < len && i < PACKETLEN; i++) {
    snprintf(output + i * 3, 4, " %02x", data[i]);
  }
  output[len * 3 + 3] = '\0';

  logmsg(ANDROID_LOG_WARN, "info %s len %d data%s", info, len, output);
}

void dump_iovec(const struct iovec *iov, int iov_len) {
  int i;
  char *str;
  for (i = 0; i < iov_len; i++) {
    asprintf(&str, "iov[%d]: ", i);
    logcat_hexdump(str, iov[i].iov_base, iov[i].iov_len);
    free(str);
  }
}
#endif  // CLAT_DEBUG
