| /* | |
| * Copyright 2017, Data61, CSIRO (ABN 41 687 119 230) | |
| * Copyright 2020, HENSOLDT Cyber GmbH | |
| * | |
| * SPDX-License-Identifier: GPL-2.0-only | |
| * | |
| * | |
| * This file uses printf() instead of ZF_LOGx() because it is used for special | |
| * debugging purposes only. Re-writing the functions is not worth the effort. It | |
| * should happen if the function are used during normal operation also. | |
| */ | |
| #pragma once | |
| #include <stdio.h> | |
| #include <stdint.h> | |
| #include <utils/util.h> | |
| #ifdef DBG_PKT | |
| # define PKT_DEBUG(x) do{x;}while(0) | |
| # ifdef DBG_PRINT_PAYLOAD | |
| # define DEBUG_PRINT_PAYLOAD(DEBUG_PRINT_PAYLOAD) | |
| # endif | |
| #else | |
| # define PKT_DEBUG(x) do{;}while(0) | |
| #endif | |
| #define COL_NET "\e[1;34m" | |
| #define COL_IMP "\e[1;31m" | |
| #define COL_FEC "\e[1;32m" | |
| #define COL_RX "\e[42;30m" | |
| #define COL_TX "\e[43;30m" | |
| #define COL_ARP "\e[1;28m" | |
| #define COL_PKT "\e[1;36m" | |
| #define COL_DEF "\e[0;0m" | |
| #define cprintf(col, fmt, ...) ZF_LOGD( col fmt COL_DEF, __VA_ARGS__) | |
| #ifdef DBG_PKT | |
| static inline void print_mac(uint8_t *mac) | |
| { | |
| int i; | |
| printf("%02x", *mac++); | |
| for (i = 0; i < 5; i++) { | |
| printf(":%02x", *mac++); | |
| } | |
| } | |
| static inline void print_type(uint8_t *p) | |
| { | |
| uint32_t type = 0; | |
| int i; | |
| p += 6 * 2; | |
| for (i = 0; i < 2; i++) { | |
| type = type << 8 | *p++; | |
| } | |
| switch (type) { | |
| case 0x0806: | |
| printf("ARP"); | |
| break; | |
| case 0x0800: | |
| printf(" IP"); | |
| break; | |
| default: | |
| printf("UNKNOWN"); | |
| } | |
| printf(" (0x%04x)", type); | |
| } | |
| static inline void print_val(uint8_t *p, int len) | |
| { | |
| uint32_t val = 0; | |
| int i; | |
| for (i = 0; i < len; i++) { | |
| val = val << 8 | *p++; | |
| } | |
| printf("%d", val); | |
| } | |
| static inline void print_packet(const char *col, void *packet, int length) | |
| { | |
| cprintf(col, "packet 0x%x (%d bytes)", (uint32_t)packet, length); | |
| unsigned char *p = packet; | |
| printf(" dst MAC : "); | |
| print_mac(p + 0); | |
| printf(" src MAC : "); | |
| print_mac(p + 6); | |
| printf("\n"); | |
| printf(" src port: "); | |
| print_val(p + 0x22, 2); | |
| printf(" dst port: "); | |
| print_val(p + 0x24, 2); | |
| printf("\n"); | |
| printf(" type : "); | |
| print_type(p + 0); | |
| printf("\n"); | |
| #if defined(DBG_PRINT_PAYLOAD) | |
| int i, j; | |
| for (i = 0; i < length; i += 32) { | |
| for (j = 0; j < 32 && length > i + j; j++) { | |
| printf("%02x", *p++); | |
| } | |
| printf("\n"); | |
| } | |
| #endif | |
| printf("\n"); | |
| } | |
| #endif | |