Понимание файла tcpdump.c в Contiki

Я пытаюсь просмотреть этот файл в Contiki, и мне трудно понять, для чего он нужен, и почему он использует такой запутанный код?

Моя кроватка с этой частью-

  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;

/*---------------------------------------------------------------------------*/
static char *
s(char *str, char *ptr)
{
  strcpy(ptr, str);
  return ptr + strlen(str);
}
/*---------------------------------------------------------------------------*/
int
tcpdump_format(uint8_t *packet, uint16_t packetlen,
           char *buf, uint16_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]);*/
    }

https://github.com/contiki-os/contiki/blob/master/tools/wpcapslip/tcpdump.c

В комментируемой части рассказывается, что пытается сделать код, но почему так?

1 ответ

Решение

Contiki разработан для крошечных систем, имея всего несколько килобайт доступной памяти. (Типичная система с полной сетью IPv6 с сонными маршрутизаторами и маршрутизацией RPL требует менее 10 КБ ОЗУ и 30 КБ ПЗУ.) Вероятно, стандартная библиотека строк не используется в ОС, поскольку она требует некоторой памяти. Очень маленькие встроенные системы иногда не используют стандартные библиотеки и при необходимости имеют собственную реализацию.

Другие вопросы по тегам