Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
224 changes: 126 additions & 98 deletions constants_linux.go
Original file line number Diff line number Diff line change
@@ -1,129 +1,149 @@
package ipvs

import "golang.org/x/sys/unix"

const (
genlCtrlID = 0x10
genlCtrlID = unix.GENL_ID_CTRL
)

// GENL control commands
// Generic netlink controller constants.
// See https://github.com/torvalds/linux/blob/v7.2/include/uapi/linux/genetlink.h#L36-L53
const (
genlCtrlCmdUnspec uint8 = iota
genlCtrlCmdNewFamily
genlCtrlCmdDelFamily
genlCtrlCmdGetFamily
genlCtrlCmdUnspec = unix.CTRL_CMD_UNSPEC
genlCtrlCmdNewFamily = unix.CTRL_CMD_NEWFAMILY
genlCtrlCmdDelFamily = unix.CTRL_CMD_DELFAMILY
genlCtrlCmdGetFamily = unix.CTRL_CMD_GETFAMILY
)

// GENL family attributes
// Generic netlink family attributes.
// See https://github.com/torvalds/linux/blob/v7.2/include/uapi/linux/genetlink.h#L57-L70
const (
genlCtrlAttrUnspec int = iota
genlCtrlAttrFamilyID
genlCtrlAttrFamilyName
genlCtrlAttrUnspec = unix.CTRL_ATTR_UNSPEC
genlCtrlAttrFamilyID = unix.CTRL_ATTR_FAMILY_ID
genlCtrlAttrFamilyName = unix.CTRL_ATTR_FAMILY_NAME
)

// IPVS genl commands
// IPVS generic netlink commands.
// See https://github.com/torvalds/linux/blob/v7.2/include/uapi/linux/ip_vs.h#L301-L329
type ipvsCmd uint8

const (
ipvsCmdUnspec uint8 = iota
ipvsCmdNewService
ipvsCmdSetService
ipvsCmdDelService
ipvsCmdGetService
ipvsCmdNewDest
ipvsCmdSetDest
ipvsCmdDelDest
ipvsCmdGetDest
ipvsCmdNewDaemon
ipvsCmdDelDaemon
ipvsCmdGetDaemon
ipvsCmdSetConfig
ipvsCmdGetConfig
ipvsCmdSetInfo
ipvsCmdGetInfo
ipvsCmdZero
ipvsCmdFlush
ipvsCmdUnspec ipvsCmd = 0 // IPVS_CMD_UNSPEC
ipvsCmdNewService ipvsCmd = 1 // IPVS_CMD_NEW_SERVICE
ipvsCmdSetService ipvsCmd = 2 // IPVS_CMD_SET_SERVICE
ipvsCmdDelService ipvsCmd = 3 // IPVS_CMD_DEL_SERVICE
ipvsCmdGetService ipvsCmd = 4 // IPVS_CMD_GET_SERVICE
ipvsCmdNewDest ipvsCmd = 5 // IPVS_CMD_NEW_DEST
ipvsCmdSetDest ipvsCmd = 6 // IPVS_CMD_SET_DEST
ipvsCmdDelDest ipvsCmd = 7 // IPVS_CMD_DEL_DEST
ipvsCmdGetDest ipvsCmd = 8 // IPVS_CMD_GET_DEST
ipvsCmdNewDaemon ipvsCmd = 9 // IPVS_CMD_NEW_DAEMON
ipvsCmdDelDaemon ipvsCmd = 10 // IPVS_CMD_DEL_DAEMON
ipvsCmdGetDaemon ipvsCmd = 11 // IPVS_CMD_GET_DAEMON
ipvsCmdSetConfig ipvsCmd = 12 // IPVS_CMD_SET_CONFIG
ipvsCmdGetConfig ipvsCmd = 13 // IPVS_CMD_GET_CONFIG
ipvsCmdSetInfo ipvsCmd = 14 // IPVS_CMD_SET_INFO
ipvsCmdGetInfo ipvsCmd = 15 // IPVS_CMD_GET_INFO
ipvsCmdZero ipvsCmd = 16 // IPVS_CMD_ZERO
ipvsCmdFlush ipvsCmd = 17 // IPVS_CMD_FLUSH
)

// Attributes used in the first level of commands
// IPVS generic netlink command attributes.
// See https://github.com/torvalds/linux/blob/v7.2/include/uapi/linux/ip_vs.h#L333-L343
type ipvsCmdAttr int

