Понимание файла 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 КБ ПЗУ.) Вероятно, стандартная библиотека строк не используется в ОС, поскольку она требует некоторой памяти. Очень маленькие встроенные системы иногда не используют стандартные библиотеки и при необходимости имеют собственную реализацию.