mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-08-30 14:52:51 +08:00
Merge pull request #152 from mmmspatz/mspatz/fix_vlan_page
Fix "Get Configuration" on vlan.html
This commit is contained in:
+5
-3
@@ -33,8 +33,8 @@ An entry is deleted by adding an invalid entry (00 instead of 0x02 in
|
|||||||
RTL837x_TBL_DATA_IN_A).
|
RTL837x_TBL_DATA_IN_A).
|
||||||
|
|
||||||
A port is assigned a PVID by setting the PVID-bits of the corresponding
|
A port is assigned a PVID by setting the PVID-bits of the corresponding
|
||||||
register of the port. 2 ports share a register. One port uses the higher
|
register of the port. 2 ports share a register. An odd port uses bits [23:12],
|
||||||
16 bits, the other (even ports) use the lower. The base register is
|
an even port uses bits [11:0]. The base register is
|
||||||
RTL837x_PVID_BASE_REG (0x4e1c) and the registers go to 0x4e2c so that also
|
RTL837x_PVID_BASE_REG (0x4e1c) and the registers go to 0x4e2c so that also
|
||||||
the CPU-Port may have a PVID.
|
the CPU-Port may have a PVID.
|
||||||
|
|
||||||
@@ -51,7 +51,9 @@ registers 0x1238, 0x1338, ...
|
|||||||
The code currently provides the following functions:
|
The code currently provides the following functions:
|
||||||
```
|
```
|
||||||
void port_pvid_set(uint8_t port, __xdata uint16_t pvid) __banked;
|
void port_pvid_set(uint8_t port, __xdata uint16_t pvid) __banked;
|
||||||
void vlan_create(uint16_t vlan, uint16_t members, uint16_t tagged) __banked;
|
uint16_t port_pvid_get(uint8_t port) __banked;
|
||||||
|
void vlan_create(void) __banked; // reads from global vlan_settings
|
||||||
|
int8_t vlan_get(register uint16_t vlan) __banked; // returns data in sfr_data
|
||||||
void vlan_delete(uint16_t vlan) __banked;
|
void vlan_delete(uint16_t vlan) __banked;
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|||||||
+1
-1
@@ -12,7 +12,7 @@
|
|||||||
<form id="vform" action="/vlan.html">
|
<form id="vform" action="/vlan.html">
|
||||||
<div>
|
<div>
|
||||||
<label for="vid">VLAN ID:</label>
|
<label for="vid">VLAN ID:</label>
|
||||||
<input type="number" min="1" max="2047" id="vid" name="vid">
|
<input type="number" min="1" max="4094" id="vid" name="vid">
|
||||||
<button type="button" style="margin: 0 0 0 24px" onclick="fetchVLAN();">Get Configuration</button>
|
<button type="button" style="margin: 0 0 0 24px" onclick="fetchVLAN();">Get Configuration</button>
|
||||||
</div>
|
</div>
|
||||||
<br/><br/>
|
<br/><br/>
|
||||||
|
|||||||
+9
-8
@@ -38,11 +38,6 @@ function vlanForm() {
|
|||||||
|
|
||||||
function setC(t, p, c){
|
function setC(t, p, c){
|
||||||
document.getElementById(t+'port'+p).checked=c;
|
document.getElementById(t+'port'+p).checked=c;
|
||||||
// When a tagged port is checked, automatically select the PVID port as well
|
|
||||||
const tportElem = document.getElementById('tport'+p);
|
|
||||||
if (tportElem && tportElem.checked) {
|
|
||||||
document.getElementById('pport'+p).checked=true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function utClicked(t){
|
function utClicked(t){
|
||||||
@@ -65,10 +60,16 @@ function fetchVLAN() {
|
|||||||
console.log("VLAN: ", JSON.stringify(s));
|
console.log("VLAN: ", JSON.stringify(s));
|
||||||
m = parseInt(s.members, 16);
|
m = parseInt(s.members, 16);
|
||||||
document.getElementById('vname').value = s.name;
|
document.getElementById('vname').value = s.name;
|
||||||
|
var members = m & 0x3FF;
|
||||||
|
var untag = (m >> 10) & 0x3FF;
|
||||||
|
var pvid = parseInt(s.pvid, 16);
|
||||||
for (let i = 1; i <= numPorts; i++) {
|
for (let i = 1; i <= numPorts; i++) {
|
||||||
setC('t', i, (m>>(10+i-1))&1);
|
var bit = i - 1;
|
||||||
setC('u', i, (m>>(i-1))&1);
|
var isMember = (members >> bit) & 1;
|
||||||
setC('p', i, (m>>(20+i-1))&1);
|
var isUntag = (untag >> bit) & 1;
|
||||||
|
setC('t', i, isMember && !isUntag);
|
||||||
|
setC('u', i, isMember && isUntag);
|
||||||
|
setC('p', i, (pvid >> bit) & 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -270,6 +270,14 @@ void send_vlan(uint16_t vlan)
|
|||||||
while(vlan_names[n] && vlan_names[n] != ' ')
|
while(vlan_names[n] && vlan_names[n] != ' ')
|
||||||
char_to_html(vlan_names[n++]);
|
char_to_html(vlan_names[n++]);
|
||||||
}
|
}
|
||||||
|
slen += strtox(outbuf + slen, "\",\"pvid\":\"0x");
|
||||||
|
uint16_t pvid_mask = 0;
|
||||||
|
for (uint8_t i = machine.min_port; i <= machine.max_port; i++) {
|
||||||
|
if (port_pvid_get(i) == vlan)
|
||||||
|
pvid_mask |= (1 << i);
|
||||||
|
}
|
||||||
|
byte_to_html(pvid_mask >> 8);
|
||||||
|
byte_to_html(pvid_mask);
|
||||||
slen += strtox(outbuf + slen, "\"}");
|
slen += strtox(outbuf + slen, "\"}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+12
-1
@@ -78,6 +78,17 @@ void port_pvid_set(uint8_t port, __xdata uint16_t pvid) __banked
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t port_pvid_get(uint8_t port) __banked
|
||||||
|
{
|
||||||
|
uint16_t reg = RTL837x_PVID_BASE_REG + ((port >> 1) << 2);
|
||||||
|
reg_read_m(reg);
|
||||||
|
if (port & 0x1) {
|
||||||
|
return (sfr_data[1] << 4) | (sfr_data[2] >> 4);
|
||||||
|
} else {
|
||||||
|
return ((sfr_data[2] & 0x0f) << 8) | sfr_data[3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void vlan_delete(uint16_t vlan) __banked
|
void vlan_delete(uint16_t vlan) __banked
|
||||||
{
|
{
|
||||||
@@ -93,7 +104,7 @@ void vlan_delete(uint16_t vlan) __banked
|
|||||||
*/
|
*/
|
||||||
int8_t vlan_get(register uint16_t vlan) __banked
|
int8_t vlan_get(register uint16_t vlan) __banked
|
||||||
{
|
{
|
||||||
if (vlan >= 0x3ff) // VLAN 4095 is special
|
if (vlan >= 0xfff) // VLAN 4095 is special
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
REG_WRITE(RTL837X_TBL_CTRL, vlan >> 8, vlan, TBL_VLAN, TBL_EXECUTE);
|
REG_WRITE(RTL837X_TBL_CTRL, vlan >> 8, vlan, TBL_VLAN, TBL_EXECUTE);
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ int8_t vlan_get(register uint16_t vlan) __banked;
|
|||||||
__xdata uint16_t vlan_name(register uint16_t vlan) __banked;
|
__xdata uint16_t vlan_name(register uint16_t vlan) __banked;
|
||||||
void vlan_setup(void) __banked;
|
void vlan_setup(void) __banked;
|
||||||
void port_pvid_set(uint8_t port, __xdata uint16_t pvid) __banked;
|
void port_pvid_set(uint8_t port, __xdata uint16_t pvid) __banked;
|
||||||
|
uint16_t port_pvid_get(uint8_t port) __banked;
|
||||||
void vlan_create(void) __banked;
|
void vlan_create(void) __banked;
|
||||||
void vlan_delete(uint16_t vlan) __banked;
|
void vlan_delete(uint16_t vlan) __banked;
|
||||||
void port_mirror_set(register uint8_t port, __xdata uint16_t rx_pmask, __xdata uint16_t tx_pmask) __banked;
|
void port_mirror_set(register uint8_t port, __xdata uint16_t rx_pmask, __xdata uint16_t tx_pmask) __banked;
|
||||||
|
|||||||
Reference in New Issue
Block a user