mirror of
				https://github.com/prometheus/node_exporter.git
				synced 2025-08-20 18:33:52 -07:00 
			
		
		
		
	
		
			
				
	
	
		
			233 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			233 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package wifi
 | |
| 
 | |
| import (
 | |
| 	"errors"
 | |
| 	"fmt"
 | |
| 	"net"
 | |
| 	"time"
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	// errInvalidIE is returned when one or more IEs are malformed.
 | |
| 	errInvalidIE = errors.New("invalid 802.11 information element")
 | |
| )
 | |
| 
 | |
| // An InterfaceType is the operating mode of an Interface.
 | |
| type InterfaceType int
 | |
| 
 | |
| const (
 | |
| 	// InterfaceTypeUnspecified indicates that an interface's type is unspecified
 | |
| 	// and the driver determines its function.
 | |
| 	InterfaceTypeUnspecified InterfaceType = iota
 | |
| 
 | |
| 	// InterfaceTypeAdHoc indicates that an interface is part of an independent
 | |
| 	// basic service set (BSS) of client devices without a controlling access
 | |
| 	// point.
 | |
| 	InterfaceTypeAdHoc
 | |
| 
 | |
| 	// InterfaceTypeStation indicates that an interface is part of a managed
 | |
| 	// basic service set (BSS) of client devices with a controlling access point.
 | |
| 	InterfaceTypeStation
 | |
| 
 | |
| 	// InterfaceTypeAP indicates that an interface is an access point.
 | |
| 	InterfaceTypeAP
 | |
| 
 | |
| 	// InterfaceTypeAPVLAN indicates that an interface is a VLAN interface
 | |
| 	// associated with an access point.
 | |
| 	InterfaceTypeAPVLAN
 | |
| 
 | |
| 	// InterfaceTypeWDS indicates that an interface is a wireless distribution
 | |
| 	// interface, used as part of a network of multiple access points.
 | |
| 	InterfaceTypeWDS
 | |
| 
 | |
| 	// InterfaceTypeMonitor indicates that an interface is a monitor interface,
 | |
| 	// receiving all frames from all clients in a given network.
 | |
| 	InterfaceTypeMonitor
 | |
| 
 | |
| 	// InterfaceTypeMeshPoint indicates that an interface is part of a wireless
 | |
| 	// mesh network.
 | |
| 	InterfaceTypeMeshPoint
 | |
| 
 | |
| 	// InterfaceTypeP2PClient indicates that an interface is a client within
 | |
| 	// a peer-to-peer network.
 | |
| 	InterfaceTypeP2PClient
 | |
| 
 | |
| 	// InterfaceTypeP2PGroupOwner indicates that an interface is the group
 | |
| 	// owner within a peer-to-peer network.
 | |
| 	InterfaceTypeP2PGroupOwner
 | |
| 
 | |
| 	// InterfaceTypeP2PDevice indicates that an interface is a device within
 | |
| 	// a peer-to-peer client network.
 | |
| 	InterfaceTypeP2PDevice
 | |
| 
 | |
| 	// InterfaceTypeOCB indicates that an interface is outside the context
 | |
| 	// of a basic service set (BSS).
 | |
| 	InterfaceTypeOCB
 | |
| 
 | |
| 	// InterfaceTypeNAN indicates that an interface is part of a near-me
 | |
| 	// area network (NAN).
 | |
| 	InterfaceTypeNAN
 | |
| )
 | |
| 
 | |
| // An Interface is a WiFi network interface.
 | |
| type Interface struct {
 | |
| 	// The index of the interface.
 | |
| 	Index int
 | |
| 
 | |
| 	// The name of the interface.
 | |
| 	Name string
 | |
| 
 | |
| 	// The hardware address of the interface.
 | |
| 	HardwareAddr net.HardwareAddr
 | |
| 
 | |
| 	// The physical device that this interface belongs to.
 | |
| 	PHY int
 | |
| 
 | |
| 	// The virtual device number of this interface within a PHY.
 | |
| 	Device int
 | |
| 
 | |
| 	// The operating mode of the interface.
 | |
| 	Type InterfaceType
 | |
| 
 | |
| 	// The interface's wireless frequency in MHz.
 | |
| 	Frequency int
 | |
| }
 | |
| 
 | |
| // StationInfo contains statistics about a WiFi interface operating in
 | |
| // station mode.
 | |
