gitee.com/ks-custle/core-gm@v0.0.0-20230922171213-b83bdd97b62c/net/route/sys_dragonfly.go (about)

     1  // Copyright 2016 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package route
     6  
     7  import (
     8  	"syscall"
     9  	"unsafe"
    10  )
    11  
    12  func (typ RIBType) parseable() bool { return true }
    13  
    14  // RouteMetrics represents route metrics.
    15  type RouteMetrics struct {
    16  	PathMTU int // path maximum transmission unit
    17  }
    18  
    19  // SysType implements the SysType method of Sys interface.
    20  func (rmx *RouteMetrics) SysType() SysType { return SysMetrics }
    21  
    22  // Sys implements the Sys method of Message interface.
    23  func (m *RouteMessage) Sys() []Sys {
    24  	return []Sys{
    25  		&RouteMetrics{
    26  			PathMTU: int(nativeEndian.Uint64(m.raw[m.extOff+8 : m.extOff+16])),
    27  		},
    28  	}
    29  }
    30  
    31  // InterfaceMetrics represents interface metrics.
    32  type InterfaceMetrics struct {
    33  	Type int // interface type
    34  	MTU  int // maximum transmission unit
    35  }
    36  
    37  // SysType implements the SysType method of Sys interface.
    38  func (imx *InterfaceMetrics) SysType() SysType { return SysMetrics }
    39  
    40  // Sys implements the Sys method of Message interface.
    41  func (m *InterfaceMessage) Sys() []Sys {
    42  	return []Sys{
    43  		&InterfaceMetrics{
    44  			Type: int(m.raw[m.extOff]),
    45  			MTU:  int(nativeEndian.Uint32(m.raw[m.extOff+8 : m.extOff+12])),
    46  		},
    47  	}
    48  }
    49  
    50  func probeRoutingStack() (int, map[int]*wireFormat) {
    51  	var p uintptr
    52  	rtm := &wireFormat{extOff: 40, bodyOff: sizeofRtMsghdrDragonFlyBSD4}
    53  	rtm.parse = rtm.parseRouteMessage
    54  	ifm := &wireFormat{extOff: 16, bodyOff: sizeofIfMsghdrDragonFlyBSD4}
    55  	ifm.parse = ifm.parseInterfaceMessage
    56  	ifam := &wireFormat{extOff: sizeofIfaMsghdrDragonFlyBSD4, bodyOff: sizeofIfaMsghdrDragonFlyBSD4}
    57  	ifam.parse = ifam.parseInterfaceAddrMessage
    58  	ifmam := &wireFormat{extOff: sizeofIfmaMsghdrDragonFlyBSD4, bodyOff: sizeofIfmaMsghdrDragonFlyBSD4}
    59  	ifmam.parse = ifmam.parseInterfaceMulticastAddrMessage
    60  	ifanm := &wireFormat{extOff: sizeofIfAnnouncemsghdrDragonFlyBSD4, bodyOff: sizeofIfAnnouncemsghdrDragonFlyBSD4}
    61  	ifanm.parse = ifanm.parseInterfaceAnnounceMessage
    62  
    63  	rel, _ := syscall.SysctlUint32("kern.osreldate")
    64  	if rel >= 500705 {
    65  		// https://github.com/DragonFlyBSD/DragonFlyBSD/commit/43a373152df2d405c9940983e584e6a25e76632d
    66  		// but only the size of struct ifa_msghdr actually changed
    67  		rtmVersion = 7
    68  		ifam.bodyOff = sizeofIfaMsghdrDragonFlyBSD58
    69  	}
    70  
    71  	return int(unsafe.Sizeof(p)), map[int]*wireFormat{
    72  		sysRTM_ADD:        rtm,
    73  		sysRTM_DELETE:     rtm,
    74  		sysRTM_CHANGE:     rtm,
    75  		sysRTM_GET:        rtm,
    76  		sysRTM_LOSING:     rtm,
    77  		sysRTM_REDIRECT:   rtm,
    78  		sysRTM_MISS:       rtm,
    79  		sysRTM_LOCK:       rtm,
    80  		sysRTM_RESOLVE:    rtm,
    81  		sysRTM_NEWADDR:    ifam,
    82  		sysRTM_DELADDR:    ifam,
    83  		sysRTM_IFINFO:     ifm,
    84  		sysRTM_NEWMADDR:   ifmam,
    85  		sysRTM_DELMADDR:   ifmam,
    86  		sysRTM_IFANNOUNCE: ifanm,
    87  	}
    88  }