const (
ipvsCmdAttrUnspec int = iota
ipvsCmdAttrService
ipvsCmdAttrDest
ipvsCmdAttrDaemon
ipvsCmdAttrTimeoutTCP
ipvsCmdAttrTimeoutTCPFin
ipvsCmdAttrTimeoutUDP
ipvsCmdAttrUnspec ipvsCmdAttr = 0 // IPVS_CMD_ATTR_UNSPEC
ipvsCmdAttrService ipvsCmdAttr = 1 // IPVS_CMD_ATTR_SERVICE
ipvsCmdAttrDest ipvsCmdAttr = 2 // IPVS_CMD_ATTR_DEST
ipvsCmdAttrDaemon ipvsCmdAttr = 3 // IPVS_CMD_ATTR_DAEMON
ipvsCmdAttrTimeoutTCP ipvsCmdAttr = 4 // IPVS_CMD_ATTR_TIMEOUT_TCP
ipvsCmdAttrTimeoutTCPFin ipvsCmdAttr = 5 // IPVS_CMD_ATTR_TIMEOUT_TCP_FIN
ipvsCmdAttrTimeoutUDP ipvsCmdAttr = 6 // IPVS_CMD_ATTR_TIMEOUT_UDP
)

// Attributes used to describe a service. Used inside nested attribute
// ipvsCmdAttrService
// IPVS service attributes, nested in IPVS_CMD_ATTR_SERVICE.
// See https://github.com/torvalds/linux/blob/v7.2/include/uapi/linux/ip_vs.h#L347-L372
type ipvsSvcAttr int

const (
ipvsSvcAttrUnspec int = iota
ipvsSvcAttrAddressFamily
ipvsSvcAttrProtocol
ipvsSvcAttrAddress
ipvsSvcAttrPort
ipvsSvcAttrFWMark
ipvsSvcAttrSchedName
ipvsSvcAttrFlags
ipvsSvcAttrTimeout
ipvsSvcAttrNetmask
ipvsSvcAttrStats
ipvsSvcAttrPEName
ipvsSvcAttrUnspec ipvsSvcAttr = 0 // IPVS_SVC_ATTR_UNSPEC
ipvsSvcAttrAddressFamily ipvsSvcAttr = 1 // IPVS_SVC_ATTR_AF
ipvsSvcAttrProtocol ipvsSvcAttr = 2 // IPVS_SVC_ATTR_PROTOCOL
ipvsSvcAttrAddress ipvsSvcAttr = 3 // IPVS_SVC_ATTR_ADDR
ipvsSvcAttrPort ipvsSvcAttr = 4 // IPVS_SVC_ATTR_PORT
ipvsSvcAttrFWMark ipvsSvcAttr = 5 // IPVS_SVC_ATTR_FWMARK
ipvsSvcAttrSchedName ipvsSvcAttr = 6 // IPVS_SVC_ATTR_SCHED_NAME
ipvsSvcAttrFlags ipvsSvcAttr = 7 // IPVS_SVC_ATTR_FLAGS
ipvsSvcAttrTimeout ipvsSvcAttr = 8 // IPVS_SVC_ATTR_TIMEOUT
ipvsSvcAttrNetmask ipvsSvcAttr = 9 // IPVS_SVC_ATTR_NETMASK
ipvsSvcAttrStats ipvsSvcAttr = 10 // IPVS_SVC_ATTR_STATS
ipvsSvcAttrPEName ipvsSvcAttr = 11 // IPVS_SVC_ATTR_PE_NAME
Comment on lines +80 to +81

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yup; back-filling missing ones is on my list for a follow-up. This PR is just cleaning up the current definitions and correlating them with the upstream (Linux kernel)

)

// Attributes used to describe a destination (real server). Used
// inside nested attribute ipvsCmdAttrDest.
// IPVS destination attributes, nested in IPVS_CMD_ATTR_DEST.
// See https://github.com/torvalds/linux/blob/v7.2/include/uapi/linux/ip_vs.h#L376-L409
type ipvsDestAttr int

const (
ipvsDestAttrUnspec int = iota
ipvsDestAttrAddress
ipvsDestAttrPort
ipvsDestAttrForwardingMethod
ipvsDestAttrWeight
ipvsDestAttrUpperThreshold
ipvsDestAttrLowerThreshold
ipvsDestAttrActiveConnections
ipvsDestAttrInactiveConnections
ipvsDestAttrPersistentConnections
ipvsDestAttrStats
ipvsDestAttrAddressFamily
ipvsDestAttrUnspec ipvsDestAttr = 0 // IPVS_DEST_ATTR_UNSPEC
ipvsDestAttrAddress ipvsDestAttr = 1 // IPVS_DEST_ATTR_ADDR
ipvsDestAttrPort ipvsDestAttr = 2 // IPVS_DEST_ATTR_PORT
ipvsDestAttrForwardingMethod ipvsDestAttr = 3 // IPVS_DEST_ATTR_FWD_METHOD
ipvsDestAttrWeight ipvsDestAttr = 4 // IPVS_DEST_ATTR_WEIGHT
ipvsDestAttrUpperThreshold ipvsDestAttr = 5 // IPVS_DEST_ATTR_U_THRESH
ipvsDestAttrLowerThreshold ipvsDestAttr = 6 // IPVS_DEST_ATTR_L_THRESH
ipvsDestAttrActiveConnections ipvsDestAttr = 7 // IPVS_DEST_ATTR_ACTIVE_CONNS
ipvsDestAttrInactiveConnections ipvsDestAttr = 8 // IPVS_DEST_ATTR_INACT_CONNS
ipvsDestAttrPersistentConnections ipvsDestAttr = 9 // IPVS_DEST_ATTR_PERSIST_CONNS
ipvsDestAttrStats ipvsDestAttr = 10 // IPVS_DEST_ATTR_STATS
ipvsDestAttrAddressFamily ipvsDestAttr = 11 // IPVS_DEST_ATTR_ADDR_FAMILY
)

