X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=src%2Fmcd.go;h=a1917121fe7f7cca37f4f403fa60635f558074e6;hb=2c8c42466ffd977652d3468681e2c69bdc8fae6d;hp=dc733ca9bbfaa1d13624d4de44ad078ddf283982;hpb=369ef72fdf833e4d9d76be076dbaf45cf5ca1e62;p=nncp.git diff --git a/src/mcd.go b/src/mcd.go index dc733ca..a191712 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-2023 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 @@ -28,9 +28,7 @@ import ( xdr "github.com/davecgh/go-xdr/xdr2" ) -const ( - MCDPort = 5400 -) +const MCDPort = 5400 type MCD struct { Magic [8]byte @@ -43,9 +41,7 @@ type MCDAddr struct { } 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 @@ -125,7 +121,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 +174,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 +203,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)