package dhcp // //import ( // "bytes" // "encoding/binary" // "fmt" // log "github.com/cihub/seelog" // "loafle.com/overflow/commons_go/matcher" // "net" // "time" //) // //const ( // MAGIC_COOKIE uint32 = 0x63825363 // OPT_CODE_SERVER_IDENTIFIER uint8 = 54 // OPT_CODE_SUBNET_MASK uint8 = 1 // OPT_CODE_ROUTER uint8 = 3 // OPT_CODE_DNS uint8 = 6 //) // //type dhcpDiscover struct { // MsgType byte // HwType byte // HwAddrLen byte // Hops byte // Xid uint32 // Secs uint16 // BootpFlags uint16 // ClientIp uint32 // YourIp uint32 // NextServerIp uint32 // RelayAgentIp uint32 // ClientMacAddr [6]byte // ClientHwAddrPadding [10]byte // ServerHostName [64]byte // BootFileName [128]byte // MagicCookie uint32 // Mtype byte // MtypeLen byte // MtypeVal byte // Opts [200]byte // End byte // Padding [16]byte //} // //func DiscoverDHCP(zone *types.DiscoveryZone) { // err := sendDHCPDiscovery() // if err != nil { // log.Error(err) // return // } // recvDHCPOffer(zone) //} // //func sendDHCPDiscovery() error { // dhcp := dhcpDiscover{ // MsgType: 0x01, // HwType: 0x01, // HwAddrLen: 0x06, // Hops: 0x00, // Xid: 0x00000000, // Secs: 0x0000, // ClientIp: 0x00000000, // YourIp: 0x00000000, // NextServerIp: 0x00000000, // RelayAgentIp: 0x00000000, // MagicCookie: MAGIC_COOKIE, // Mtype: 0x35, // MtypeLen: 0x01, // MtypeVal: 0x01, // End: 0xff, // } // // var flag uint16 = 0 // dhcp.BootpFlags = ^flag // flag = unicast , ^flag = broadcast // // //TODO : getting mac addr from zone // dhcp.ClientMacAddr[0] = 0x50 // dhcp.ClientMacAddr[1] = 0xe5 // dhcp.ClientMacAddr[2] = 0x49 // dhcp.ClientMacAddr[3] = 0x46 // dhcp.ClientMacAddr[4] = 0x93 // dhcp.ClientMacAddr[5] = 0x28 // // writer := new(bytes.Buffer) // binary.Write(writer, binary.BigEndian, dhcp) // conn, err := net.Dial("udp", "255.255.255.255:67") // if err != nil { // return err // } // conn.Write(writer.Bytes()) // defer conn.Close() // // return nil //} // //func recvDHCPOffer(zone *types.DiscoveryZone) { // // socket, err := net.ListenUDP("udp4", &net.UDPAddr{ // IP: net.IPv4(255, 255, 255, 255), // Port: 68, // }) // if err != nil { // log.Error(err) // return // } // err = socket.SetDeadline(time.Now().Add(3 * time.Second)) // if err != nil { // log.Error(err) // return // } // // buf := make([]byte, 4096) // n, _, err := socket.ReadFromUDP(buf) // if err != nil { // log.Error(err) // return // } // if n <= 0 { // log.Error("No DHCP offer.") // return // } // // offer := dhcpDiscover{} // // reader := new(bytes.Buffer) // reader.Write(buf) // if err := binary.Read(reader, binary.BigEndian, &offer); err != nil { // log.Error(err) // return // } // if offer.MagicCookie != MAGIC_COOKIE { // log.Error("Not a DHCP packet.") // return // } // // //option searching // r := new(bytes.Buffer) // r.Write(offer.Opts[:]) // // for i := 0; i < r.Len(); i++ { // v := r.Next(1)[0] // // if v == OPT_CODE_SUBNET_MASK && r.Next(1)[0] == 4 { // ipStr := byteToIpString(r.Next(4)) // log.Infof("SUBNET MASK: %s", ipStr) // } // // if v == OPT_CODE_ROUTER && r.Next(1)[0] == 4 { // ipStr := byteToIpString(r.Next(4)) // log.Infof("ROUTER: %s", ipStr) // } // // if v == OPT_CODE_DNS { // len := r.Next(1)[0] // var dns []string = make([]string, 0) // var ipStr string // ipStr = byteToIpString(r.Next(4)) // dns = append(dns, ipStr) // if len == 8 { // ipStr = byteToIpString(r.Next(4)) // dns = append(dns, ipStr) // } // log.Infof("DNS", dns) // } // // if v == OPT_CODE_SERVER_IDENTIFIER && r.Next(1)[0] == 4 { // ipStr := byteToIpString(r.Next(4)) // log.Infof("DHCP SERVER: %s", ipStr) // } // } // //} // //func byteToIpString(b []byte) string { // var ipStr string // len := len(b) // for i := 0; i < len; i++ { // v := b[i] // ipStr += fmt.Sprintf("%d", v) // if i < len-1 { // ipStr += "." // } // } // // return ipStr //}