diff --git a/constants_linux.go b/constants_linux.go index 592a0ee..e5a4abb 100644 --- a/constants_linux.go +++ b/constants_linux.go @@ -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 ) -// 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. @@ -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 ) diff --git a/ipvs_linux_test.go b/ipvs_linux_test.go index 3f9ef99..f54333a 100644 --- a/ipvs_linux_test.go +++ b/ipvs_linux_test.go @@ -10,7 +10,6 @@ import ( "github.com/moby/ipvs/ns" "github.com/vishvananda/netlink" - "github.com/vishvananda/netlink/nl" "golang.org/x/sys/unix" ) @@ -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) { @@ -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, }, @@ -211,7 +210,7 @@ func TestService(t *testing.T) { svcs := []Service{ { - AddressFamily: nl.FAMILY_V4, + AddressFamily: unix.AF_INET, SchedName: RoundRobin, Protocol: unix.IPPROTO_TCP, Port: 80, @@ -219,7 +218,7 @@ func TestService(t *testing.T) { Netmask: 0xFFFFFFFF, }, { - AddressFamily: nl.FAMILY_V4, + AddressFamily: unix.AF_INET, SchedName: LeastConnection, Protocol: unix.IPPROTO_UDP, Port: 8080, @@ -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"}, diff --git a/netlink_linux.go b/netlink_linux.go index c811141..86ffe00 100644 --- a/netlink_linux.go +++ b/netlink_linux.go @@ -17,6 +17,7 @@ import ( "github.com/sirupsen/logrus" "github.com/vishvananda/netlink/nl" "github.com/vishvananda/netns" + "golang.org/x/sys/unix" ) // For Quick Reference IPVS related netlink message is described at the end of this file. @@ -85,31 +86,31 @@ func setup() { } func fillService(s *Service) nl.NetlinkRequestData { - cmdAttr := nl.NewRtAttr(ipvsCmdAttrService, nil) - cmdAttr.AddRtAttr(ipvsSvcAttrAddressFamily, nl.Uint16Attr(s.AddressFamily)) + cmdAttr := nl.NewRtAttr(int(ipvsCmdAttrService), nil) + cmdAttr.AddRtAttr(int(ipvsSvcAttrAddressFamily), nl.Uint16Attr(s.AddressFamily)) if s.FWMark != 0 { - cmdAttr.AddRtAttr(ipvsSvcAttrFWMark, nl.Uint32Attr(s.FWMark)) + cmdAttr.AddRtAttr(int(ipvsSvcAttrFWMark), nl.Uint32Attr(s.FWMark)) } else { - cmdAttr.AddRtAttr(ipvsSvcAttrProtocol, nl.Uint16Attr(s.Protocol)) - cmdAttr.AddRtAttr(ipvsSvcAttrAddress, rawIPData(s.Address)) + cmdAttr.AddRtAttr(int(ipvsSvcAttrProtocol), nl.Uint16Attr(s.Protocol)) + cmdAttr.AddRtAttr(int(ipvsSvcAttrAddress), rawIPData(s.Address)) // Port needs to be in network byte order. var portBuf bytes.Buffer _ = binary.Write(&portBuf, binary.BigEndian, s.Port) - cmdAttr.AddRtAttr(ipvsSvcAttrPort, portBuf.Bytes()) + cmdAttr.AddRtAttr(int(ipvsSvcAttrPort), portBuf.Bytes()) } - cmdAttr.AddRtAttr(ipvsSvcAttrSchedName, nl.ZeroTerminated(s.SchedName)) + cmdAttr.AddRtAttr(int(ipvsSvcAttrSchedName), nl.ZeroTerminated(s.SchedName)) if s.PEName != "" { - cmdAttr.AddRtAttr(ipvsSvcAttrPEName, nl.ZeroTerminated(s.PEName)) + cmdAttr.AddRtAttr(int(ipvsSvcAttrPEName), nl.ZeroTerminated(s.PEName)) } f := &ipvsFlags{ flags: s.Flags, mask: 0xFFFFFFFF, } - cmdAttr.AddRtAttr(ipvsSvcAttrFlags, f.Serialize()) - cmdAttr.AddRtAttr(ipvsSvcAttrTimeout, nl.Uint32Attr(s.Timeout)) - cmdAttr.AddRtAttr(ipvsSvcAttrNetmask, nl.Uint32Attr(s.Netmask)) + cmdAttr.AddRtAttr(int(ipvsSvcAttrFlags), f.Serialize()) + cmdAttr.AddRtAttr(int(ipvsSvcAttrTimeout), nl.Uint32Attr(s.Timeout)) + cmdAttr.AddRtAttr(int(ipvsSvcAttrNetmask), nl.Uint32Attr(s.Netmask)) return cmdAttr } @@ -117,28 +118,28 @@ func fillDestination(d *Destination) (nl.NetlinkRequestData, error) { if d.Weight < 0 || d.Weight > math.MaxInt32 { return nil, fmt.Errorf("destination weight out of range: %d", d.Weight) } - cmdAttr := nl.NewRtAttr(ipvsCmdAttrDest, nil) + cmdAttr := nl.NewRtAttr(int(ipvsCmdAttrDest), nil) - cmdAttr.AddRtAttr(ipvsDestAttrAddress, rawIPData(d.Address)) + cmdAttr.AddRtAttr(int(ipvsDestAttrAddress), rawIPData(d.Address)) // Port needs to be in network byte order. var portBuf bytes.Buffer _ = binary.Write(&portBuf, binary.BigEndian, d.Port) - cmdAttr.AddRtAttr(ipvsDestAttrPort, portBuf.Bytes()) - cmdAttr.AddRtAttr(ipvsDestAttrForwardingMethod, nl.Uint32Attr(d.ConnectionFlags&ConnectionFlagFwdMask)) - cmdAttr.AddRtAttr(ipvsDestAttrWeight, nl.Uint32Attr(uint32(d.Weight))) - cmdAttr.AddRtAttr(ipvsDestAttrUpperThreshold, nl.Uint32Attr(d.UpperThreshold)) - cmdAttr.AddRtAttr(ipvsDestAttrLowerThreshold, nl.Uint32Attr(d.LowerThreshold)) + cmdAttr.AddRtAttr(int(ipvsDestAttrPort), portBuf.Bytes()) + cmdAttr.AddRtAttr(int(ipvsDestAttrForwardingMethod), nl.Uint32Attr(d.ConnectionFlags&ConnFwdMask)) + cmdAttr.AddRtAttr(int(ipvsDestAttrWeight), nl.Uint32Attr(uint32(d.Weight))) + cmdAttr.AddRtAttr(int(ipvsDestAttrUpperThreshold), nl.Uint32Attr(d.UpperThreshold)) + cmdAttr.AddRtAttr(int(ipvsDestAttrLowerThreshold), nl.Uint32Attr(d.LowerThreshold)) return cmdAttr, nil } -func (i *Handle) doCmdwithResponse(s *Service, d *Destination, cmd uint8) ([][]byte, error) { +func (i *Handle) doCmdwithResponse(s *Service, d *Destination, cmd ipvsCmd) ([][]byte, error) { req := newIPVSRequest(cmd) req.Seq = atomic.AddUint32(&i.seq, 1) if s == nil { - req.Flags |= syscall.NLM_F_DUMP // Flag to dump all messages - req.AddData(nl.NewRtAttr(ipvsCmdAttrService, nil)) // Add a dummy attribute + req.Flags |= syscall.NLM_F_DUMP // Flag to dump all messages + req.AddData(nl.NewRtAttr(int(ipvsCmdAttrService), nil)) // Add a dummy attribute } else { req.AddData(fillService(s)) } @@ -163,7 +164,7 @@ func (i *Handle) doCmdwithResponse(s *Service, d *Destination, cmd uint8) ([][]b return res, nil } -func (i *Handle) doCmd(s *Service, d *Destination, cmd uint8) error { +func (i *Handle) doCmd(s *Service, d *Destination, cmd ipvsCmd) error { _, err := i.doCmdwithResponse(s, d, cmd) return err @@ -210,14 +211,14 @@ func getIPVSFamily() (int, error) { func rawIPData(ip net.IP) []byte { family := nl.GetIPFamily(ip) - if family == nl.FAMILY_V4 { + if family == unix.AF_INET { return ip.To4() } return ip } -func newIPVSRequest(cmd uint8) *nl.NetlinkRequest { - return newGenlRequest(ipvsFamily, cmd) +func newIPVSRequest(cmd ipvsCmd) *nl.NetlinkRequest { + return newGenlRequest(ipvsFamily, uint8(cmd)) } func newGenlRequest(familyID int, cmd uint8) *nl.NetlinkRequest { @@ -307,7 +308,7 @@ func assembleStats(msg []byte) (SvcStats, error) { } for _, attr := range attrs { - switch int(attr.Attr.Type) { + switch ipvsStats(attr.Attr.Type) { case ipvsStatsUnspec: // unspecified case ipvsStatsConns: @@ -341,7 +342,7 @@ func assembleService(attrs []syscall.NetlinkRouteAttr) (*Service, error) { var addressBytes []byte for _, attr := range attrs { - switch int(attr.Attr.Type) { + switch ipvsSvcAttr(attr.Attr.Type) { case ipvsSvcAttrUnspec: // unspecified case ipvsSvcAttrAddressFamily: @@ -437,7 +438,7 @@ func (i *Handle) doGetServicesCmd(svc *Service) ([]*Service, error) { } // doCmdWithoutAttr a simple wrapper of netlink socket execute command -func (i *Handle) doCmdWithoutAttr(cmd uint8) ([][]byte, error) { +func (i *Handle) doCmdWithoutAttr(cmd ipvsCmd) ([][]byte, error) { req := newIPVSRequest(cmd) req.Seq = atomic.AddUint32(&i.seq, 1) return execute(i.sock, req) @@ -448,7 +449,7 @@ func assembleDestination(attrs []syscall.NetlinkRouteAttr) (*Destination, error) var addressBytes []byte for _, attr := range attrs { - switch int(attr.Attr.Type) { + switch ipvsDestAttr(attr.Attr.Type) { case ipvsDestAttrUnspec: // unspecified case ipvsDestAttrAddressFamily: @@ -603,7 +604,7 @@ func (i *Handle) parseConfig(msg []byte) (*Config, error) { } for _, attr := range attrs { - switch int(attr.Attr.Type) { + switch ipvsCmdAttr(attr.Attr.Type) { case ipvsCmdAttrUnspec: // unspecified case ipvsCmdAttrTimeoutTCP: @@ -639,9 +640,9 @@ func (i *Handle) doSetConfigCmd(c *Config) error { req := newIPVSRequest(ipvsCmdSetConfig) req.Seq = atomic.AddUint32(&i.seq, 1) - req.AddData(nl.NewRtAttr(ipvsCmdAttrTimeoutTCP, nl.Uint32Attr(uint32(c.TimeoutTCP.Seconds())))) - req.AddData(nl.NewRtAttr(ipvsCmdAttrTimeoutTCPFin, nl.Uint32Attr(uint32(c.TimeoutTCPFin.Seconds())))) - req.AddData(nl.NewRtAttr(ipvsCmdAttrTimeoutUDP, nl.Uint32Attr(uint32(c.TimeoutUDP.Seconds())))) + req.AddData(nl.NewRtAttr(int(ipvsCmdAttrTimeoutTCP), nl.Uint32Attr(uint32(c.TimeoutTCP.Seconds())))) + req.AddData(nl.NewRtAttr(int(ipvsCmdAttrTimeoutTCPFin), nl.Uint32Attr(uint32(c.TimeoutTCPFin.Seconds())))) + req.AddData(nl.NewRtAttr(int(ipvsCmdAttrTimeoutUDP), nl.Uint32Attr(uint32(c.TimeoutUDP.Seconds())))) _, err := execute(i.sock, req)