mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-08-30 14:52:51 +08:00
rebase First try to make use of uIP for sending syslog
This commit is contained in:
+1
-1
@@ -197,7 +197,7 @@ void cmd_edit(void) __banked
|
|||||||
if (cmd_line_len)
|
if (cmd_line_len)
|
||||||
cmd_available = 1;
|
cmd_available = 1;
|
||||||
else
|
else
|
||||||
print_string("\n> ");
|
print_cmd_prompt();
|
||||||
cursor = 0;
|
cursor = 0;
|
||||||
cmd_line_len = 0;
|
cmd_line_len = 0;
|
||||||
history_editptr = 0xffff;
|
history_editptr = 0xffff;
|
||||||
|
|||||||
+2
-5
@@ -41,7 +41,6 @@ extern __xdata char passwd[21];
|
|||||||
|
|
||||||
extern __xdata struct dhcp_state dhcp_state;
|
extern __xdata struct dhcp_state dhcp_state;
|
||||||
|
|
||||||
extern __xdata uint8_t syslog_enabled;
|
|
||||||
extern __xdata uip_ipaddr_t syslog_addr;
|
extern __xdata uip_ipaddr_t syslog_addr;
|
||||||
|
|
||||||
__xdata uint8_t vlan_names[VLAN_NAMES_SIZE];
|
__xdata uint8_t vlan_names[VLAN_NAMES_SIZE];
|
||||||
@@ -1210,11 +1209,9 @@ void cmd_parser(void) __banked
|
|||||||
tcpip_output();
|
tcpip_output();
|
||||||
} else if (cmd_compare(0, "syslog")) {
|
} else if (cmd_compare(0, "syslog")) {
|
||||||
if (cmd_words_b[1] > 0 && cmd_compare(1, "on")) {
|
if (cmd_words_b[1] > 0 && cmd_compare(1, "on")) {
|
||||||
print_string("UDP syslog enabled\n");
|
syslog_start();
|
||||||
syslog_enabled = 1;
|
|
||||||
} else if (cmd_words_b[1] > 0 && cmd_compare(1, "off")){
|
} else if (cmd_words_b[1] > 0 && cmd_compare(1, "off")){
|
||||||
print_string("UDP syslog disabled\n");
|
syslog_stop();
|
||||||
syslog_enabled = 0;
|
|
||||||
} else if (cmd_words_b[1] > 0 && cmd_compare(1, "ip")) {
|
} else if (cmd_words_b[1] > 0 && cmd_compare(1, "ip")) {
|
||||||
if (cmd_words_b[3] < 0) {
|
if (cmd_words_b[3] < 0) {
|
||||||
print_string("Current syslog IP: ");
|
print_string("Current syslog IP: ");
|
||||||
|
|||||||
@@ -40,9 +40,4 @@ struct dhcp_state {
|
|||||||
|
|
||||||
typedef struct dhcp_state uip_udp_appstate_t;
|
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
|
#endif
|
||||||
|
|||||||
@@ -107,6 +107,7 @@ void print_byte(uint8_t a);
|
|||||||
void itoa(uint8_t v);
|
void itoa(uint8_t v);
|
||||||
void print_sfr_data(void);
|
void print_sfr_data(void);
|
||||||
void print_phy_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_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_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);
|
void phy_read(uint8_t phy_id, uint8_t dev_id, uint16_t reg);
|
||||||
|
|||||||
+1
-1
@@ -387,7 +387,7 @@ void port_l2_setup(void) __banked
|
|||||||
|
|
||||||
void port_stats_print(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++) {
|
for (uint8_t i = machine.min_port; i <= machine.max_port; i++) {
|
||||||
write_char('0' + machine.log_to_phys_port[i]); write_char('\t');
|
write_char('0' + machine.log_to_phys_port[i]); write_char('\t');
|
||||||
|
|
||||||
|
|||||||
+2
-4
@@ -1321,10 +1321,8 @@ void idle(void)
|
|||||||
cmd_available = 0;
|
cmd_available = 0;
|
||||||
if (!cmd_tokenize())
|
if (!cmd_tokenize())
|
||||||
cmd_parser();
|
cmd_parser();
|
||||||
print_string("\n> ");
|
print_cmd_prompt();
|
||||||
}
|
}
|
||||||
|
|
||||||
handle_syslog();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -2213,7 +2211,7 @@ void main(void)
|
|||||||
early_boot_handle_button();
|
early_boot_handle_button();
|
||||||
|
|
||||||
execute_config();
|
execute_config();
|
||||||
print_string("\n> ");
|
print_cmd_prompt();
|
||||||
idle_ready = 1;
|
idle_ready = 1;
|
||||||
|
|
||||||
set_sys_led_state(SYS_LED_ON);
|
set_sys_led_state(SYS_LED_ON);
|
||||||
|
|||||||
@@ -6,32 +6,59 @@
|
|||||||
#pragma codeseg BANK2
|
#pragma codeseg BANK2
|
||||||
#pragma constseg 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 char logbuf[LOGBUF_SIZE];
|
||||||
__xdata uint16_t logptr_w = 0;
|
__xdata uint16_t logptr_w ;
|
||||||
__xdata uint16_t logptr_r = 0;
|
__xdata uint16_t logptr_r;
|
||||||
__xdata uint8_t full_line_available = 0;
|
__xdata uint8_t full_line_available;
|
||||||
__xdata uint8_t syslog_enabled = 0;
|
__xdata uint8_t syslog_enabled;
|
||||||
__xdata uip_ipaddr_t syslog_addr;
|
__xdata uip_ipaddr_t syslog_addr;
|
||||||
|
|
||||||
#define DEST_OFFSET (0)
|
struct uip_udp_conn *syslog_conn;
|
||||||
#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)
|
|
||||||
|
|
||||||
void syslog_init(void) __banked
|
void syslog_init(void) __banked
|
||||||
{
|
{
|
||||||
syslog_enabled = 0;
|
syslog_enabled = 0;
|
||||||
|
syslog_conn = 0;
|
||||||
logptr_w = 0;
|
logptr_w = 0;
|
||||||
logptr_r = 0;
|
logptr_r = 0;
|
||||||
full_line_available = 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)
|
if ((logptr_r != logptr_w) && full_line_available)
|
||||||
{
|
{
|
||||||
@@ -39,51 +66,40 @@ void handle_syslog(void) __banked
|
|||||||
if (log_size < 0)
|
if (log_size < 0)
|
||||||
log_size += LOGBUF_SIZE;
|
log_size += LOGBUF_SIZE;
|
||||||
|
|
||||||
if (log_size <= 4) {
|
// Skipping linefeeds at the start of the log line
|
||||||
// Only some newline; not worth sending to syslog, skip it
|
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;
|
logptr_r = logptr_w;
|
||||||
full_line_available = 0;
|
full_line_available = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SYSLOG_O[DEST_OFFSET] = 255; SYSLOG_O[DEST_OFFSET + 1] = 255; SYSLOG_O[DEST_OFFSET + 2] = 255;
|
memcpyc(SYSLOG_P, "<14>", 4); // Syslog priority prefix
|
||||||
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
|
|
||||||
|
|
||||||
SYSLOG_O[ETHERTYPE_OFFSET] = 0x08; SYSLOG_O[ETHERTYPE_OFFSET + 1] = 0x00; // Ethertype: IPv4
|
if (log_end < log_start) {
|
||||||
|
memcpy(SYSLOG_P + 4, logbuf + log_start, LOGBUF_SIZE - log_start);
|
||||||
SYSLOG_O[IP_HEADER_OFFSET ] = 0x45; SYSLOG_O[IP_HEADER_OFFSET + 1] = 0x00; // IPv4, no options
|
memcpy(SYSLOG_P + 4 + LOGBUF_SIZE - log_start, logbuf, log_end);
|
||||||
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);
|
|
||||||
} else {
|
} 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;
|
full_line_available = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,9 +5,9 @@
|
|||||||
|
|
||||||
#define LOGBUF_SIZE 512
|
#define LOGBUF_SIZE 512
|
||||||
|
|
||||||
extern __xdata char logbuf[LOGBUF_SIZE];
|
|
||||||
|
|
||||||
void syslog_init(void) __banked;
|
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
|
#endif
|
||||||
|
|||||||
+17
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
+13
@@ -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
|
||||||
+1
-1
@@ -153,7 +153,7 @@ typedef unsigned short uip_stats_t;
|
|||||||
our project. */
|
our project. */
|
||||||
/*#include "smtp.h"*/
|
/*#include "smtp.h"*/
|
||||||
#include "httpd.h"
|
#include "httpd.h"
|
||||||
#include "dhcp.h"
|
#include "udp_apps.h"
|
||||||
/*#include "telnetd.h"*/
|
/*#include "telnetd.h"*/
|
||||||
/*#include "webserver.h" */
|
/*#include "webserver.h" */
|
||||||
/*#include "dhcpc.h"*/
|
/*#include "dhcpc.h"*/
|
||||||
|
|||||||
Reference in New Issue
Block a user