5
0
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:
Neil Alexander 2018-11-10 18:33:52 +00:00
parent adc32fe92f
commit 6fab0e9507
No known key found for this signature in database
GPG Key ID: A02A2019A2BB0944
2 changed files with 18 additions and 3 deletions

View File

@ -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

View File

@ -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 {