X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=src%2Fmcd.go;h=b4de4f4cb602c97f0ced66027d744ca7441a03db;hb=0367cce2741e1ce6a89a49fd5c4e9df6005c9744;hp=d785d5c64b9461f1636de0220f37d9dde7fc73b5;hpb=512f39be16c63a9ab0a9f27d40c9cfbb2339f9c2;p=nncp.git diff --git a/src/mcd.go b/src/mcd.go index d785d5c..b4de4f4 100644 --- a/src/mcd.go +++ b/src/mcd.go @@ -1,6 +1,6 @@ /* NNCP -- Node to Node copy, utilities for store-and-forward data exchange -Copyright (C) 2016-2021 Sergey Matveev +Copyright (C) 2016-2022 Sergey Matveev 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)