From a92f781a2e79e751ed6b6810f3611bac762dd5b4 Mon Sep 17 00:00:00 2001 From: Zexi Li Date: Tue, 19 Mar 2019 19:44:08 +0800 Subject: [PATCH] fix: baremetal tftp use local IP send response --- pkg/baremetal/pxe/pxe.go | 2 -- pkg/baremetal/pxe/tftp.go | 13 +++++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/pkg/baremetal/pxe/pxe.go b/pkg/baremetal/pxe/pxe.go index cf126af2b7..8fb1a26529 100644 --- a/pkg/baremetal/pxe/pxe.go +++ b/pkg/baremetal/pxe/pxe.go @@ -113,8 +113,6 @@ func (s *Server) Serve() error { if err != nil { return err } - //tftpSrv := tftp.NewServer(tftpHandler.ReadHandler, nil) - //tftpSrv.SetTimeout(5 * time.Second) log.Infof("DHCPServer Bind %s %d", s.Address, s.DHCPPort) dhcpSrv, _, err := dhcp.NewDHCPServer2(s.Address, s.DHCPPort, false) diff --git a/pkg/baremetal/pxe/tftp.go b/pkg/baremetal/pxe/tftp.go index 894ef682ba..02b637e016 100644 --- a/pkg/baremetal/pxe/tftp.go +++ b/pkg/baremetal/pxe/tftp.go @@ -106,10 +106,23 @@ func (h *TFTPHandler) transferLog(clientAddr net.Addr, path string, err error) { } func (s *Server) serveTFTP(l net.PacketConn, handler *TFTPHandler) error { + bindDial := func(network, addr string) (net.Conn, error) { + localIp := l.LocalAddr().(*net.UDPAddr).IP + remoteAddr, err := net.ResolveUDPAddr("udp", addr) + if err != nil { + return nil, err + } + return net.DialUDP("udp", &net.UDPAddr{ + IP: localIp, + Port: 0, // random free port + }, remoteAddr) + } + ts := tftp.Server{ Handler: handler.Handle, InfoLog: func(msg string) { log.Debugf("TFTP msg: %s", msg) }, TransferLog: handler.transferLog, + Dial: bindDial, } err := ts.Serve(l) if err != nil {