// IPVS Statistics constants
// IPVS statistics attributes.
// See https://github.com/torvalds/linux/blob/v7.2/include/uapi/linux/ip_vs.h#L433-L454
type ipvsStats int

const (
ipvsStatsUnspec int = iota
ipvsStatsConns
ipvsStatsPktsIn
ipvsStatsPktsOut
ipvsStatsBytesIn
ipvsStatsBytesOut
ipvsStatsCPS
ipvsStatsPPSIn
ipvsStatsPPSOut
ipvsStatsBPSIn
ipvsStatsBPSOut
ipvsStatsUnspec ipvsStats = 0 // IPVS_STATS_ATTR_UNSPEC
ipvsStatsConns ipvsStats = 1 // IPVS_STATS_ATTR_CONNS
ipvsStatsPktsIn ipvsStats = 2 // IPVS_STATS_ATTR_INPKTS
ipvsStatsPktsOut ipvsStats = 3 // IPVS_STATS_ATTR_OUTPKTS
ipvsStatsBytesIn ipvsStats = 4 // IPVS_STATS_ATTR_INBYTES
ipvsStatsBytesOut ipvsStats = 5 // IPVS_STATS_ATTR_OUTBYTES
ipvsStatsCPS ipvsStats = 6 // IPVS_STATS_ATTR_CPS
ipvsStatsPPSIn ipvsStats = 7 // IPVS_STATS_ATTR_INPPS
ipvsStatsPPSOut ipvsStats = 8 // IPVS_STATS_ATTR_OUTPPS
ipvsStatsBPSIn ipvsStats = 9 // IPVS_STATS_ATTR_INBPS
ipvsStatsBPSOut ipvsStats = 10 // IPVS_STATS_ATTR_OUTBPS
)

// Destination forwarding methods
// Deprecated forwarding method names retained for compatibility.
const (
// ConnectionFlagFwdMask indicates the mask in the connection
// flags which is used by forwarding method bits.
ConnectionFlagFwdMask = 0x0007
// ConnectionFlagFwdMask is an alias for ConnFwdMask.
// Deprecated: Use ConnFwdMask instead.
ConnectionFlagFwdMask = ConnFwdMask

// ConnectionFlagMasq is used for masquerade forwarding method.
ConnectionFlagMasq = 0x0000
// ConnectionFlagMasq is an alias for ConnFwdMasq.
// Deprecated: Use ConnFwdMasq instead.
ConnectionFlagMasq = ConnFwdMasq

// ConnectionFlagLocalNode is used for local node forwarding
// method.
ConnectionFlagLocalNode = 0x0001
// ConnectionFlagLocalNode is an alias for ConnFwdLocalNode.
// Deprecated: Use ConnFwdLocalNode instead.
ConnectionFlagLocalNode = ConnFwdLocalNode

// ConnectionFlagTunnel is used for tunnel mode forwarding
// method.
ConnectionFlagTunnel = 0x0002
// ConnectionFlagTunnel is an alias for ConnFwdTunnel.
// Deprecated: Use ConnFwdTunnel instead.
ConnectionFlagTunnel = ConnFwdTunnel

// ConnectionFlagDirectRoute is used for direct routing
// forwarding method.
ConnectionFlagDirectRoute = 0x0003
// ConnectionFlagDirectRoute is an alias for ConnFwdDirectRoute.
// Deprecated: Use ConnFwdDirectRoute instead.
ConnectionFlagDirectRoute = ConnFwdDirectRoute
)

