mirror of
https://github.com/yggdrasil-network/yggdrasil-go.git
synced 2025-04-28 06:05: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
|
||||
}
|
||||
|
||||
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 {
|
||||
ifra_name [syscall.IFNAMSIZ]byte
|
||||
ifra_addr sockaddr_in6
|
||||
|
@ -71,7 +80,7 @@ func (tun *TunAdapter) setupAddress(addr string) error {
|
|||
var sfd int
|
||||
var err error
|
||||
|
||||
ip, _, err := net.ParseCIDR(addr)
|
||||
ip, prefix, err := net.ParseCIDR(addr)
|
||||
if err != nil {
|
||||
tun.log.Errorf("Error in ParseCIDR: %v", err)
|
||||
return err
|
||||
|
@ -91,12 +100,11 @@ func (tun *TunAdapter) setupAddress(addr string) error {
|
|||
// Create the address request
|
||||
var ar in6_aliasreq
|
||||
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 {
|
||||
sa6.sin6_addr[i] = addr[i]
|
||||
}
|
||||
ar.ifra_addr.setSockaddr(ip)
|
||||
|
||||
prefixmask := net.CIDRMask(prefix.Mask.Size())
|
||||
ar.ifra_prefixmask.setSockaddr(prefixmask)
|
||||
|
||||
// Set the interface address
|
||||
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