From eaa21d5975cd839bb36db87b73f871ce9431aad6 Mon Sep 17 00:00:00 2001 From: feelfree69 Date: Sun, 1 Mar 2026 17:20:36 +0100 Subject: [PATCH] rebase First try to make use of uIP for sending syslog --- cmd_editor.c | 2 +- cmd_parser.c | 7 +-- dhcp.h | 5 --- rtl837x_common.h | 1 + rtl837x_port.c | 2 +- rtlplayground.c | 6 +-- syslog.c | 114 +++++++++++++++++++++++++++-------------------- syslog.h | 6 +-- udp_apps.c | 17 +++++++ udp_apps.h | 13 ++++++ uip/uip-conf.h | 2 +- 11 files changed, 106 insertions(+), 69 deletions(-) create mode 100644 udp_apps.c create mode 100644 udp_apps.h diff --git a/cmd_editor.c b/cmd_editor.c index 2a96e11..9a837e9 100644 --- a/cmd_editor.c +++ b/cmd_editor.c @@ -197,7 +197,7 @@ void cmd_edit(void) __banked if (cmd_line_len) cmd_available = 1; else - print_string("\n> "); + print_cmd_prompt(); cursor = 0; cmd_line_len = 0; history_editptr = 0xffff; diff --git a/cmd_parser.c b/cmd_parser.c index cc9d996..d337a7d 100644 --- a/cmd_parser.c +++ b/cmd_parser.c @@ -41,7 +41,6 @@ extern __xdata char passwd[21]; extern __xdata struct dhcp_state dhcp_state; -extern __xdata uint8_t syslog_enabled; extern __xdata uip_ipaddr_t syslog_addr; __xdata uint8_t vlan_names[VLAN_NAMES_SIZE]; @@ -1210,11 +1209,9 @@ void cmd_parser(void) __banked tcpip_output(); } else if (cmd_compare(0, "syslog")) { if (cmd_words_b[1] > 0 && cmd_compare(1, "on")) { - print_string("UDP syslog enabled\n"); - syslog_enabled = 1; + syslog_start(); } else if (cmd_words_b[1] > 0 && cmd_compare(1, "off")){ - print_string("UDP syslog disabled\n"); - syslog_enabled = 0; + syslog_stop(); } else if (cmd_words_b[1] > 0 && cmd_compare(1, "ip")) { if (cmd_words_b[3] < 0) { print_string("Current syslog IP: "); diff --git a/dhcp.h b/dhcp.h index fdcc35d..fda167b 100644 --- a/dhcp.h +++ b/dhcp.h @@ -40,9 +40,4 @@ struct dhcp_state { typedef struct dhcp_state uip_udp_appstate_t; -/* Finally we define the application function to be called by uIP. */ -#ifndef UIP_UDP_APPCALL -#define UIP_UDP_APPCALL dhcp_callback -#endif /* UIP_APPCALL */ - #endif diff --git a/rtl837x_common.h b/rtl837x_common.h index d34d02d..5b73b84 100644 --- a/rtl837x_common.h +++ b/rtl837x_common.h @@ -107,6 +107,7 @@ void print_byte(uint8_t a); void itoa(uint8_t v); void print_sfr_data(void); void print_phy_data(void); +void print_cmd_prompt(void); void phy_write_mask(uint16_t phy_mask, uint8_t dev_id, uint16_t reg, uint16_t v); void phy_write(uint8_t phy_id, uint8_t dev_id, uint16_t reg, uint16_t v); void phy_read(uint8_t phy_id, uint8_t dev_id, uint16_t reg); diff --git a/rtl837x_port.c b/rtl837x_port.c index aa91a7a..250687e 100644 --- a/rtl837x_port.c +++ b/rtl837x_port.c @@ -387,7 +387,7 @@ void port_l2_setup(void) __banked void port_stats_print(void) __banked { - print_string("\n Port\tState\tLink\tTxGood\t\tTxBad\t\tRxGood\t\tRxBad\n"); + print_string("\nPort\tState\tLink\tTxGood\t\tTxBad\t\tRxGood\t\tRxBad\n"); for (uint8_t i = machine.min_port; i <= machine.max_port; i++) { write_char('0' + machine.log_to_phys_port[i]); write_char('\t'); diff --git a/rtlplayground.c b/rtlplayground.c index 293f23d..8f9bb9c 100644 --- a/rtlplayground.c +++ b/rtlplayground.c @@ -1321,10 +1321,8 @@ void idle(void) cmd_available = 0; if (!cmd_tokenize()) cmd_parser(); - print_string("\n> "); + print_cmd_prompt(); } - - handle_syslog(); } @@ -2213,7 +2211,7 @@ void main(void) early_boot_handle_button(); execute_config(); - print_string("\n> "); + print_cmd_prompt(); idle_ready = 1; set_sys_led_state(SYS_LED_ON); diff --git a/syslog.c b/syslog.c index 4e2239f..c3fbd17 100644 --- a/syslog.c +++ b/syslog.c @@ -6,32 +6,59 @@ #pragma codeseg BANK2 #pragma constseg BANK2 -#define SYSLOG_O ((__xdata uint8_t *)&uip_buf[RTL_TAG_SIZE + VLAN_TAG_SIZE]) +#define SYSLOG_P ((__xdata uint8_t *)uip_appdata) __xdata char logbuf[LOGBUF_SIZE]; -__xdata uint16_t logptr_w = 0; -__xdata uint16_t logptr_r = 0; -__xdata uint8_t full_line_available = 0; -__xdata uint8_t syslog_enabled = 0; +__xdata uint16_t logptr_w ; +__xdata uint16_t logptr_r; +__xdata uint8_t full_line_available; +__xdata uint8_t syslog_enabled; __xdata uip_ipaddr_t syslog_addr; -#define DEST_OFFSET (0) -#define SOURCE_OFFSET (DEST_OFFSET + 6) -#define ETHERTYPE_OFFSET (SOURCE_OFFSET + 6) -#define IP_HEADER_OFFSET (ETHERTYPE_OFFSET + 2) -#define UDP_HEADER_OFFSET (IP_HEADER_OFFSET + 20) -#define UDP_PAYLOAD_OFFSET (UDP_HEADER_OFFSET + 8) +struct uip_udp_conn *syslog_conn; void syslog_init(void) __banked { syslog_enabled = 0; + syslog_conn = 0; logptr_w = 0; logptr_r = 0; full_line_available = 0; - syslog_addr[0] = 0xffff; syslog_addr[1] = 0xffff; // Default to broadcast + syslog_addr[0] = 0; syslog_addr[1] = 0; // Default to 0.0.0.0 } -void handle_syslog(void) __banked +void syslog_start(void) __banked +{ + if (syslog_conn == 0) { + syslog_conn = uip_udp_new(&syslog_addr, HTONS(514)); + if (syslog_conn == 0) { + print_string("Failed to create a new UDP client\n"); + return; + } + print_string("Started syslog to IP "); + itoa(syslog_addr[0]); write_char('.'); itoa(syslog_addr[0]>>8); write_char('.'); + itoa(syslog_addr[1]); write_char('.'); itoa(syslog_addr[1]>>8); write_char('\n'); + + syslog_enabled = 1; + } + else { + print_string("Syslog is already running\n"); + } +} + +void syslog_stop(void) __banked +{ + syslog_enabled = 0; + if (syslog_conn != 0) { + uip_udp_remove(syslog_conn); + syslog_conn = 0; + print_string("Stopped syslog\n"); + } else { + print_string("Syslog is not running\n"); + } +} + +void syslog_callback(void) __banked { if ((logptr_r != logptr_w) && full_line_available) { @@ -39,51 +66,40 @@ void handle_syslog(void) __banked if (log_size < 0) log_size += LOGBUF_SIZE; - if (log_size <= 4) { - // Only some newline; not worth sending to syslog, skip it + // Skipping linefeeds at the start of the log line + uint16_t log_start = logptr_r; + while (log_size > 0 && logbuf[log_start] == '\n') { + log_start = (log_start + 1) & (LOGBUF_SIZE - 1); + log_size--; + } + + // Skipping linefeeds and whitespaces at the end of the log line + uint16_t log_end = logptr_w; + while ( (log_size > 0) && + ((logbuf[(log_end-1) & (LOGBUF_SIZE - 1)] == '\n') || + (logbuf[(log_end-1) & (LOGBUF_SIZE - 1)] == ' '))) + { + log_end = (log_end - 1) & (LOGBUF_SIZE - 1); + log_size--; + } + + if (log_size == 0) { logptr_r = logptr_w; full_line_available = 0; return; } - SYSLOG_O[DEST_OFFSET] = 255; SYSLOG_O[DEST_OFFSET + 1] = 255; SYSLOG_O[DEST_OFFSET + 2] = 255; - SYSLOG_O[DEST_OFFSET + 3] = 255; SYSLOG_O[DEST_OFFSET + 4] = 255; SYSLOG_O[DEST_OFFSET + 5] = 255; // broadcast - memcpy(SYSLOG_O + SOURCE_OFFSET, uip_ethaddr.addr, 6); // Source MAC address + memcpyc(SYSLOG_P, "<14>", 4); // Syslog priority prefix - SYSLOG_O[ETHERTYPE_OFFSET] = 0x08; SYSLOG_O[ETHERTYPE_OFFSET + 1] = 0x00; // Ethertype: IPv4 - - SYSLOG_O[IP_HEADER_OFFSET ] = 0x45; SYSLOG_O[IP_HEADER_OFFSET + 1] = 0x00; // IPv4, no options - SYSLOG_O[IP_HEADER_OFFSET + 2] = (20+8+4+log_size) >> 8; SYSLOG_O[IP_HEADER_OFFSET + 3] = (20+8+4+log_size) & 0xff; // Total Length (IP header + UDP header + payload) - SYSLOG_O[IP_HEADER_OFFSET + 4] = 0x00; SYSLOG_O[IP_HEADER_OFFSET + 5] = 0x00; // Identification - SYSLOG_O[IP_HEADER_OFFSET + 6] = 0x00; SYSLOG_O[IP_HEADER_OFFSET + 7] = 0x00; // Flags, Fragment Offset - SYSLOG_O[IP_HEADER_OFFSET + 8] = 0x40; SYSLOG_O[IP_HEADER_OFFSET + 9] = 0x11; // TTL, Protocol (UDP) - SYSLOG_O[IP_HEADER_OFFSET + 10] = 0x00; SYSLOG_O[IP_HEADER_OFFSET + 11] = 0x00; // Header Checksum (not calculated) - SYSLOG_O[IP_HEADER_OFFSET + 12] = uip_hostaddr[0] & 0xff; SYSLOG_O[IP_HEADER_OFFSET + 13] = uip_hostaddr[0] >> 8; - SYSLOG_O[IP_HEADER_OFFSET + 14] = uip_hostaddr[1] & 0xff; SYSLOG_O[IP_HEADER_OFFSET + 15] = uip_hostaddr[1] >> 8; // Source IP - SYSLOG_O[IP_HEADER_OFFSET + 16] = syslog_addr[0] & 0xff; SYSLOG_O[IP_HEADER_OFFSET + 17] = syslog_addr[0] >> 8; - SYSLOG_O[IP_HEADER_OFFSET + 18] = syslog_addr[1] & 0xff; SYSLOG_O[IP_HEADER_OFFSET + 19] = syslog_addr[1] >> 8; // Destination IP - - SYSLOG_O[UDP_HEADER_OFFSET ] = 0x02; SYSLOG_O[UDP_HEADER_OFFSET + 1] = 0x02; // Source Port - SYSLOG_O[UDP_HEADER_OFFSET + 2] = 0x02; SYSLOG_O[UDP_HEADER_OFFSET + 3] = 0x02; // Destination Port - SYSLOG_O[UDP_HEADER_OFFSET + 4] = (8+4+log_size) >> 8; SYSLOG_O[UDP_HEADER_OFFSET + 5] = (8+4+log_size) & 0xff; // Length (UDP header + payload) - SYSLOG_O[UDP_HEADER_OFFSET + 6] = 0x00; SYSLOG_O[UDP_HEADER_OFFSET + 7] = 0x00; // Header Checksum (not calculated) - - memcpyc(SYSLOG_O + UDP_PAYLOAD_OFFSET, "<14>", 4); // Syslog priority prefix - - if (logptr_w < logptr_r) { - memcpy(SYSLOG_O + UDP_PAYLOAD_OFFSET + 4, logbuf + logptr_r, LOGBUF_SIZE - logptr_r); - memcpy(SYSLOG_O + UDP_PAYLOAD_OFFSET + 4 + LOGBUF_SIZE - logptr_r, logbuf, logptr_w); + if (log_end < log_start) { + memcpy(SYSLOG_P + 4, logbuf + log_start, LOGBUF_SIZE - log_start); + memcpy(SYSLOG_P + 4 + LOGBUF_SIZE - log_start, logbuf, log_end); } else { - memcpy(SYSLOG_O + UDP_PAYLOAD_OFFSET + 4, logbuf + logptr_r, logptr_w - logptr_r); + memcpy(SYSLOG_P + 4, logbuf + log_start, log_end - log_start); } - // SYSLOG_O[UDP_PAYLOAD_OFFSET + 4 + log_size - 1] = 0; // Null-terminate the payload - - uip_len = UDP_PAYLOAD_OFFSET+4+log_size; - tcpip_output(); - - logptr_r += log_size; - logptr_r &= (LOGBUF_SIZE - 1); + uip_udp_send(log_size+4); + logptr_r = logptr_w; full_line_available = 0; } } diff --git a/syslog.h b/syslog.h index 4bb633c..ccb75c9 100644 --- a/syslog.h +++ b/syslog.h @@ -5,9 +5,9 @@ #define LOGBUF_SIZE 512 -extern __xdata char logbuf[LOGBUF_SIZE]; - void syslog_init(void) __banked; -void handle_syslog(void) __banked; +void syslog_start(void) __banked; +void syslog_stop(void) __banked; +void syslog_callback(void) __banked; #endif diff --git a/udp_apps.c b/udp_apps.c new file mode 100644 index 0000000..390a66f --- /dev/null +++ b/udp_apps.c @@ -0,0 +1,17 @@ + +#include "stdint.h" +#include "udp_apps.h" + +static uint8_t callbacknr; + +void udp_callbacks(void) +{ + // Calling more than one callback from the same UIP_UDP_APPCALL does not work; we use a simple dispatcher + if (callbacknr == 0) { + dhcp_callback(); + callbacknr = 1; + } else { + syslog_callback(); + callbacknr = 0; + } +} \ No newline at end of file diff --git a/udp_apps.h b/udp_apps.h new file mode 100644 index 0000000..1f842ce --- /dev/null +++ b/udp_apps.h @@ -0,0 +1,13 @@ +#ifndef _UDPAPPS_H_ +#define _UDPAPPS_H_ + +#include "dhcp.h" +#include "syslog.h" + +void udp_callbacks(void); + +#ifndef UIP_UDP_APPCALL +#define UIP_UDP_APPCALL udp_callbacks +#endif /* UIP_UDP_APPCALL */ + +#endif diff --git a/uip/uip-conf.h b/uip/uip-conf.h index a413c83..384f7fa 100644 --- a/uip/uip-conf.h +++ b/uip/uip-conf.h @@ -153,7 +153,7 @@ typedef unsigned short uip_stats_t; our project. */ /*#include "smtp.h"*/ #include "httpd.h" -#include "dhcp.h" +#include "udp_apps.h" /*#include "telnetd.h"*/ /*#include "webserver.h" */ /*#include "dhcpc.h"*/