// IPVS scheduler names.
// These correspond to the names registered by the Linux IPVS schedulers.
// See https://github.com/torvalds/linux/tree/v7.2/net/netfilter/ipvs
const (
// RoundRobin distributes jobs equally amongst the available
// real servers.
Expand Down Expand Up @@ -155,22 +175,30 @@ const (
WeightedLeastConnection = "wlc"
)

// Destination forwarding methods.
// See https://github.com/torvalds/linux/blob/v7.2/include/uapi/linux/ip_vs.h#L72-L132
const (
// ConnFwdMask is a mask for the fwd methods
// ConnFwdMask is the mask for the forwarding method bits.
// Corresponds to IP_VS_CONN_F_FWD_MASK.
ConnFwdMask = 0x0007

// ConnFwdMasq denotes forwarding via masquerading/NAT
// ConnFwdMasq denotes forwarding via masquerading/NAT.
// Corresponds to IP_VS_CONN_F_MASQ.
ConnFwdMasq = 0x0000

// ConnFwdLocalNode denotes forwarding to a local node
// ConnFwdLocalNode denotes forwarding to a local node.
// Corresponds to IP_VS_CONN_F_LOCALNODE.
ConnFwdLocalNode = 0x0001

// ConnFwdTunnel denotes forwarding via a tunnel
// ConnFwdTunnel denotes forwarding via a tunnel.
// Corresponds to IP_VS_CONN_F_TUNNEL.
ConnFwdTunnel = 0x0002

// ConnFwdDirectRoute denotes forwarding via direct routing
// ConnFwdDirectRoute denotes forwarding via direct routing.
// Corresponds to IP_VS_CONN_F_DROUTE.
ConnFwdDirectRoute = 0x0003

// ConnFwdBypass denotes forwarding while bypassing the cache
// ConnFwdBypass denotes forwarding while bypassing the cache.
// Corresponds to IP_VS_CONN_F_BYPASS.
ConnFwdBypass = 0x0004
)
47 changes: 23 additions & 24 deletions ipvs_linux_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import (

"github.com/moby/ipvs/ns"
"github.com/vishvananda/netlink"
"github.com/vishvananda/netlink/nl"
"golang.org/x/sys/unix"
)

Expand All @@ -31,28 +30,28 @@ var (
}

fwdMethods = []uint32{
ConnectionFlagMasq,
ConnectionFlagTunnel,
ConnectionFlagDirectRoute,
}

fwdMethodStrings = []string{
"Masq",
"Tunnel",
"Route",
ConnFwdMasq,
ConnFwdTunnel,
ConnFwdDirectRoute,
ConnFwdBypass,
}
)

func lookupFwMethod(fwMethod uint32) string {
switch fwMethod {
case ConnectionFlagMasq:
return fwdMethodStrings[0]
case ConnectionFlagTunnel:
return fwdMethodStrings[1]
case ConnectionFlagDirectRoute:
return fwdMethodStrings[2]
}
return ""
case ConnFwdMasq:
return "Masq"
case ConnFwdLocalNode:
return "Local"
case ConnFwdTunnel:
return "Tunnel"
case ConnFwdDirectRoute:
return "Route"
case ConnFwdBypass:
return "Bypass"
default:
return ""
}
}

func checkDestination(t *testing.T, i *Handle, s *Service, d *Destination, checkPresent bool) {
Expand Down Expand Up @@ -137,11 +136,11 @@ func TestService(t *testing.T) {
Netmask uint32
}{
{
AddressFamily: nl.FAMILY_V4,
AddressFamily: unix.AF_INET,
IP: "1.2.3.4",
Netmask: 0xFFFFFFFF,
}, {
AddressFamily: nl.FAMILY_V6,
AddressFamily: unix.AF_INET6,
IP: "2001:db8:3c4d:15::1a00",
Netmask: 128,
},
Expand Down Expand Up @@ -211,15 +210,15 @@ func TestService(t *testing.T) {

svcs := []Service{
{
AddressFamily: nl.FAMILY_V4,
AddressFamily: unix.AF_INET,
SchedName: RoundRobin,
Protocol: unix.IPPROTO_TCP,
Port: 80,
Address: net.ParseIP("10.20.30.40"),
Netmask: 0xFFFFFFFF,
},
{
AddressFamily: nl.FAMILY_V4,
AddressFamily: unix.AF_INET,
SchedName: LeastConnection,
Protocol: unix.IPPROTO_UDP,
Port: 8080,
Expand Down Expand Up @@ -300,12 +299,12 @@ func TestDestination(t *testing.T) {
Destinations []string
}{
{
AddressFamily: nl.FAMILY_V4,
AddressFamily: unix.AF_INET,
IP: "1.2.3.4",
Netmask: 0xFFFFFFFF,
Destinations: []string{"10.1.1.2", "10.1.1.3", "10.1.1.4"},
}, {
AddressFamily: nl.FAMILY_V6,
AddressFamily: unix.AF_INET6,
IP: "2001:db8:3c4d:15::1a00",
Netmask: 128,
Destinations: []string{"2001:db8:3c4d:15::1a2b", "2001:db8:3c4d:15::1a2c", "2001:db8:3c4d:15::1a2d"},
Expand Down
Loading
Loading