Skip to content

Commit

Permalink
Feature: NICs and their configurations (Windows Only)
Browse files Browse the repository at this point in the history
When collecting HW informations about NICs it's also very usefull to know their current configurations.

Here a quick example based on my "Windows support: net" jaypipes#157
  • Loading branch information
Riccardo Re committed Feb 7, 2020
1 parent 4feedd0 commit 21c230a
Show file tree
Hide file tree
Showing 2 changed files with 92 additions and 6 deletions.
16 changes: 12 additions & 4 deletions net.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,25 @@ import (
"fmt"
)

type NICConfiguration struct {
DHCPenabled bool `json:"dhcp_enabled"`
Gateway string `json:"gateway"`
IPv4 string `json:"ipv4"`
IPv6 string `json:"ipv6"`
}

type NICCapability struct {
Name string `json:"name"`
IsEnabled bool `json:"is_enabled"`
CanEnable bool `json:"can_enable"`
}

type NIC struct {
Name string `json:"name"`
MacAddress string `json:"mac_address"`
IsVirtual bool `json:"is_virtual"`
Capabilities []*NICCapability `json:"capabilities"`
Name string `json:"name"`
MacAddress string `json:"mac_address"`
IsVirtual bool `json:"is_virtual"`
Capabilities []*NICCapability `json:"capabilities"`
Configurations []*NICConfiguration `json:"configurations"`
// TODO(jaypipes): Add PCI field for accessing PCI device information
// PCI *PCIDevice `json:"pci"`
}
Expand Down
82 changes: 80 additions & 2 deletions net_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,18 +26,61 @@ type win32NetworkAdapter struct {
ServiceName string
}

const wqlNetworkAdapterCnofiguration = "SELECT Caption, Description, DefaultIPGateway, DHCPEnabled, Index, InterfaceIndex, IPAddress FROM Win32_NetworkAdapterConfiguration"

type win32NetworkAdapterConfiguration struct {
Caption string
Description string
DefaultIPGateway []string
DHCPEnabled bool
Index uint32
InterfaceIndex uint32
IPAddress []string
}

const wqlIP4RouteTable = "SELECT Caption, Description, Destination, Information, InterfaceIndex, Mask, Metric1, Metric2, Metric3, Metric4, Metric5, Name, NextHop, Protocol, Status, Type FROM Win32_IP4RouteTable"

type win32IP4RouteTable struct {
Caption string
Description string
Destination string
Information string
InterfaceIndex int32
Mask string
Metric1 int32
Metric2 int32
Metric3 int32
Metric4 int32
Metric5 int32
Name string
NextHop string
Protocol uint32
Status string
Type uint32
}

func (ctx *context) netFillInfo(info *NetworkInfo) error {
// Getting info from WMI
var win32NetDescriptions []win32NetworkAdapter
if err := wmi.Query(wqlNetworkAdapter, &win32NetDescriptions); err != nil {
return err
}

info.NICs = ctx.nics(win32NetDescriptions)
var win32NetConfigurationDescriptions []win32NetworkAdapterConfiguration
if err := wmi.Query(wqlNetworkAdapterCnofiguration, &win32NetConfigurationDescriptions); err != nil {
return err
}

var win32IP4RouteTableDescriptions []win32IP4RouteTable
if err := wmi.Query(wqlIP4RouteTable, &win32IP4RouteTableDescriptions); err != nil {
return err
}

info.NICs = ctx.nics(win32NetDescriptions, win32NetConfigurationDescriptions, win32IP4RouteTableDescriptions)
return nil
}

func (ctx *context) nics(win32NetDescriptions []win32NetworkAdapter) []*NIC {
func (ctx *context) nics(win32NetDescriptions []win32NetworkAdapter, win32NetConfigurationDescriptions []win32NetworkAdapterConfiguration, win32IP4RouteTableDescriptions []win32IP4RouteTable) []*NIC {
// Converting into standard structures
nics := make([]*NIC, 0)
for _, nicDescription := range win32NetDescriptions {
Expand All @@ -47,6 +90,29 @@ func (ctx *context) nics(win32NetDescriptions []win32NetworkAdapter) []*NIC {
IsVirtual: false,
Capabilities: []*NICCapability{},
}
// Building NIC configurations
for _, configDescription := range win32NetConfigurationDescriptions {
// Looking for configurations
if nicDescription.InterfaceIndex == configDescription.InterfaceIndex {
ipv4, ipv6 := ctx.netConfigIP(configDescription.IPAddress)
var configuration = &NICConfiguration{
DHCPenabled: configDescription.DHCPEnabled,
IPv4: ipv4,
IPv6: ipv6,
}
// Looking for gateway
for _, routeDescription := range win32IP4RouteTableDescriptions {
if nicDescription.InterfaceIndex == uint32(routeDescription.InterfaceIndex) {
if routeDescription.Destination == "0.0.0.0" && routeDescription.Mask == "0.0.0.0" {
configuration.Gateway = routeDescription.NextHop
break
}
}
}
// Appending configuration to NIC configurations
nic.Configurations = append(nic.Configurations, configuration)
}
}
// Appenging NIC to NICs
nics = append(nics, nic)
}
Expand All @@ -63,3 +129,15 @@ func (ctx *context) netDeviceName(description win32NetworkAdapter) string {
}
return name
}

func (ctx *context) netConfigIP(IPs []string) (string, string) {
var IPv4 string
var IPv6 string
if len(IPs) > 0 {
IPv4 = IPs[0]
}
if len(IPs) > 1 {
IPv6 = IPs[1]
}
return IPv4, IPv6
}

0 comments on commit 21c230a

Please sign in to comment.