mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2026-03-20 03:39:54 +00:00
Compare commits
8 Commits
main
...
staging-fo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
07223eec2b | ||
|
|
e2a36d1a4e | ||
|
|
e4bbbb1ee5 | ||
|
|
0cefc067b7 | ||
|
|
213335c44d | ||
|
|
222b17415c | ||
|
|
a01b9ac0f4 | ||
|
|
a00dbfa6e4 |
@@ -112,6 +112,35 @@ function get_bridge_interfaces(bridge){
|
||||
return dir;
|
||||
}
|
||||
|
||||
function get_bridge_pvid(ifname) {
|
||||
let f = fs.popen(`bridge -j vlan show dev ${ifname} 2>/dev/null`);
|
||||
if (!f) return null;
|
||||
let data = json(f.read("all"));
|
||||
f.close();
|
||||
if (!data) return null;
|
||||
for (let entry in data)
|
||||
for (let v in entry?.vlans)
|
||||
if (v?.flags && index(v.flags, "PVID") >= 0)
|
||||
return v.vlan;
|
||||
return null;
|
||||
}
|
||||
|
||||
function strict_fwd_update_fdb(hapd, address) {
|
||||
if (!+hapd?.config?.strict_forwarding)
|
||||
return;
|
||||
let pvid = get_bridge_pvid(hapd.ifname);
|
||||
if (pvid)
|
||||
system(`bridge fdb replace ${address} dev ${hapd.ifname} master static vlan ${pvid}`);
|
||||
}
|
||||
|
||||
function strict_fwd_delete_fdb(hapd, address) {
|
||||
if (!+hapd?.config?.strict_forwarding)
|
||||
return;
|
||||
let pvid = get_bridge_pvid(hapd.ifname);
|
||||
if (pvid)
|
||||
system(`bridge fdb del ${address} dev ${hapd.ifname} master vlan ${pvid} 2>/dev/null`);
|
||||
}
|
||||
|
||||
function event(object, verb, payload) {
|
||||
let type = object;
|
||||
if (verb)
|
||||
@@ -226,6 +255,8 @@ handlers = {
|
||||
msg.defaults = hapd.ssid;
|
||||
ubus.call('ratelimit', 'client_set', msg);
|
||||
}
|
||||
|
||||
strict_fwd_update_fdb(hapd, notify.data.address);
|
||||
},
|
||||
|
||||
'channel-switch' : function(notify, hapd) {
|
||||
@@ -240,6 +271,7 @@ handlers = {
|
||||
};
|
||||
ubus.call('ratelimit', 'client_delete', msg);
|
||||
}
|
||||
strict_fwd_delete_fdb(hapd, notify.data.address);
|
||||
},
|
||||
|
||||
'key-mismatch': function(notify, hapd) {
|
||||
|
||||
@@ -23,7 +23,6 @@ function move_to_json(src, dst) {
|
||||
msg[fs.basename(dst)] = lines;
|
||||
fd.write(msg);
|
||||
fd.close();
|
||||
print(lines);
|
||||
}
|
||||
|
||||
move_to_json('/sys/fs/pstore/dmesg-ramoops-0', '/tmp/crashlog');
|
||||
|
||||
@@ -392,48 +392,59 @@ void process_packet(unsigned char *user, const struct pcap_pkthdr *header,
|
||||
new_ip->tot_len = htons(ntohs(ip->tot_len) + opt82_len);
|
||||
new_udp->len = htons(ntohs(udp->len) + opt82_len);
|
||||
|
||||
// Recalculate IP checksum
|
||||
// Reset checksum to 0 before recalculating
|
||||
new_ip->check = 0;
|
||||
unsigned int sum = 0;
|
||||
unsigned short *ip_ptr = (unsigned short *)new_ip;
|
||||
for (int i = 0; i < ip->ihl * 2; i++)
|
||||
{
|
||||
sum += *ip_ptr++;
|
||||
}
|
||||
while (sum >> 16)
|
||||
{
|
||||
sum = (sum & 0xFFFF) + (sum >> 16);
|
||||
}
|
||||
new_ip->check = ~sum;
|
||||
|
||||
// Recalculate UDP checksum
|
||||
// Calculate checksum
|
||||
uint32_t sum = 0;
|
||||
uint16_t *ptr = (uint16_t *)new_ip;
|
||||
int len = new_ip->ihl * 4;
|
||||
|
||||
for (int i = 0; i < len / 2; i++) {
|
||||
sum += ntohs(ptr[i]);
|
||||
}
|
||||
|
||||
// Fold 32-bit sum into 16 bits
|
||||
while (sum >> 16)
|
||||
sum = (sum & 0xFFFF) + (sum >> 16);
|
||||
|
||||
new_ip->check = htons((uint16_t)~sum);
|
||||
|
||||
// Reset checksum to 0 before recalculating
|
||||
new_udp->check = 0;
|
||||
sum = 0;
|
||||
// Pseudo-header
|
||||
sum +=
|
||||
(ntohs(new_ip->saddr) & 0xFFFF) + (ntohs(new_ip->saddr >> 16) & 0xFFFF);
|
||||
sum +=
|
||||
(ntohs(new_ip->daddr) & 0xFFFF) + (ntohs(new_ip->daddr >> 16) & 0xFFFF);
|
||||
sum += htons(IPPROTO_UDP);
|
||||
sum += new_udp->len;
|
||||
|
||||
// UDP header and data
|
||||
unsigned char *udp_start = (unsigned char *)new_udp;
|
||||
int udp_total_len = ntohs(new_udp->len);
|
||||
unsigned short *udp_ptr = (unsigned short *)udp_start;
|
||||
for (int i = 0; i < udp_total_len / 2; i++)
|
||||
{
|
||||
sum += *udp_ptr++;
|
||||
// Build pseudo-header and compute checksum
|
||||
sum = 0;
|
||||
uint16_t udp_len = ntohs(new_udp->len);
|
||||
|
||||
uint32_t saddr = ntohl(new_ip->saddr);
|
||||
uint32_t daddr = ntohl(new_ip->daddr);
|
||||
sum += (saddr >> 16) & 0xFFFF;
|
||||
sum += saddr & 0xFFFF;
|
||||
sum += (daddr >> 16) & 0xFFFF;
|
||||
sum += daddr & 0xFFFF;
|
||||
sum += IPPROTO_UDP;
|
||||
sum += udp_len;
|
||||
|
||||
// Sum the UDP header + payload
|
||||
ptr = (uint16_t *)new_udp;
|
||||
int i;
|
||||
for (i = 0; i < udp_len / 2; i++) {
|
||||
sum += ntohs(ptr[i]);
|
||||
}
|
||||
if (udp_total_len % 2)
|
||||
{
|
||||
sum += *(unsigned char *)udp_ptr;
|
||||
|
||||
// If odd length, pad last byte
|
||||
if (udp_len & 1) {
|
||||
sum += ((uint8_t *)new_udp)[udp_len - 1] << 8;
|
||||
}
|
||||
|
||||
// Fold 32-bit sum into 16 bits
|
||||
while (sum >> 16)
|
||||
{
|
||||
sum = (sum & 0xFFFF) + (sum >> 16);
|
||||
}
|
||||
new_udp->check = ~sum;
|
||||
|
||||
new_udp->check = htons((uint16_t)~sum);
|
||||
|
||||
// UDP allows 0xFFFF instead of 0x0000 (0 means "no checksum")
|
||||
if (new_udp->check == 0)
|
||||
new_udp->check = 0xFFFF;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user