| package overlay |
| |
| import ( |
| "fmt" |
| "net/netip" |
| |
| "github.com/gogo/protobuf/proto" |
| "github.com/moby/moby/v2/daemon/libnetwork/internal/hashable" |
| ) |
| |
| // OverlayPeerTable is the NetworkDB table for overlay network peer discovery. |
| const OverlayPeerTable = "overlay_peer_table" |
| |
| type Peer struct { |
| EndpointIP netip.Prefix |
| EndpointMAC hashable.MACAddr |
| TunnelEndpointIP netip.Addr |
| } |
| |
| func UnmarshalPeerRecord(data []byte) (*Peer, error) { |
| var pr PeerRecord |
| if err := proto.Unmarshal(data, &pr); err != nil { |
| return nil, fmt.Errorf("failed to unmarshal peer record: %w", err) |
| } |
| var ( |
| p Peer |
| err error |
| ) |
| p.EndpointIP, err = netip.ParsePrefix(pr.EndpointIP) |
| if err != nil { |
| return nil, fmt.Errorf("invalid peer IP %q received: %w", pr.EndpointIP, err) |
| } |
| p.EndpointMAC, err = hashable.ParseMAC(pr.EndpointMAC) |
| if err != nil { |
| return nil, fmt.Errorf("invalid MAC %q received: %w", pr.EndpointMAC, err) |
| } |
| p.TunnelEndpointIP, err = netip.ParseAddr(pr.TunnelEndpointIP) |
| if err != nil { |
| return nil, fmt.Errorf("invalid VTEP %q received: %w", pr.TunnelEndpointIP, err) |
| } |
| return &p, nil |
| } |