189 lines
4.1 KiB
Go
189 lines
4.1 KiB
Go
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
|
|
//}
|