-4

Im trying to send a fake udp (a random mac address, let's say 01:ff:ff:ff:ff:ff) package to be handled by the ServeDHCP on the server side, Im running the following dhcpv4 github repository github.com/krolaw/dhcp4.

The goal of send a discover package, is to check if the dhcp is alive.

In fact I created a new func called check

func (h *DHCPHandler) check () {
    con, err = net.Dial("udp", "127.0.0.1:67")
    for {
            //fake udp package???
            time.Sleep(10 * time.Minute)
    }

}

in the main of the function, I have the following call go handler.check()

And in the ServeDHCP I should pass these parameters:
func (h *DHCPHandler) ServeDHCP(p dhcp.Packet, msgType dhcp.MessageType, options dhcp.Options)

How could I send a fake upd package from the func check?

Iago SP
  • 1
  • 4
  • What is a "fake UDP package"? Not an expert, but AFAIK there are no such things as "packages" in UDP. Also what does "fake" mean? That it's really TCP? You should really describe what your *goal* is, rather than the method you think might solve your problem. – Martin Tournoij Dec 05 '17 at 06:49

1 Answers1

0

At the end I managed to make works this check to send in periods of 10 minuts an upd package with an mac address I know is gonna never be reached as following.

func (h *DHCPHandler) check() {
    //Fetch parameters from config file
    config := getConfig() // here is a mac saved on a json file 01:ff:ff:ff:ff:ff
    macFake, err := net.ParseMAC(config.MacFake)

    if err != nil {
            fmt.Println("error with the fake mac provided on the json file", err)
    }

    // create connection
    conn, err := net.Dial("udp4", "127.0.0.1:67")
    if err != nil {
            fmt.Println("error with the connection", err)
    }

    //stay alive
    for {
            fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")
            conn.Write(dhcp.RequestPacket(dhcp.Discover, macFake, h.ip, []byte{0, 1, 2, 3}, true, nil))
            time.Sleep(10 * time.Minute)
    }

}

On the main function, I just need to call this check goroutine and add on the server side (ServeDHCP) this code:

    mac := p.CHAddr().String()
    //Fetch parameters from config file
    config := getConfig()
    if mac == config.MacFake { //udp package received and a mac saved on a json file 01:ff:ff:ff:ff:ff
            // send notification to restart if failure on a systemd
            daemon.SdNotify(false, "WATCHDOG=1")
            return
    }

The last part needed is to add a systemd check, in my case I send the watchdog every 10 min, so, the systemd check will be setted it to 11min

[Service]
ExecStartPre=//something 
WatchdogSec=11min 
Restart=on-failure
Iago SP
  • 1
  • 4