5
0
mirror of https://github.com/cwinfo/yggdrasil-go.git synced 2024-11-26 06:01:37 +00:00

Merge pull request #122 from Arceliar/addressPrefix

Address prefix change
This commit is contained in:
Neil Alexander 2018-06-14 14:37:22 +01:00 committed by GitHub
commit 36f80cb12c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 21 additions and 21 deletions

View File

@ -7,9 +7,10 @@ type address [16]byte
type subnet [8]byte type subnet [8]byte
// address_prefix is the prefix used for all addresses and subnets in the network. // address_prefix is the prefix used for all addresses and subnets in the network.
// The current implementation requires this to be a multiple of 8 bits. // The current implementation requires this to be a muliple of 8 bits + 7 bits.
// The 8th bit of the last byte is used to signal nodes (0) or /64 prefixes (1).
// Nodes that configure this differently will be unable to communicate with eachother, though routing and the DHT machinery *should* still work. // Nodes that configure this differently will be unable to communicate with eachother, though routing and the DHT machinery *should* still work.
var address_prefix = [...]byte{0xfd} var address_prefix = [...]byte{0x02}
// isValid returns true if an address falls within the range used by nodes in the network. // isValid returns true if an address falls within the range used by nodes in the network.
func (a *address) isValid() bool { func (a *address) isValid() bool {
@ -18,24 +19,24 @@ func (a *address) isValid() bool {
return false return false
} }
} }
return (*a)[len(address_prefix)]&0x80 == 0 return true
} }
// isValid returns true if a prefix falls within the range usable by the network. // isValid returns true if a prefix falls within the range usable by the network.
func (s *subnet) isValid() bool { func (s *subnet) isValid() bool {
for idx := range address_prefix { l := len(address_prefix)
for idx := range address_prefix[:l-1] {
if (*s)[idx] != address_prefix[idx] { if (*s)[idx] != address_prefix[idx] {
return false return false
} }
} }
return (*s)[len(address_prefix)]&0x80 != 0 return (*s)[l-1] == address_prefix[l-1]|0x01
} }
// address_addrForNodeID takes a *NodeID as an argument and returns an *address. // address_addrForNodeID takes a *NodeID as an argument and returns an *address.
// This address begins with the address prefix. // This subnet begins with the address prefix, with the last bit set to 0 to indicate an address.
// The next bit is 0 for an address, and 1 for a subnet. // The following 8 bits are set to the number of leading 1 bits in the NodeID.
// The following 7 bits are set to the number of leading 1 bits in the NodeID. // The NodeID, excluding the leading 1 bits and the first leading 0 bit, is truncated to the appropriate length and makes up the remainder of the address.
// The NodeID, excluding the leading 1 bits and the first leading 1 bit, is truncated to the appropriate length and makes up the remainder of the address.
func address_addrForNodeID(nid *NodeID) *address { func address_addrForNodeID(nid *NodeID) *address {
// 128 bit address // 128 bit address
// Begins with prefix // Begins with prefix
@ -67,16 +68,15 @@ func address_addrForNodeID(nid *NodeID) *address {
} }
} }
copy(addr[:], address_prefix[:]) copy(addr[:], address_prefix[:])
addr[len(address_prefix)] = ones & 0x7f addr[len(address_prefix)] = ones
copy(addr[len(address_prefix)+1:], temp) copy(addr[len(address_prefix)+1:], temp)
return &addr return &addr
} }
// address_subnetForNodeID takes a *NodeID as an argument and returns a *subnet. // address_subnetForNodeID takes a *NodeID as an argument and returns a *subnet.
// This subnet begins with the address prefix. // This subnet begins with the address prefix, with the last bit set to 1 to indicate a prefix.
// The next bit is 0 for an address, and 1 for a subnet. // The following 8 bits are set to the number of leading 1 bits in the NodeID.
// The following 7 bits are set to the number of leading 1 bits in the NodeID. // The NodeID, excluding the leading 1 bits and the first leading 0 bit, is truncated to the appropriate length and makes up the remainder of the subnet.
// The NodeID, excluding the leading 1 bits and the first leading 1 bit, is truncated to the appropriate length and makes up the remainder of the subnet.
func address_subnetForNodeID(nid *NodeID) *subnet { func address_subnetForNodeID(nid *NodeID) *subnet {
// Exactly as the address version, with two exceptions: // Exactly as the address version, with two exceptions:
// 1) The first bit after the fixed prefix is a 1 instead of a 0 // 1) The first bit after the fixed prefix is a 1 instead of a 0
@ -84,7 +84,7 @@ func address_subnetForNodeID(nid *NodeID) *subnet {
addr := *address_addrForNodeID(nid) addr := *address_addrForNodeID(nid)
var snet subnet var snet subnet
copy(snet[:], addr[:]) copy(snet[:], addr[:])
snet[len(address_prefix)] |= 0x80 snet[len(address_prefix)-1] |= 0x01
return &snet return &snet
} }
@ -97,7 +97,7 @@ func (a *address) getNodeIDandMask() (*NodeID, *NodeID) {
// This means truncated leading 1s, first leading 0, and visible part of addr // This means truncated leading 1s, first leading 0, and visible part of addr
var nid NodeID var nid NodeID
var mask NodeID var mask NodeID
ones := int(a[len(address_prefix)] & 0x7f) ones := int(a[len(address_prefix)])
for idx := 0; idx < ones; idx++ { for idx := 0; idx < ones; idx++ {
nid[idx/8] |= 0x80 >> byte(idx%8) nid[idx/8] |= 0x80 >> byte(idx%8)
} }
@ -125,7 +125,7 @@ func (s *subnet) getNodeIDandMask() (*NodeID, *NodeID) {
// As with the address version, but visible parts of the subnet prefix instead // As with the address version, but visible parts of the subnet prefix instead
var nid NodeID var nid NodeID
var mask NodeID var mask NodeID
ones := int(s[len(address_prefix)] & 0x7f) ones := int(s[len(address_prefix)])
for idx := 0; idx < ones; idx++ { for idx := 0; idx < ones; idx++ {
nid[idx/8] |= 0x80 >> byte(idx%8) nid[idx/8] |= 0x80 >> byte(idx%8)
} }

View File

@ -406,7 +406,7 @@ func (a *admin) startTunWithMTU(ifname string, iftapmode bool, ifmtu int) error
_ = a.core.tun.close() _ = a.core.tun.close()
// Then reconfigure and start it // Then reconfigure and start it
addr := a.core.router.addr addr := a.core.router.addr
straddr := fmt.Sprintf("%s/%v", net.IP(addr[:]).String(), 8*len(address_prefix)) straddr := fmt.Sprintf("%s/%v", net.IP(addr[:]).String(), 8*len(address_prefix)-1)
if ifname != "none" { if ifname != "none" {
err := a.core.tun.setup(ifname, iftapmode, straddr, ifmtu) err := a.core.tun.setup(ifname, iftapmode, straddr, ifmtu)
if err != nil { if err != nil {

View File

@ -117,7 +117,7 @@ func (c *Core) Start(nc *config.NodeConfig, log *log.Logger) error {
} }
ip := net.IP(c.router.addr[:]).String() ip := net.IP(c.router.addr[:]).String()
if err := c.tun.start(nc.IfName, nc.IfTAPMode, fmt.Sprintf("%s/8", ip), nc.IfMTU); err != nil { if err := c.tun.start(nc.IfName, nc.IfTAPMode, fmt.Sprintf("%s/%d", ip, 8*len(address_prefix)-1), nc.IfMTU); err != nil {
c.log.Println("Failed to start TUN/TAP") c.log.Println("Failed to start TUN/TAP")
return err return err
} }

View File

@ -252,7 +252,7 @@ func (i *icmpv6) handle_ndp(in []byte) ([]byte, error) {
case source.isValid(): case source.isValid():
case snet.isValid(): case snet.isValid():
default: default:
return nil, errors.New("Not an NDP for fd00::/8") return nil, errors.New("Not an NDP for 0200::/7")
} }
// Create our NDP message body response // Create our NDP message body response

View File

@ -87,7 +87,7 @@ func (tun *tunDevice) setupAddress(addr string) error {
ar.ifra_prefixmask.sin6_len = uint8(unsafe.Sizeof(ar.ifra_prefixmask)) ar.ifra_prefixmask.sin6_len = uint8(unsafe.Sizeof(ar.ifra_prefixmask))
b := make([]byte, 16) b := make([]byte, 16)
binary.LittleEndian.PutUint16(b, uint16(0xFF00)) binary.LittleEndian.PutUint16(b, uint16(0xFE00))
ar.ifra_prefixmask.sin6_addr[0] = uint16(binary.BigEndian.Uint16(b)) ar.ifra_prefixmask.sin6_addr[0] = uint16(binary.BigEndian.Uint16(b))
ar.ifra_addr.sin6_len = uint8(unsafe.Sizeof(ar.ifra_addr)) ar.ifra_addr.sin6_len = uint8(unsafe.Sizeof(ar.ifra_addr))