| type StationInfo struct {
 | |
| 	// The time since the station last connected.
 | |
| 	Connected time.Duration
 | |
| 
 | |
| 	// The time since wireless activity last occurred.
 | |
| 	Inactive time.Duration
 | |
| 
 | |
| 	// The number of bytes received by this station.
 | |
| 	ReceivedBytes int
 | |
| 
 | |
| 	// The number of bytes transmitted by this station.
 | |
| 	TransmittedBytes int
 | |
| 
 | |
| 	// The number of packets received by this station.
 | |
| 	ReceivedPackets int
 | |
| 
 | |
| 	// The number of packets transmitted by this station.
 | |
| 	TransmittedPackets int
 | |
| 
 | |
| 	// The current data receive bitrate, in bits/second.
 | |
| 	ReceiveBitrate int
 | |
| 
 | |
| 	// The current data transmit bitrate, in bits/second.
 | |
| 	TransmitBitrate int
 | |
| 
 | |
| 	// The signal strength of this station's connection, in dBm.
 | |
| 	Signal int
 | |
| 
 | |
| 	// The number of times the station has had to retry while sending a packet.
 | |
| 	TransmitRetries int
 | |
| 
 | |
| 	// The number of times a packet transmission failed.
 | |
| 	TransmitFailed int
 | |
| 
 | |
| 	// The number of times a beacon loss was detected.
 | |
| 	BeaconLoss int
 | |
| }
 | |
| 
 | |
| // A BSS is an 802.11 basic service set.  It contains information about a wireless
 | |
| // network associated with an Interface.
 | |
| type BSS struct {
 | |
| 	// The service set identifier, or "network name" of the BSS.
 | |
| 	SSID string
 | |
| 
 | |
| 	// The BSS service set identifier.  In infrastructure mode, this is the
 | |
| 	// hardware address of the wireless access point that a client is associated
 | |
| 	// with.
 | |
| 	BSSID net.HardwareAddr
 | |
| 
 | |
| 	// The frequency used by the BSS, in MHz.
 | |
| 	Frequency int
 | |
| 
 | |
| 	// The interval between beacon transmissions for this BSS.
 | |
| 	BeaconInterval time.Duration
 | |
| 
 | |
| 	// The time since the client last scanned this BSS's information.
 | |
| 	LastSeen time.Duration
 | |
| 
 | |
| 	// The status of the client within the BSS.
 | |
| 	Status BSSStatus
 | |
| }
 | |
| 
 | |
| // A BSSStatus indicates the current status of client within a BSS.
 | |
| type BSSStatus int
 | |
| 
 | |
| const (
 | |
| 	// BSSStatusAuthenticated indicates that a client is authenticated with a BSS.
 | |
| 	BSSStatusAuthenticated BSSStatus = iota
 | |
| 
 | |
| 	// BSSStatusAssociated indicates that a client is associated with a BSS.
 | |
| 	BSSStatusAssociated
 | |
| 
 | |
| 	// BSSStatusIBSSJoined indicates that a client has joined an independent BSS.
 | |
| 	BSSStatusIBSSJoined
 | |
| )
 | |
| 
 | |
| // String returns the string representation of a BSSStatus.
 | |
| func (s BSSStatus) String() string {
 | |
| 	switch s {
 | |
| 	case BSSStatusAuthenticated:
 | |
| 		return "authenticated"
 | |
| 	case BSSStatusAssociated:
 | |
| 		return "associated"
 | |
| 	case BSSStatusIBSSJoined:
 | |
| 		return "IBSS joined"
 | |
| 	default:
 | |
| 		return fmt.Sprintf("unknown(%d)", s)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // List of 802.11 Information Element types.
 | |
| const (
 | |
| 	ieSSID = 0
 | |
| )
 | |
| 
 | |
| // An ie is an 802.11 information element.
 | |
| type ie struct {
 | |
| 	ID uint8
 | |
| 	// Length field implied by length of data
 | |
| 	Data []byte
 | |
| }
 | |
| 
 | |
| // parseIEs parses zero or more ies from a byte slice.
 | |
| // Reference:
 | |
| //   https://www.safaribooksonline.com/library/view/80211-wireless-networks/0596100523/ch04.html#wireless802dot112-CHP-4-FIG-31
 | |
| func parseIEs(b []byte) ([]ie, error) {
 | |
| 	var ies []ie
 | |
| 	var i int
 | |
| 	for {
 | |
| 		if len(b[i:]) == 0 {
 | |
| 			break
 | |
| 		}
 | |
| 		if len(b[i:]) < 2 {
 | |
| 			return nil, errInvalidIE
 | |
| 		}
 | |
| 
 | |
| 		id := b[i]
 | |
| 		i++
 | |
| 		l := int(b[i])
 | |
| 		i++
 | |
| 
 | |
| 		if len(b[i:]) < l {
 | |
| 			return nil, errInvalidIE
 | |
| 		}
 | |
| 
 | |
| 		ies = append(ies, ie{
 | |
| 			ID:   id,
 | |
| 			Data: b[i : i+l],
 | |
| 		})
 | |
| 
 | |
| 		i += l
 | |
| 	}
 | |
| 
 | |
| 	return ies, nil
 | |
| }
 |