mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-08-30 14:52:51 +08:00
Compare commits
26
Commits
787d593996
...
80095ba617
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
80095ba617 | ||
|
|
47b3ee60b6 | ||
|
|
59d20ed9b6 | ||
|
|
f41ed2b943 | ||
|
|
56fa96c494 | ||
|
|
6bfcbd2f9a | ||
|
|
fa7895ad62 | ||
|
|
1ed8b131bc | ||
|
|
9ada6adad7 | ||
|
|
719c6db228 | ||
|
|
a96fdfe10c | ||
|
|
3fda9ccd86 | ||
|
|
3be6667789 | ||
|
|
5103d1c168 | ||
|
|
ce85576882 | ||
|
|
59c60504e7 | ||
|
|
a3c586ef38 | ||
|
|
8bc530d3d0 | ||
|
|
f2c6ac01d9 | ||
|
|
94d9f2c8e8 | ||
|
|
0503e7952d | ||
|
|
11be13fe53 | ||
|
|
65f8afb908 | ||
|
|
0126b159bf | ||
|
|
31024388ba | ||
|
|
9f2d6b72b7 |
@@ -86,17 +86,16 @@ SRCS += \
|
|||||||
|
|
||||||
OBJS = ${SRCS:%.c=$(BUILDDIR)/%.rel}
|
OBJS = ${SRCS:%.c=$(BUILDDIR)/%.rel}
|
||||||
DEPS := ${SRCS:%.c=$(BUILDDIR)/%.d}
|
DEPS := ${SRCS:%.c=$(BUILDDIR)/%.d}
|
||||||
HTML := $(shell find $(html) -name '*.js' -or -name '*.html' -or -name '*.svg')
|
HTML := $(shell find html -name '*.js' -or -name '*.html' -or -name '*.svg')
|
||||||
|
|
||||||
html_data.c html_data.h: $(HTML) tools/output/fileadder
|
html_data.c html_data.h &: $(HTML) | tools
|
||||||
tools/output/fileadder -a $(HTML_LOCATION) -s $(IMAGESIZE) -b BANK1 -d html -p html_data
|
tools/output/fileadder -a $(HTML_LOCATION) -s $(IMAGESIZE) -b BANK1 -d html -p html_data
|
||||||
|
|
||||||
$(VERSION_HEADER):
|
$(VERSION_HEADER):
|
||||||
@echo "#ifndef VERSION_H" > $(VERSION_HEADER)
|
@printf '%s\n' "#ifndef VERSION_H" "#define VERSION_H" \
|
||||||
@echo "#define VERSION_H" >> $(VERSION_HEADER)
|
"#define VERSION_SW \"$(VERSION_EXTENSION)\"" \
|
||||||
@echo "#define VERSION_SW \"$(VERSION_EXTENSION)\"" >> $(VERSION_HEADER)
|
"#define BUILD_DATE \"$(BUILD_DATE)\"" \
|
||||||
@echo "#define BUILD_DATE \"$(BUILD_DATE)\"" >> $(VERSION_HEADER)
|
"#endif" > $(VERSION_HEADER)
|
||||||
@echo "#endif" >> $(VERSION_HEADER)
|
|
||||||
|
|
||||||
httpd: html_data.h
|
httpd: html_data.h
|
||||||
|
|
||||||
@@ -111,20 +110,20 @@ distclean:
|
|||||||
-rm -f html_data.c html_data.h $(VERSION_HEADER)
|
-rm -f html_data.c html_data.h $(VERSION_HEADER)
|
||||||
-rm -rf $(BUILDDIR)
|
-rm -rf $(BUILDDIR)
|
||||||
|
|
||||||
$(BUILDDIR)/%.rel: %.c
|
$(BUILDDIR)/%.rel: %.c | create_build_dir html_data.h
|
||||||
$(CC) -MMD $(CC_FLAGS) -o $@ -c $<
|
$(CC) -MMD $(CC_FLAGS) -o $@ -c $<
|
||||||
|
|
||||||
$(BUILDDIR)/%.rel: %.asm
|
$(BUILDDIR)/%.rel: %.asm | create_build_dir
|
||||||
${ASM} ${AFLAGS} -o $@ $<
|
${ASM} ${AFLAGS} -o $@ $<
|
||||||
# mv -f $(addprefix $(basename $^), .lst .rel .sym) .
|
# mv -f $(addprefix $(basename $^), .lst .rel .sym) .
|
||||||
|
|
||||||
$(BUILDDIR)/rtlplayground.ihx: $(OBJS) $(BUILDDIR)/crtstart.rel $(BUILDDIR)/crc16.rel
|
$(BUILDDIR)/rtlplayground.ihx: $(OBJS) $(BUILDDIR)/crtbank.rel $(BUILDDIR)/crc16.rel
|
||||||
$(CC) $(CC_FLAGS) -Wl-bHOME=0x00000 -Wl-bBANK1=0x14000 -Wl-bBANK2=0x24000 -Wl-r -o $@ $^
|
$(CC) $(CC_FLAGS) -Wl-bHOME=0x00000 -Wl-bBANK1=0x14000 -Wl-bBANK2=0x24000 -Wl-r -o $@ $^
|
||||||
|
|
||||||
$(BUILDDIR)/rtlplayground.img: $(BUILDDIR)/rtlplayground.ihx
|
$(BUILDDIR)/rtlplayground.img: $(BUILDDIR)/rtlplayground.ihx
|
||||||
objcopy --input-target=ihex -O binary $< $@
|
objcopy --input-target=ihex -O binary $< $@
|
||||||
|
|
||||||
$(BUILDDIR)/rtlplayground-$(FILENAME_EXTENSION).bin: $(BUILDDIR)/rtlplayground.img
|
$(BUILDDIR)/rtlplayground-$(FILENAME_EXTENSION).bin: $(BUILDDIR)/rtlplayground.img | tools
|
||||||
if [ -e $@ ]; then rm $@; fi
|
if [ -e $@ ]; then rm $@; fi
|
||||||
tools/output/imagebuilder -i $^ $@
|
tools/output/imagebuilder -i $^ $@
|
||||||
tools/output/fileadder -a $(DEFAULT_CONFIG_LOCATION) -s $(IMAGESIZE) -d config.txt $@
|
tools/output/fileadder -a $(DEFAULT_CONFIG_LOCATION) -s $(IMAGESIZE) -d config.txt $@
|
||||||
@@ -133,7 +132,7 @@ $(BUILDDIR)/rtlplayground-$(FILENAME_EXTENSION).bin: $(BUILDDIR)/rtlplayground.i
|
|||||||
tools/output/crc_calculator -u $@
|
tools/output/crc_calculator -u $@
|
||||||
ln -sf $(MACHINE)/rtlplayground-$(FILENAME_EXTENSION).bin output/rtlplayground.bin
|
ln -sf $(MACHINE)/rtlplayground-$(FILENAME_EXTENSION).bin output/rtlplayground.bin
|
||||||
|
|
||||||
.PHONY: clean all $(SUBDIRS) $(VERSION_HEADER)
|
.PHONY: clean all $(SUBDIRS) $(VERSION_HEADER) create_build_dir
|
||||||
|
|
||||||
.PHONY:
|
.PHONY:
|
||||||
machine_check:
|
machine_check:
|
||||||
|
|||||||
+24
-12
@@ -250,8 +250,7 @@ void parse_lag(void)
|
|||||||
print_string("LAG status:\n");
|
print_string("LAG status:\n");
|
||||||
for (uint8_t i = 0; i < 4; i++) {
|
for (uint8_t i = 0; i < 4; i++) {
|
||||||
write_char(' '); write_char('1' + i);
|
write_char(' '); write_char('1' + i);
|
||||||
reg_read_m(RTL837X_TRK_MBR_CTRL_BASE + (i << 2));
|
members = port_lag_members_get(i);
|
||||||
members = ((uint16_t)sfr_data[2]) << 8 | sfr_data[3];
|
|
||||||
if (!members) {
|
if (!members) {
|
||||||
print_string(" disabled\n");
|
print_string(" disabled\n");
|
||||||
continue;
|
continue;
|
||||||
@@ -274,7 +273,9 @@ void parse_lag(void)
|
|||||||
|
|
||||||
if (cmd_words_len < 2 || !isnumber(cmd_buffer[cmd_words_b[1]]))
|
if (cmd_words_len < 2 || !isnumber(cmd_buffer[cmd_words_b[1]]))
|
||||||
goto err;
|
goto err;
|
||||||
group = cmd_buffer[cmd_words_b[1]] - '0';
|
group = cmd_buffer[cmd_words_b[1]] - '1';
|
||||||
|
if (group > 3) /* '0' wraps well past three, so one test does both ends */
|
||||||
|
goto err;
|
||||||
|
|
||||||
uint8_t w = 2;
|
uint8_t w = 2;
|
||||||
while (w < cmd_words_len) {
|
while (w < cmd_words_len) {
|
||||||
@@ -284,7 +285,9 @@ void parse_lag(void)
|
|||||||
port = cmd_buffer[cmd_words_b[w]] - '1';
|
port = cmd_buffer[cmd_words_b[w]] - '1';
|
||||||
if (isnumber(cmd_buffer[cmd_words_b[w] + 1]))
|
if (isnumber(cmd_buffer[cmd_words_b[w] + 1]))
|
||||||
port = (port + 1) * 10 + cmd_buffer[cmd_words_b[w] + 1] - '1';
|
port = (port + 1) * 10 + cmd_buffer[cmd_words_b[w] + 1] - '1';
|
||||||
port = machine.phys_to_log_port[port];
|
if (port > 8) /* phys_to_log_port holds nine entries */
|
||||||
|
goto err;
|
||||||
|
port = machine.phys_to_log_port[port];
|
||||||
} else {
|
} else {
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@@ -296,7 +299,7 @@ void parse_lag(void)
|
|||||||
port_lag_members_set(group, members);
|
port_lag_members_set(group, members);
|
||||||
return;
|
return;
|
||||||
err:
|
err:
|
||||||
print_string("Error: lag <lag> [port]...\n");
|
print_string("Error: lag <1-4> [port]...\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -305,7 +308,11 @@ void parse_lag_hash(void)
|
|||||||
__xdata uint8_t group;
|
__xdata uint8_t group;
|
||||||
__xdata uint8_t hash = 0;
|
__xdata uint8_t hash = 0;
|
||||||
|
|
||||||
group = cmd_buffer[cmd_words_b[1]] - '0';
|
if (cmd_words_len < 2 || !isnumber(cmd_buffer[cmd_words_b[1]]))
|
||||||
|
goto err;
|
||||||
|
group = cmd_buffer[cmd_words_b[1]] - '1';
|
||||||
|
if (group > 3) /* '0' wraps well past three, so one test does both ends */
|
||||||
|
goto err;
|
||||||
|
|
||||||
uint8_t w = 2;
|
uint8_t w = 2;
|
||||||
while (w < cmd_words_len) {
|
while (w < cmd_words_len) {
|
||||||
@@ -331,6 +338,9 @@ void parse_lag_hash(void)
|
|||||||
w++;
|
w++;
|
||||||
}
|
}
|
||||||
port_lag_hash_set(group, hash);
|
port_lag_hash_set(group, hash);
|
||||||
|
return;
|
||||||
|
err:
|
||||||
|
print_string("Error: lag hash <1-4> [type]...\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -418,11 +428,11 @@ void parse_isolate(void)
|
|||||||
|
|
||||||
print_string("\nISOLATE ");
|
print_string("\nISOLATE ");
|
||||||
|
|
||||||
__xdata int8_t port_configured = cmd_buffer[cmd_words_b[1]] - '1';
|
if (!isnumber(cmd_buffer[cmd_words_b[1]]) || cmd_buffer[cmd_words_b[1]] == '0'
|
||||||
port_configured = machine.phys_to_log_port[port_configured];
|
|| isnumber(cmd_buffer[cmd_words_b[1] + 1]))
|
||||||
if (isnumber(cmd_buffer[cmd_words_b[1] + 1])) // CPU-port, logical port 9
|
goto err;
|
||||||
port_configured = (port_configured + 1) * 10 + cmd_buffer[cmd_words_b[1] + 1] - '1';
|
__xdata uint8_t port_configured = machine.phys_to_log_port[cmd_buffer[cmd_words_b[1]] - '1'];
|
||||||
if (port_configured < 0 || port_configured > 9)
|
if (port_configured < machine.min_port || port_configured > machine.max_port)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
print_byte(port_configured); write_char('\n');
|
print_byte(port_configured); write_char('\n');
|
||||||
@@ -1530,10 +1540,12 @@ void cmd_parser(void) __banked
|
|||||||
} else if (cmd_compare(0, "igmp")) {
|
} else if (cmd_compare(0, "igmp")) {
|
||||||
if (cmd_compare(1, "on"))
|
if (cmd_compare(1, "on"))
|
||||||
igmp_enable();
|
igmp_enable();
|
||||||
|
else if (cmd_compare(1, "off"))
|
||||||
|
igmp_setup();
|
||||||
else if (cmd_compare(1, "show"))
|
else if (cmd_compare(1, "show"))
|
||||||
igmp_show();
|
igmp_show();
|
||||||
else
|
else
|
||||||
igmp_setup(); // Reverts to default with IP-MC being flooded
|
print_string("Error: igmp on|off|show\n");
|
||||||
} else if (cmd_compare(0, "hostname")) {
|
} else if (cmd_compare(0, "hostname")) {
|
||||||
/* "hostname" alone reports the current name; "hostname <text>"
|
/* "hostname" alone reports the current name; "hostname <text>"
|
||||||
* sets it, sanitized to JSON-safe printable ASCII. A name with
|
* sets it, sanitized to JSON-safe printable ASCII. A name with
|
||||||
|
|||||||
+29
@@ -0,0 +1,29 @@
|
|||||||
|
.area HOME (CODE)
|
||||||
|
.area GSINIT0 (CODE)
|
||||||
|
.area GSINIT1 (CODE)
|
||||||
|
.area GSINIT2 (CODE)
|
||||||
|
.area GSINIT3 (CODE)
|
||||||
|
.area GSINIT4 (CODE)
|
||||||
|
.area GSINIT5 (CODE)
|
||||||
|
.area GSINIT (CODE)
|
||||||
|
.area GSFINAL (CODE)
|
||||||
|
.area CSEG (CODE)
|
||||||
|
|
||||||
|
|
||||||
|
.area HOME (CODE)
|
||||||
|
|
||||||
|
__sdcc_banked_call::
|
||||||
|
push _PSBANK
|
||||||
|
xch a,r0
|
||||||
|
push a
|
||||||
|
mov a,r1
|
||||||
|
push a
|
||||||
|
mov a,r2
|
||||||
|
anl a,#0x1f
|
||||||
|
mov _PSBANK, a
|
||||||
|
xch a, r0
|
||||||
|
ret
|
||||||
|
|
||||||
|
__sdcc_banked_ret::
|
||||||
|
pop _PSBANK
|
||||||
|
ret
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
.area GSFINAL (CODE)
|
|
||||||
|
|
||||||
__sdcc_banked_call::
|
|
||||||
push _PSBANK
|
|
||||||
xch a,r0
|
|
||||||
push a
|
|
||||||
mov a,r1
|
|
||||||
push a
|
|
||||||
mov a,r2
|
|
||||||
anl a,#0x1f
|
|
||||||
mov _PSBANK, a
|
|
||||||
xch a, r0
|
|
||||||
ret
|
|
||||||
|
|
||||||
__sdcc_banked_ret::
|
|
||||||
pop _PSBANK
|
|
||||||
ret
|
|
||||||
@@ -92,7 +92,7 @@ The following shows the network configuration
|
|||||||
On _both_ switches create a LAG with ports 1 and 2 inside and the default hash algorithm which takes
|
On _both_ switches create a LAG with ports 1 and 2 inside and the default hash algorithm which takes
|
||||||
source and destination ports into account, e.g. just use the default:
|
source and destination ports into account, e.g. just use the default:
|
||||||
```
|
```
|
||||||
> lag 0 1 2
|
> lag 1 1 2
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+7
-40
@@ -1,7 +1,3 @@
|
|||||||
var l2GetInterval;
|
|
||||||
var l2Entries = [];
|
|
||||||
var l2CurrentEntry = 0;
|
|
||||||
|
|
||||||
function fillStats() {
|
function fillStats() {
|
||||||
var tbl = document.getElementById('statstable');
|
var tbl = document.getElementById('statstable');
|
||||||
if (!numPorts)
|
if (!numPorts)
|
||||||
@@ -118,7 +114,6 @@ function fillL2(s)
|
|||||||
s = uniq(s);
|
s = uniq(s);
|
||||||
l2All = s;
|
l2All = s;
|
||||||
renderL2();
|
renderL2();
|
||||||
l2Entries = [];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function paintL2(tbl, s)
|
function paintL2(tbl, s)
|
||||||
@@ -147,48 +142,20 @@ function paintL2(tbl, s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getL2() {
|
function getL2() {
|
||||||
var xhttp = new XMLHttpRequest();
|
walkL2(function(entries, ok) {
|
||||||
xhttp.onreadystatechange = function() {
|
if (ok) {
|
||||||
if (this.readyState == 4 && this.status == 200) {
|
for (var i = 0; i < entries.length; i++)
|
||||||
var s = JSON.parse(xhttp.responseText);
|
entries[i].type = entries[i].type == "s" ? t('l2_static') : t('l2_learned');
|
||||||
var s = s.map(function(e) {
|
fillL2(entries);
|
||||||
e.vlan = parseInt(e.vlan, 16);
|
|
||||||
e.idx = parseInt(e.idx, 16);
|
|
||||||
e.type = e.type == "s" ? t('l2_static') : t('l2_learned');
|
|
||||||
e.port = e.port == 9 ? 'CPU' : logToPhysPort[e.port];
|
|
||||||
return e;
|
|
||||||
});
|
|
||||||
l2Entries.push(...s);
|
|
||||||
if (l2Entries >= 4096) {
|
|
||||||
l2Entries = [];
|
|
||||||
l2CurrentEntry = 0;
|
|
||||||
clearInterval(l2GetInterval);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var w = 0;
|
|
||||||
for (var i = l2Entries.length-1; i > 0; i--) {
|
|
||||||
if (l2Entries[0].idx == l2Entries[i].idx) {
|
|
||||||
w = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (w) {
|
|
||||||
l2CurrentEntry = 0;
|
|
||||||
fillL2(l2Entries);
|
|
||||||
} else {
|
|
||||||
l2CurrentEntry = s[s.length-1].idx + 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
setTimeout(getL2, 1000);
|
||||||
xhttp.open("GET", "/l2.json?idx=" + l2CurrentEntry, true);
|
});
|
||||||
xhttp.timeout = 1500; sendXHTTP(xhttp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
window.addEventListener("load", function() {
|
window.addEventListener("load", function() {
|
||||||
update( () => {
|
update( () => {
|
||||||
getL2();
|
getL2();
|
||||||
const interval = setInterval(update, 2000);
|
const interval = setInterval(update, 2000);
|
||||||
l2GetInterval = setInterval(getL2, 1000);
|
|
||||||
});;
|
});;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -285,3 +285,66 @@ function sendXHTTP(x)
|
|||||||
currentRequests.push(x);
|
currentRequests.push(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function walkL2(onDone)
|
||||||
|
{
|
||||||
|
var entries = [];
|
||||||
|
var idx = 0;
|
||||||
|
var tries = 0;
|
||||||
|
|
||||||
|
function retry() {
|
||||||
|
if (++tries < 3) {
|
||||||
|
setTimeout(page, 1000);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
onDone(entries, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
function page() {
|
||||||
|
var xhttp = new XMLHttpRequest();
|
||||||
|
xhttp.onreadystatechange = function() {
|
||||||
|
if (this.readyState != 4)
|
||||||
|
return;
|
||||||
|
if (this.status != 200) {
|
||||||
|
retry();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var s;
|
||||||
|
try {
|
||||||
|
s = JSON.parse(xhttp.responseText);
|
||||||
|
} catch (err) {
|
||||||
|
retry();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
tries = 0;
|
||||||
|
s = s.map(function(e) {
|
||||||
|
e.vlan = parseInt(e.vlan, 16);
|
||||||
|
e.idx = parseInt(e.idx, 16);
|
||||||
|
e.port = e.port == 9 ? 'CPU' : logToPhysPort[e.port];
|
||||||
|
return e;
|
||||||
|
});
|
||||||
|
if (!s.length) {
|
||||||
|
onDone(entries, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
entries.push(...s);
|
||||||
|
for (var i = entries.length - 1; i > 0; i--) {
|
||||||
|
if (entries[0].idx == entries[i].idx) {
|
||||||
|
onDone(entries, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (entries.length >= 4096) {
|
||||||
|
onDone(entries, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
idx = s[s.length - 1].idx + 1;
|
||||||
|
setTimeout(page, 1000);
|
||||||
|
};
|
||||||
|
xhttp.open("GET", "/l2.json?idx=" + idx, true);
|
||||||
|
xhttp.timeout = 1500;
|
||||||
|
sendXHTTP(xhttp);
|
||||||
|
}
|
||||||
|
|
||||||
|
page();
|
||||||
|
}
|
||||||
|
|||||||
+10
-1
@@ -664,7 +664,16 @@ void httpd_appcall(void)
|
|||||||
parse_short(q + 15);
|
parse_short(q + 15);
|
||||||
send_vlan(short_parsed);
|
send_vlan(short_parsed);
|
||||||
} else if (is_word(q, "/counters.json")) {
|
} else if (is_word(q, "/counters.json")) {
|
||||||
send_counters(q[20]-'0');
|
/* The port is one raw character of the request line and
|
||||||
|
* indexes a nine entry table, so bound it here instead
|
||||||
|
* of trusting the client to have sent a digit. Anything
|
||||||
|
* below '0' wraps well past eight, so the one test
|
||||||
|
* covers both ends. */
|
||||||
|
uint8_t cport = q[20] - '0';
|
||||||
|
if (cport > 8)
|
||||||
|
send_bad_request();
|
||||||
|
else
|
||||||
|
send_counters(cport);
|
||||||
} else if (is_word(q, "/eee.json")) {
|
} else if (is_word(q, "/eee.json")) {
|
||||||
send_eee();
|
send_eee();
|
||||||
} else if (is_word(q, "/bandwidth.json")) {
|
} else if (is_word(q, "/bandwidth.json")) {
|
||||||
|
|||||||
+28
-27
@@ -356,6 +356,7 @@ void send_l2(uint16_t idx)
|
|||||||
*/
|
*/
|
||||||
__xdata uint16_t entry = idx & 0xfff;
|
__xdata uint16_t entry = idx & 0xfff;
|
||||||
__xdata uint16_t first_entry = 0xffff; // An illegal entry index
|
__xdata uint16_t first_entry = 0xffff; // An illegal entry index
|
||||||
|
__bit first = true;
|
||||||
char_to_html('[');
|
char_to_html('[');
|
||||||
while (1) {
|
while (1) {
|
||||||
entries_left--;
|
entries_left--;
|
||||||
@@ -369,9 +370,22 @@ void send_l2(uint16_t idx)
|
|||||||
} while (sfr_data[3] & TBL_EXECUTE);
|
} while (sfr_data[3] & TBL_EXECUTE);
|
||||||
|
|
||||||
reg_read_m(RTL837x_L2_DATA_OUT_B);
|
reg_read_m(RTL837x_L2_DATA_OUT_B);
|
||||||
if ((sfr_data[0] & 0x20)) { // Check entry is valid
|
__bit valid = (sfr_data[0] & 0x20) != 0;
|
||||||
|
if (valid) {
|
||||||
|
/* separator + 74-byte worst-case entry + closing "]" */
|
||||||
|
if (slen + 76 > TCP_OUTBUF_SIZE)
|
||||||
|
break;
|
||||||
|
if (!first)
|
||||||
|
char_to_html(',');
|
||||||
|
first = false;
|
||||||
|
|
||||||
|
// VLAN, taken from the read above instead of reading the register twice
|
||||||
|
slen += strtox(outbuf + slen, "{\"vlan\":\"");
|
||||||
|
charhex_to_html(sfr_data[0] & 0x0f);
|
||||||
|
byte_to_html(sfr_data[1]);
|
||||||
|
|
||||||
// MAC
|
// MAC
|
||||||
slen += strtox(outbuf + slen, "{\"mac\":\"");
|
slen += strtox(outbuf + slen, "\",\"mac\":\"");
|
||||||
byte_to_html(sfr_data[2]); char_to_html(':');
|
byte_to_html(sfr_data[2]); char_to_html(':');
|
||||||
byte_to_html(sfr_data[3]); char_to_html(':');
|
byte_to_html(sfr_data[3]); char_to_html(':');
|
||||||
port = (sfr_data[0] >> 6) & 0x3;
|
port = (sfr_data[0] >> 6) & 0x3;
|
||||||
@@ -381,12 +395,6 @@ void send_l2(uint16_t idx)
|
|||||||
byte_to_html(sfr_data[2]); char_to_html(':');
|
byte_to_html(sfr_data[2]); char_to_html(':');
|
||||||
byte_to_html(sfr_data[3]);
|
byte_to_html(sfr_data[3]);
|
||||||
|
|
||||||
// VLAN
|
|
||||||
slen += strtox(outbuf + slen, "\",\"vlan\":\"");
|
|
||||||
reg_read_m(RTL837x_L2_DATA_OUT_B);
|
|
||||||
charhex_to_html(sfr_data[0] & 0x0f);
|
|
||||||
byte_to_html(sfr_data[1]);
|
|
||||||
|
|
||||||
// type
|
// type
|
||||||
reg_read_m(RTL837x_L2_DATA_OUT_C);
|
reg_read_m(RTL837x_L2_DATA_OUT_C);
|
||||||
if (sfr_data[2] & 0x1)
|
if (sfr_data[2] & 0x1)
|
||||||
@@ -396,32 +404,26 @@ void send_l2(uint16_t idx)
|
|||||||
|
|
||||||
port |= (sfr_data[3] & 0x3) << 2;
|
port |= (sfr_data[3] & 0x3) << 2;
|
||||||
itoa_html(port);
|
itoa_html(port);
|
||||||
|
}
|
||||||
|
|
||||||
// Index
|
// Index
|
||||||
reg_read_m(RTL837x_TBL_DATA_0);
|
reg_read_m(RTL837x_TBL_DATA_0);
|
||||||
entry = (((uint16_t)sfr_data[2] & 0x0f) << 8) | sfr_data[3];
|
entry = (((uint16_t)sfr_data[2] & 0x0f) << 8) | sfr_data[3];
|
||||||
|
if (valid) {
|
||||||
slen += strtox(outbuf + slen, ",\"idx\":\"");
|
slen += strtox(outbuf + slen, ",\"idx\":\"");
|
||||||
byte_to_html(entry >> 8);
|
byte_to_html(entry >> 8);
|
||||||
byte_to_html(entry);
|
byte_to_html(entry);
|
||||||
char_to_html('"');
|
char_to_html('"');
|
||||||
char_to_html('}');
|
char_to_html('}');
|
||||||
entry += 1; // We want the next entry following after the current entry
|
|
||||||
} else {
|
|
||||||
reg_read_m(RTL837x_TBL_DATA_0);
|
|
||||||
entry = (((uint16_t)sfr_data[2] & 0x0f) << 8) | sfr_data[3] + 1;
|
|
||||||
}
|
}
|
||||||
if (first_entry == 0xffff) {
|
entry += 1; // We want the next entry following after the current entry
|
||||||
char_to_html(',');
|
|
||||||
|
if (first_entry == 0xffff)
|
||||||
first_entry = entry;
|
first_entry = entry;
|
||||||
} else {
|
else if (first_entry == entry || !entries_left)
|
||||||
if (first_entry == entry || !entries_left) {
|
break;
|
||||||
char_to_html(']');
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
char_to_html(',');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
char_to_html(']');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -518,8 +520,7 @@ void send_lag(void)
|
|||||||
slen += strtox(outbuf + slen, "{\"lagNum\":");
|
slen += strtox(outbuf + slen, "{\"lagNum\":");
|
||||||
itoa_html(l);
|
itoa_html(l);
|
||||||
slen += strtox(outbuf + slen, ",\"members\":\"");
|
slen += strtox(outbuf + slen, ",\"members\":\"");
|
||||||
reg_read_m(RTL837X_TRK_MBR_CTRL_BASE + (l << 2));
|
uint16_t ports = port_lag_members_get(l);
|
||||||
uint16_t ports = ((uint16_t)sfr_data[2] << 8) | sfr_data[3];
|
|
||||||
for (uint8_t i = 0; i < 16; i++) {
|
for (uint8_t i = 0; i < 16; i++) {
|
||||||
bool_to_html(!!(ports & 0x8000));
|
bool_to_html(!!(ports & 0x8000));
|
||||||
ports <<= 1;
|
ports <<= 1;
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
#include "machine.h"
|
#include "machine.h"
|
||||||
|
|
||||||
extern __code struct machine machine;
|
extern __code struct machine machine;
|
||||||
|
extern __xdata uint8_t igmpEnabled;
|
||||||
|
|
||||||
#include "uip.h"
|
#include "uip.h"
|
||||||
|
|
||||||
@@ -85,6 +86,7 @@ void igmp_setup(void) __banked
|
|||||||
{
|
{
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
print_string("igmp_setup called\n");
|
print_string("igmp_setup called\n");
|
||||||
|
igmpEnabled = 0;
|
||||||
// For now, forward all unkown IP-MC pkts (2 bits per port. 00: flood via floodmask, 01: drop, 10: trap, 11: to rport)
|
// For now, forward all unkown IP-MC pkts (2 bits per port. 00: flood via floodmask, 01: drop, 10: trap, 11: to rport)
|
||||||
REG_SET(RTL837X_IPV4_PORT_MC_LM_ACT, LOOKUP_MISS_FLOOD);
|
REG_SET(RTL837X_IPV4_PORT_MC_LM_ACT, LOOKUP_MISS_FLOOD);
|
||||||
REG_SET(RTL837X_IPV6_PORT_MC_LM_ACT, LOOKUP_MISS_FLOOD);
|
REG_SET(RTL837X_IPV6_PORT_MC_LM_ACT, LOOKUP_MISS_FLOOD);
|
||||||
@@ -130,6 +132,7 @@ void igmp_setup(void) __banked
|
|||||||
void igmp_enable(void) __banked
|
void igmp_enable(void) __banked
|
||||||
{
|
{
|
||||||
print_string("igmp_enable called\n");
|
print_string("igmp_enable called\n");
|
||||||
|
igmpEnabled = 1;
|
||||||
// Configure trapping of unhandled IGMP protocol packets to CPU
|
// Configure trapping of unhandled IGMP protocol packets to CPU
|
||||||
REG_SET(RTL837X_IGMP_TRAP_CFG, IGMP_CPU_PORT | IGMP_TRAP_PRIORITY);
|
REG_SET(RTL837X_IGMP_TRAP_CFG, IGMP_CPU_PORT | IGMP_TRAP_PRIORITY);
|
||||||
|
|
||||||
|
|||||||
+24
-6
@@ -733,6 +733,19 @@ void port_rldp_on(__xdata uint16_t p_ms)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Reads the member port bitmask of a Link Aggregation Group.
|
||||||
|
* The groups have numbers 0-3; bit n is set when logical port n is a member.
|
||||||
|
* The bitmask reflects what the hardware holds, so it covers groups set up
|
||||||
|
* statically and groups a protocol brought up, without either having to say so.
|
||||||
|
*/
|
||||||
|
uint16_t port_lag_members_get(uint8_t lag) __banked
|
||||||
|
{
|
||||||
|
reg_read(RTL837X_TRK_MBR_CTRL_BASE + (lag << 2));
|
||||||
|
return ((uint16_t)SFR_DATA_8 << 8) | SFR_DATA_0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Configure LAGs
|
* Configure LAGs
|
||||||
* Sets the members via port bitmask of a given Link Aggregation Group
|
* Sets the members via port bitmask of a given Link Aggregation Group
|
||||||
@@ -744,11 +757,14 @@ void port_lag_members_set(__xdata uint8_t lag, __xdata uint16_t members) __banke
|
|||||||
{
|
{
|
||||||
print_string("port_lag_members_set, lag: "); print_byte(lag); print_string(", members: "); print_short(members);
|
print_string("port_lag_members_set, lag: "); print_byte(lag); print_string(", members: "); print_short(members);
|
||||||
write_char('\n');
|
write_char('\n');
|
||||||
if (lag > 3)
|
if (lag > 3) {
|
||||||
print_string("Link aggregation group must be 0-3!\n");
|
print_string("Link aggregation group out of range\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
reg_read_m(RTL837X_TRK_HASH_CTRL_BASE + (lag << 2));
|
reg_read_m(RTL837X_TRK_HASH_CTRL_BASE + (lag << 2));
|
||||||
if (!(sfr_data[0] | sfr_data [1] | sfr_data [2] | sfr_data [3]))
|
if (!(sfr_data[0] | sfr_data[1] | sfr_data[2])
|
||||||
REG_SET(RTL837X_TRK_HASH_CTRL_BASE, LAG_HASH_DEFAULT);
|
&& (sfr_data[3] == LAG_HASH_RESET || sfr_data[3] == 0))
|
||||||
|
REG_SET(RTL837X_TRK_HASH_CTRL_BASE + (lag << 2), LAG_HASH_DEFAULT);
|
||||||
REG_WRITE(RTL837X_TRK_MBR_CTRL_BASE + (lag << 2), 0, 0, members >> 8, members & 0xff);
|
REG_WRITE(RTL837X_TRK_MBR_CTRL_BASE + (lag << 2), 0, 0, members >> 8, members & 0xff);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -761,8 +777,10 @@ void port_lag_hash_set(__xdata uint8_t lag, __xdata uint8_t hash_bits) __banked
|
|||||||
{
|
{
|
||||||
print_string("port_lag_hash_set, lag: "); print_byte(lag); print_string(", hash: "); print_byte(hash_bits);
|
print_string("port_lag_hash_set, lag: "); print_byte(lag); print_string(", hash: "); print_byte(hash_bits);
|
||||||
write_char('\n');
|
write_char('\n');
|
||||||
if (lag > 3)
|
if (lag > 3) {
|
||||||
print_string("Link aggregation group must be 0-3!\n");
|
print_string("Link aggregation group out of range\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
REG_WRITE(RTL837X_TRK_HASH_CTRL_BASE + (lag << 2), 0, 0, 0, hash_bits);
|
REG_WRITE(RTL837X_TRK_HASH_CTRL_BASE + (lag << 2), 0, 0, 0, hash_bits);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ void port_mirror_set(register uint8_t port, __xdata uint16_t rx_pmask, __xdata u
|
|||||||
void port_mirror_del(void) __banked;
|
void port_mirror_del(void) __banked;
|
||||||
bool port_ingress_filter(__xdata uint8_t port, __xdata vlan_ingress_mode_t type) __banked;
|
bool port_ingress_filter(__xdata uint8_t port, __xdata vlan_ingress_mode_t type) __banked;
|
||||||
void port_l2_setup(void) __banked;
|
void port_l2_setup(void) __banked;
|
||||||
|
uint16_t port_lag_members_get(uint8_t lag) __banked;
|
||||||
void port_lag_members_set(__xdata uint8_t lag, __xdata uint16_t members) __banked;
|
void port_lag_members_set(__xdata uint8_t lag, __xdata uint16_t members) __banked;
|
||||||
void port_lag_hash_set(__xdata uint8_t lag, __xdata uint8_t hash) __banked;
|
void port_lag_hash_set(__xdata uint8_t lag, __xdata uint8_t hash) __banked;
|
||||||
void port_eee_enable_all(__xdata uint8_t speed) __banked;
|
void port_eee_enable_all(__xdata uint8_t speed) __banked;
|
||||||
|
|||||||
@@ -232,6 +232,8 @@
|
|||||||
#define LAG_HASH_L4_SPORT 0x20
|
#define LAG_HASH_L4_SPORT 0x20
|
||||||
#define LAG_HASH_L4_DPORT 0x40
|
#define LAG_HASH_L4_DPORT 0x40
|
||||||
#define LAG_HASH_DEFAULT (LAG_HASH_L2_SMAC | LAG_HASH_L2_DMAC | LAG_HASH_L3_SIP | LAG_HASH_L3_DIP | LAG_HASH_L4_SPORT | LAG_HASH_L4_DPORT)
|
#define LAG_HASH_DEFAULT (LAG_HASH_L2_SMAC | LAG_HASH_L2_DMAC | LAG_HASH_L3_SIP | LAG_HASH_L3_DIP | LAG_HASH_L4_SPORT | LAG_HASH_L4_DPORT)
|
||||||
|
#define LAG_HASH_RESET (LAG_HASH_SOURCE_PORT_NUMBER | LAG_HASH_L2_SMAC | LAG_HASH_L2_DMAC \
|
||||||
|
| LAG_HASH_L3_SIP | LAG_HASH_L3_DIP | LAG_HASH_L4_SPORT)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Port isolation
|
* Port isolation
|
||||||
|
|||||||
+2
-1
@@ -121,6 +121,7 @@ __xdata uint16_t management_vlan;
|
|||||||
__xdata uint8_t tx_seq;
|
__xdata uint8_t tx_seq;
|
||||||
|
|
||||||
__xdata uint8_t stpEnabled;
|
__xdata uint8_t stpEnabled;
|
||||||
|
__xdata uint8_t igmpEnabled;
|
||||||
__xdata char hostname[24]; /* device hostname, default set at boot, see rtl837x_common.h */
|
__xdata char hostname[24]; /* device hostname, default set at boot, see rtl837x_common.h */
|
||||||
|
|
||||||
__code uint16_t bit_mask[16] = {
|
__code uint16_t bit_mask[16] = {
|
||||||
@@ -1152,7 +1153,7 @@ void handle_rx(void)
|
|||||||
print_string("STP TX\n");
|
print_string("STP TX\n");
|
||||||
tcpip_output();
|
tcpip_output();
|
||||||
}
|
}
|
||||||
} else if (uip_buf[0] == 0x01 && uip_buf[1] == 0x00 && uip_buf[2] == 0x5e // IPv4-MC packet?
|
} else if (igmpEnabled && uip_buf[0] == 0x01 && uip_buf[1] == 0x00 && uip_buf[2] == 0x5e // IPv4-MC packet?
|
||||||
&& uip_buf[3] == 0x00 && uip_buf[4] == 0x00 && uip_buf[5] == 0x16) {
|
&& uip_buf[3] == 0x00 && uip_buf[4] == 0x00 && uip_buf[5] == 0x16) {
|
||||||
igmp_packet_handler();
|
igmp_packet_handler();
|
||||||
if (uip_len) {
|
if (uip_len) {
|
||||||
|
|||||||
Reference in New Issue
Block a user