Initialize USB ethernet

This commit is contained in:
Daniel Lorch 2025-05-15 03:03:21 +02:00
parent 0317cccd7b
commit 91766550cd
7 changed files with 64 additions and 4 deletions

View File

@ -133,7 +133,7 @@ var defaultConfig = &Config{
NatEnable: false, NatEnable: false,
}, },
UsbNetworkConfig: &network.UsbNetworkConfig{ UsbNetworkConfig: &network.UsbNetworkConfig{
IPv4Addr: "172.16.55.1", IPv4Addr: "172.16.55.1/24",
IPv4Network: "172.16.55.0/24", IPv4Network: "172.16.55.0/24",
}, },
DefaultLogLevel: "INFO", DefaultLogLevel: "INFO",
@ -183,6 +183,10 @@ func LoadConfig() {
loadedConfig.NetworkConfig = defaultConfig.NetworkConfig loadedConfig.NetworkConfig = defaultConfig.NetworkConfig
} }
if loadedConfig.UsbNetworkConfig == nil {
loadedConfig.UsbNetworkConfig = defaultConfig.UsbNetworkConfig
}
config = &loadedConfig config = &loadedConfig
logging.GetRootLogger().UpdateLogLevel(config.DefaultLogLevel) logging.GetRootLogger().UpdateLogLevel(config.DefaultLogLevel)

View File

@ -53,7 +53,7 @@ type NetworkConfig struct {
} }
type UsbNetworkConfig struct { type UsbNetworkConfig struct {
IPv4Addr string `json:"ipv4_addr,omitempty" validate_type:"ipv4" default:"172.16.55.1" required:"true"` IPv4Addr string `json:"ipv4_addr,omitempty" validate_type:"ipv4" default:"172.16.55.1/24" required:"true"`
IPv4Network string `json:"ipv4_network,omitempty" validate_type:"ipv4" default:"172.16.55.0/24" required:"true"` IPv4Network string `json:"ipv4_network,omitempty" validate_type:"ipv4" default:"172.16.55.0/24" required:"true"`
} }

View File

@ -10,6 +10,10 @@ const (
procIpv4ForwardPath = "/proc/sys/net/ipv4/ip_forward" procIpv4ForwardPath = "/proc/sys/net/ipv4/ip_forward"
) )
func (s *NetworkInterfaceState) UsbNetworkConfig() *UsbNetworkConfig {
return s.usbNetConfig
}
func (s *NetworkInterfaceState) reconfigureNat(wantNat bool, sourceAddr string) error { func (s *NetworkInterfaceState) reconfigureNat(wantNat bool, sourceAddr string) error {
scopedLogger := s.l.With().Str("iface", s.interfaceName).Logger() scopedLogger := s.l.With().Str("iface", s.interfaceName).Logger()

View File

@ -27,6 +27,7 @@ type NetworkInterfaceState struct {
stateLock sync.Mutex stateLock sync.Mutex
config *NetworkConfig config *NetworkConfig
usbNetConfig *UsbNetworkConfig
dhcpClient *udhcpc.DHCPClient dhcpClient *udhcpc.DHCPClient
defaultHostname string defaultHostname string
@ -85,6 +86,7 @@ func NewNetworkInterfaceState(opts *NetworkInterfaceOptions) (*NetworkInterfaceS
}, },
cbConfigChange: opts.OnConfigChange, cbConfigChange: opts.OnConfigChange,
config: opts.NetworkConfig, config: opts.NetworkConfig,
usbNetConfig: opts.UsbNetworkConfig,
} }
// create the dhcp client // create the dhcp client

View File

@ -1,5 +1,9 @@
package usbgadget package usbgadget
const (
usbEthernetDevice = "usb0"
)
// Ethernet Control Model (ECM) // Ethernet Control Model (ECM)
var ethernetEcmConfig = gadgetConfigItem{ var ethernetEcmConfig = gadgetConfigItem{
order: 4000, order: 4000,
@ -43,3 +47,14 @@ var ethernetRndisConfig = gadgetConfigItem{
"dev_addr": "", // MAC address of JetKVM (randomly select) "dev_addr": "", // MAC address of JetKVM (randomly select)
}, },
} }
func (u *UsbGadget) UsbEthernetEnabled() bool {
return u.isGadgetConfigItemEnabled("ecm") ||
u.isGadgetConfigItemEnabled("eem") ||
u.isGadgetConfigItemEnabled("ncm") ||
u.isGadgetConfigItemEnabled("rndis")
}
func (u *UsbGadget) UsbEthernetDevice() string {
return usbEthernetDevice
}

5
usb.go
View File

@ -18,6 +18,11 @@ func initUsbGadget() {
usbLogger, usbLogger,
) )
err := initUsbEthernet(gadget)
if err != nil {
usbLogger.Err(err).Msg("Failed to initialize USB Ethernet")
}
go func() { go func() {
for { for {
checkUSBState() checkUSBState()

30
usb_ethernet.go Normal file
View File

@ -0,0 +1,30 @@
package kvm
import (
"fmt"
"os/exec"
"github.com/jetkvm/kvm/internal/usbgadget"
)
func initUsbEthernet(gadget *usbgadget.UsbGadget) error {
if !gadget.UsbEthernetEnabled() {
return nil
}
iface := gadget.UsbEthernetDevice()
ipv4addr := networkState.UsbNetworkConfig().IPv4Addr
scopedLogger := usbLogger.With().Str("iface", iface).Str("ipv4addr", ipv4addr).Logger()
scopedLogger.Info().Msg("enabling USB Ethernet")
if err := exec.Command("ip", "addr", "add", ipv4addr, "dev", iface).Run(); err != nil {
return fmt.Errorf("failed to flush table nat: %w", err)
}
if err := exec.Command("ip", "link", "set", "dev", iface, "up").Run(); err != nil {
return fmt.Errorf("failed to flush table nat: %w", err)
}
return nil
}