/*
NNCP -- Node to Node copy, utilities for store-and-forward data exchange
-Copyright (C) 2016-2021 Sergey Matveev <stargrave@stargrave.org>
+Copyright (C) 2016-2022 Sergey Matveev <stargrave@stargrave.org>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
}
var (
- MagicNNCPDv1 [8]byte = [8]byte{'N', 'N', 'C', 'P', 'D', 0, 0, 1}
-
- mcdIP = net.ParseIP("ff02::1")
+ mcdIP = net.ParseIP("ff02::4e4e:4350")
mcdAddrLifetime = 2 * time.Minute
mcdPktSize int
})
continue
}
- if mcd.Magic != MagicNNCPDv1 {
+ if mcd.Magic != MagicNNCPDv1.B {
ctx.LogD("mcd", les, func(les LEs) string {
return fmt.Sprintf(
"MCD Rx %s/%d: unexpected magic: %s",
}
func (ctx *Ctx) MCDTx(ifiName string, port int, interval time.Duration) error {
- conn, err := net.DialUDP("udp",
- &net.UDPAddr{Port: port, Zone: ifiName},
- &net.UDPAddr{IP: mcdIP, Port: MCDPort, Zone: ifiName},
- )
+ ifi, err := net.InterfaceByName(ifiName)
if err != nil {
return err
}
+ addr := &net.UDPAddr{IP: mcdIP, Port: port, Zone: ifiName}
+ conn, err := net.ListenMulticastUDP("udp", ifi, addr)
+ if err != nil {
+ return err
+ }
+
+ dst := &net.UDPAddr{IP: mcdIP, Port: MCDPort, Zone: ifiName}
var buf bytes.Buffer
- mcd := MCD{Magic: MagicNNCPDv1, Sender: ctx.Self.Id}
+ mcd := MCD{Magic: MagicNNCPDv1.B, Sender: ctx.Self.Id}
if _, err := xdr.Marshal(&buf, mcd); err != nil {
panic(err)
}
if interval == 0 {
- _, err = conn.Write(buf.Bytes())
+ _, err = conn.WriteTo(buf.Bytes(), dst)
return err
}
go func() {
ifiName, MCDPort, port,
)
})
- _, err = conn.Write(buf.Bytes())
+ _, err = conn.WriteTo(buf.Bytes(), dst)
if err != nil {
ctx.LogE("mcd", les, err, func(les LEs) string {
return fmt.Sprintf("MCD on %s/%d/%d", ifiName, MCDPort, port)