本文整理汇总了Golang中github.com/krolaw/dhcp4.Packet.SIAddr方法的典型用法代码示例。如果您正苦于以下问题:Golang Packet.SIAddr方法的具体用法?Golang Packet.SIAddr怎么用?Golang Packet.SIAddr使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类github.com/krolaw/dhcp4.Packet
的用法示例。
在下文中一共展示了Packet.SIAddr方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: ServeDHCP
// ServeDHCP is called by dhcp4.ListenAndServe when the service is started
func (d *DHCPService) ServeDHCP(packet dhcp4.Packet, msgType dhcp4.MessageType, reqOptions dhcp4.Options) (response dhcp4.Packet) {
switch msgType {
case dhcp4.Discover:
// RFC 2131 4.3.1
// FIXME: send to StatHat and/or increment a counter
mac := packet.CHAddr()
// Check MAC blacklist
if !d.isMACPermitted(mac) {
log.Printf("DHCP Discover from %s\n is not permitted", mac.String())
return nil
}
log.Printf("DHCP Discover from %s\n", mac.String())
// Look up the MAC entry with cascaded attributes
lease, found, err := d.db.GetMAC(mac, true)
if err != nil {
return nil
}
// Existing Lease
if found {
options := d.getOptionsFromMAC(lease)
log.Printf("DHCP Discover from %s (we offer %s from current lease)\n", lease.MAC.String(), lease.IP.String())
// for x, y := range reqOptions {
// log.Printf("\tR[%v] %v %s\n", x, y, y)
// }
// for x, y := range options {
// log.Printf("\tO[%v] %v %s\n", x, y, y)
// }
return dhcp4.ReplyPacket(packet, dhcp4.Offer, d.ip.To4(), lease.IP.To4(), d.getLeaseDurationForRequest(reqOptions, lease.Duration), options.SelectOrderOrAll(reqOptions[dhcp4.OptionParameterRequestList]))
}
// New Lease
ip := d.getIPFromPool()
if ip != nil {
options := d.getOptionsFromMAC(lease)
log.Printf("DHCP Discover from %s (we offer %s from pool)\n", mac.String(), ip.String())
// for x, y := range reqOptions {
// log.Printf("\tR[%v] %v %s\n", x, y, y)
// }
// for x, y := range options {
// log.Printf("\tO[%v] %v %s\n", x, y, y)
// }
return dhcp4.ReplyPacket(packet, dhcp4.Offer, d.ip.To4(), ip.To4(), d.getLeaseDurationForRequest(reqOptions, d.leaseDuration), options.SelectOrderOrAll(reqOptions[dhcp4.OptionParameterRequestList]))
}
log.Printf("DHCP Discover from %s (no offer due to no addresses available in pool)\n", mac.String())
// FIXME: Send to StatHat and/or increment a counter
// TODO: Send an email?
return nil
case dhcp4.Request:
// RFC 2131 4.3.2
// FIXME: send to StatHat and/or increment a counter
mac := packet.CHAddr()
// Check MAC blacklist
if !d.isMACPermitted(mac) {
log.Printf("DHCP Request from %s\n is not permitted", mac.String())
return nil
}
// Check IP presence
state, requestedIP := d.getRequestState(packet, reqOptions)
log.Printf("DHCP Request (%s) from %s...\n", state, mac.String())
if len(requestedIP) == 0 || requestedIP.IsUnspecified() { // no IP provided at all... why? FIXME
log.Printf("DHCP Request (%s) from %s (empty IP, so we're just ignoring this request)\n", state, mac.String())
return nil
}
// Check IPv4
if len(requestedIP) != net.IPv4len {
log.Printf("DHCP Request (%s) from %s wanting %s (IPv6 address requested, so we're just ignoring this request)\n", state, mac.String(), requestedIP.String())
return nil
}
// Check IP subnet
if !d.subnet.Contains(requestedIP) {
log.Printf("DHCP Request (%s) from %s wanting %s (we reject due to wrong subnet)\n", state, mac.String(), requestedIP.String())
return dhcp4.ReplyPacket(packet, dhcp4.NAK, d.ip.To4(), nil, 0, nil)
}
// Check Target Server
targetServerIP := packet.SIAddr()
if len(targetServerIP) > 0 && !targetServerIP.IsUnspecified() {
log.Printf("DHCP Request (%s) from %s wanting %s is in response to a DHCP offer from %s\n", state, mac.String(), requestedIP.String(), targetServerIP.String())
if d.ip.Equal(targetServerIP) {
return nil
}
}
// Process Request
log.Printf("DHCP Request (%s) from %s wanting %s...\n", state, mac.String(), requestedIP.String())
lease, found, err := d.db.GetMAC(mac, true)
if err != nil {
return nil
}
//.........这里部分代码省略.........