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,
},
UsbNetworkConfig: &network.UsbNetworkConfig{
IPv4Addr: "172.16.55.1",
IPv4Addr: "172.16.55.1/24",
IPv4Network: "172.16.55.0/24",
},
DefaultLogLevel: "INFO",
@ -183,6 +183,10 @@ func LoadConfig() {
loadedConfig.NetworkConfig = defaultConfig.NetworkConfig
}
if loadedConfig.UsbNetworkConfig == nil {
loadedConfig.UsbNetworkConfig = defaultConfig.UsbNetworkConfig
}
config = &loadedConfig
logging.GetRootLogger().UpdateLogLevel(config.DefaultLogLevel)

View File

@ -53,7 +53,7 @@ type NetworkConfig 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"`
}

View File

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

View File

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

View File

@ -1,5 +1,9 @@
package usbgadget
const (
usbEthernetDevice = "usb0"
)
// Ethernet Control Model (ECM)
var ethernetEcmConfig = gadgetConfigItem{
order: 4000,
@ -43,3 +47,14 @@ var ethernetRndisConfig = gadgetConfigItem{
"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,
)
err := initUsbEthernet(gadget)
if err != nil {
usbLogger.Err(err).Msg("Failed to initialize USB Ethernet")
}
go func() {
for {
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
}