123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- package asndb
- import (
- "bytes"
- "fmt"
- "net"
- "strconv"
- "github.com/google/btree"
- )
- // ASN contains information about a netblock
- type ASN struct {
- Network *net.IPNet `json:"network"`
- From *net.IP `json:"from"`
- To *net.IP `json:"to"`
- Cidr string `json:"cidr"`
- ASN int `json:"asn"`
- Organization string `json:"organization"`
- }
- // NewASN creates a new ASN struct based on cidr, asnr and org
- func NewASN(cidr string, asnr string, org string) (*ASN, error) {
- _, network, err := net.ParseCIDR(cidr)
- if err != nil {
- return nil, fmt.Errorf("cidr parse error for %s: %s", cidr, err)
- }
- asn, err := strconv.Atoi(asnr)
- if err != nil {
- return nil, fmt.Errorf("ASN parse error for %s: %s", asnr, err)
- }
- ip := network.IP.To16()
- mask := net.IPMask(make([]byte, net.IPv6len))
- if ip.To4() != nil {
- for i := 0; i < net.IPv6len-net.IPv4len; i++ {
- mask[i] = 0xff
- }
- for i, val := range network.Mask {
- mask[i+net.IPv6len-net.IPv4len] = val
- }
- } else {
- mask = network.Mask
- }
- firstIP := net.IP(make([]byte, 16))
- lastIP := net.IP(make([]byte, 16))
- for i := range ip {
- firstIP[i] = ip[i] & mask[i]
- lastIP[i] = ip[i] | ^mask[i]
- }
- return &ASN{
- Network: network,
- Organization: org,
- ASN: asn,
- From: &firstIP,
- To: &lastIP,
- Cidr: cidr,
- }, nil
- }
- // Less determines whether a is lexicographically smaller than bt
- func (a *ASN) Less(bt btree.Item) bool {
- b := bt.(*ASN)
- return bytes.Compare(*a.To, *b.To) < 0
- }
|