@@ -36,9 +36,16 @@ import (
36
36
// See the section 10.4 on the line 2482 of the Core specification:
37
37
// https://openconnectivity.org/specs/OCF_Core_Specification_v2.0.0.pdf
38
38
// https://iotivity.org/documentation/linux/programmers-guide
39
+ const (
40
+ DiscoveryAddressUDP4Local = "224.0.1.187:5683"
41
+ DiscoveryAddressUDP6LinkLocal = "[ff02::158]:5683"
42
+ DiscoveryAddressUDP6RealmLocal = "[ff03::158]:5683"
43
+ DiscoveryAddressUDP6SiteLocal = "[ff05::158]:5683"
44
+ )
45
+
39
46
var (
40
- DiscoveryAddressUDP4 = []string {"224.0.1.187:5683" }
41
- DiscoveryAddressUDP6 = []string {"[ff02::158]:5683" , "[ff03::158]:5683" , "[ff05::158]:5683" }
47
+ DiscoveryAddressUDP4 = []string {DiscoveryAddressUDP4Local }
48
+ DiscoveryAddressUDP6 = []string {DiscoveryAddressUDP6LinkLocal , DiscoveryAddressUDP6RealmLocal , DiscoveryAddressUDP6SiteLocal }
42
49
)
43
50
44
51
type DiscoveryHandler = func (conn * client.Conn , req * pool.Message )
@@ -89,6 +96,24 @@ func (d *DiscoveryClient) Close() error {
89
96
return err
90
97
}
91
98
99
+ // See the section 12.2.9 https://openconnectivity.org/specs/OCF_Core_Specification.pdf
100
+ var defaultHopLimit = map [string ]int {
101
+ DiscoveryAddressUDP4Local : 1 ,
102
+ DiscoveryAddressUDP6LinkLocal : 1 ,
103
+ DiscoveryAddressUDP6RealmLocal : 255 ,
104
+ DiscoveryAddressUDP6SiteLocal : 255 ,
105
+ }
106
+
107
+ func getHopLimit (addr string , desiredHopLimit int ) int {
108
+ if desiredHopLimit > 0 {
109
+ return desiredHopLimit
110
+ }
111
+ if v , ok := defaultHopLimit [addr ]; ok {
112
+ return v
113
+ }
114
+ return 1
115
+ }
116
+
92
117
// DialDiscoveryAddresses connects to discovery endpoints.
93
118
func DialDiscoveryAddresses (ctx context.Context , cfg DiscoveryConfiguration , errors func (error )) ([]* DiscoveryClient , error ) {
94
119
v , ok := ctx .Deadline ()
@@ -105,15 +130,23 @@ func DialDiscoveryAddresses(ctx context.Context, cfg DiscoveryConfiguration, err
105
130
msgIDudp6 := msgIDudp4 + ^ uint16 (0 )/ 2
106
131
107
132
for _ , address := range cfg .MulticastAddressUDP4 {
108
- c , err := newDiscoveryClient ("udp4" , address , msgIDudp4 , timeout , errors , cfg .MulticastOptions )
133
+ multicastOptions := []net.MulticastOption {
134
+ net .WithMulticastHoplimit (getHopLimit (address , cfg .MulticastHopLimit )),
135
+ }
136
+ multicastOptions = append (multicastOptions , cfg .MulticastOptions ... )
137
+ c , err := newDiscoveryClient ("udp4" , address , msgIDudp4 , timeout , errors , multicastOptions )
109
138
if err != nil {
110
139
errors (err )
111
140
continue
112
141
}
113
142
out = append (out , c )
114
143
}
115
144
for _ , address := range cfg .MulticastAddressUDP6 {
116
- c , err := newDiscoveryClient ("udp6" , address , msgIDudp6 , timeout , errors , cfg .MulticastOptions )
145
+ multicastOptions := []net.MulticastOption {
146
+ net .WithMulticastHoplimit (getHopLimit (address , cfg .MulticastHopLimit )),
147
+ }
148
+ multicastOptions = append (multicastOptions , cfg .MulticastOptions ... )
149
+ c , err := newDiscoveryClient ("udp6" , address , msgIDudp6 , timeout , errors , multicastOptions )
117
150
if err != nil {
118
151
errors (err )
119
152
continue
0 commit comments