mirror of
https://github.com/cwinfo/yggdrasil-go.git
synced 2024-11-22 15:20:30 +00:00
Fix CKR (IPv4/IPv6) in TAP mode so frames sent to node MAC, base MAC/LL from node IPv6 address
This commit is contained in:
parent
adc32fe92f
commit
6fab0e9507
@ -67,8 +67,8 @@ func (i *icmpv6) init(t *tunDevice) {
|
|||||||
i.mylladdr = net.IP{
|
i.mylladdr = net.IP{
|
||||||
0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFE}
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFE}
|
||||||
copy(i.mymac[1:], i.tun.core.boxPub[:])
|
copy(i.mymac[:], i.tun.core.router.addr[:])
|
||||||
copy(i.mylladdr[9:], i.tun.core.boxPub[:])
|
copy(i.mylladdr[9:], i.tun.core.router.addr[1:])
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parses an incoming ICMPv6 packet. The packet provided may be either an
|
// Parses an incoming ICMPv6 packet. The packet provided may be either an
|
||||||
|
@ -3,6 +3,7 @@ package yggdrasil
|
|||||||
// This manages the tun driver to send/recv packets to/from applications
|
// This manages the tun driver to send/recv packets to/from applications
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"time"
|
"time"
|
||||||
"yggdrasil/defaults"
|
"yggdrasil/defaults"
|
||||||
@ -110,6 +111,13 @@ func (tun *tunDevice) write() error {
|
|||||||
}
|
}
|
||||||
var peermac macAddress
|
var peermac macAddress
|
||||||
var peerknown bool
|
var peerknown bool
|
||||||
|
if data[0]&0xf0 == 0x40 {
|
||||||
|
destAddr = tun.core.router.addr
|
||||||
|
} else if data[0]&0xf0 == 0x60 {
|
||||||
|
if !bytes.Equal(tun.core.router.addr[:16], destAddr[:16]) && !bytes.Equal(tun.core.router.subnet[:8], destAddr[:8]) {
|
||||||
|
destAddr = tun.core.router.addr
|
||||||
|
}
|
||||||
|
}
|
||||||
if neighbor, ok := tun.icmpv6.peermacs[destAddr]; ok && neighbor.learned {
|
if neighbor, ok := tun.icmpv6.peermacs[destAddr]; ok && neighbor.learned {
|
||||||
peermac = neighbor.mac
|
peermac = neighbor.mac
|
||||||
peerknown = true
|
peerknown = true
|
||||||
@ -121,12 +129,19 @@ func (tun *tunDevice) write() error {
|
|||||||
sendndp(tun.core.router.addr)
|
sendndp(tun.core.router.addr)
|
||||||
}
|
}
|
||||||
if peerknown {
|
if peerknown {
|
||||||
|
var proto ethernet.Ethertype
|
||||||
|
switch {
|
||||||
|
case data[0]&0xf0 == 0x60:
|
||||||
|
proto = ethernet.IPv6
|
||||||
|
case data[0]&0xf0 == 0x40:
|
||||||
|
proto = ethernet.IPv4
|
||||||
|
}
|
||||||
var frame ethernet.Frame
|
var frame ethernet.Frame
|
||||||
frame.Prepare(
|
frame.Prepare(
|
||||||
peermac[:6], // Destination MAC address
|
peermac[:6], // Destination MAC address
|
||||||
tun.icmpv6.mymac[:6], // Source MAC address
|
tun.icmpv6.mymac[:6], // Source MAC address
|
||||||
ethernet.NotTagged, // VLAN tagging
|
ethernet.NotTagged, // VLAN tagging
|
||||||
ethernet.IPv6, // Ethertype
|
proto, // Ethertype
|
||||||
len(data)) // Payload length
|
len(data)) // Payload length
|
||||||
copy(frame[tun_ETHER_HEADER_LENGTH:], data[:])
|
copy(frame[tun_ETHER_HEADER_LENGTH:], data[:])
|
||||||
if _, err := tun.iface.Write(frame); err != nil {
|
if _, err := tun.iface.Write(frame); err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user