]> Cypherpunks.ru repositories - nncp.git/blobdiff - src/mcd.go
Raise copyright years
[nncp.git] / src / mcd.go
index d785d5c64b9461f1636de0220f37d9dde7fc73b5..b4de4f4cb602c97f0ced66027d744ca7441a03db 100644 (file)
@@ -1,6 +1,6 @@
 /*
 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
@@ -43,8 +43,6 @@ type MCDAddr struct {
 }
 
 var (
-       MagicNNCPDv1 [8]byte = [8]byte{'N', 'N', 'C', 'P', 'D', 0, 0, 1}
-
        mcdIP           = net.ParseIP("ff02::4e4e:4350")
        mcdAddrLifetime = 2 * time.Minute
 
@@ -125,7 +123,7 @@ func (ctx *Ctx) MCDRx(ifiName string) error {
                                })
                                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",
@@ -178,20 +176,24 @@ func (ctx *Ctx) MCDRx(ifiName string) error {
 }
 
 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() {
@@ -203,7 +205,7 @@ func (ctx *Ctx) MCDTx(ifiName string, port int, interval time.Duration) error {
                                        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)