mirror of
https://github.com/yggdrasil-network/yggdrasil-go.git
synced 2025-04-28 14:15:06 +03:00
tun: OpenBSD: set the prefix mask as well
An ioctl request to set an address without gateway address or prefix mask is rather unproductive. Reuse code my moving it into a helper function; again the net package does all the parsing for us.
This commit is contained in:
parent
b5016d7f97
commit
94ed9445df
1 changed files with 14 additions and 6 deletions
|
@ -35,6 +35,15 @@ type sockaddr_in6 struct {
|
||||||
sin6_scope_id uint32
|
sin6_scope_id uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (sa6 *sockaddr_in6) setSockaddr(addr [/*16*/]byte /* net.IP or net.IPMask */) {
|
||||||
|
sa6.sin6_len = uint8(unsafe.Sizeof(*sa6))
|
||||||
|
sa6.sin6_family = unix.AF_INET6
|
||||||
|
|
||||||
|
for i := range sa6.sin6_addr {
|
||||||
|
sa6.sin6_addr[i] = addr[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type in6_aliasreq struct {
|
type in6_aliasreq struct {
|
||||||
ifra_name [syscall.IFNAMSIZ]byte
|
ifra_name [syscall.IFNAMSIZ]byte
|
||||||
ifra_addr sockaddr_in6
|
ifra_addr sockaddr_in6
|
||||||
|
@ -71,7 +80,7 @@ func (tun *TunAdapter) setupAddress(addr string) error {
|
||||||
var sfd int
|
var sfd int
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
ip, _, err := net.ParseCIDR(addr)
|
ip, prefix, err := net.ParseCIDR(addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
tun.log.Errorf("Error in ParseCIDR: %v", err)
|
tun.log.Errorf("Error in ParseCIDR: %v", err)
|
||||||
return err
|
return err
|
||||||
|
@ -91,12 +100,11 @@ func (tun *TunAdapter) setupAddress(addr string) error {
|
||||||
// Create the address request
|
// Create the address request
|
||||||
var ar in6_aliasreq
|
var ar in6_aliasreq
|
||||||
copy(ar.ifra_name[:], tun.Name())
|
copy(ar.ifra_name[:], tun.Name())
|
||||||
ar.ifra_addr.sin6_len = uint8(unsafe.Sizeof(ar.ifra_addr))
|
|
||||||
ar.ifra_addr.sin6_family = unix.AF_INET6
|
|
||||||
|
|
||||||
for i := range in6_aliasreq.sin6_addr {
|
ar.ifra_addr.setSockaddr(ip)
|
||||||
sa6.sin6_addr[i] = addr[i]
|
|
||||||
}
|
prefixmask := net.CIDRMask(prefix.Mask.Size())
|
||||||
|
ar.ifra_prefixmask.setSockaddr(prefixmask)
|
||||||
|
|
||||||
// Set the interface address
|
// Set the interface address
|
||||||
if _, _, errno := unix.Syscall(unix.SYS_IOCTL, uintptr(sfd), uintptr(SIOCAIFADDR_IN6), uintptr(unsafe.Pointer(&ar))); errno != 0 {
|
if _, _, errno := unix.Syscall(unix.SYS_IOCTL, uintptr(sfd), uintptr(SIOCAIFADDR_IN6), uintptr(unsafe.Pointer(&ar))); errno != 0 {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue