-
Notifications
You must be signed in to change notification settings - Fork 0
/
pingers_support.go
66 lines (57 loc) · 1.8 KB
/
pingers_support.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package goping
import (
"errors"
"sync"
)
/*** This are interfaces and utility functions to work with ping extensions***/
//Pinger is responsible for the low implementation to send and receive pings over the network
type Pinger interface {
//Start initiate the channels where the pinger will receive requests and should send the responses.
Start(pid int) (ping chan<- SeqRequest, pong <-chan RawResponse, done <-chan struct{}, err error)
}
/*** Errors ***/
var (
ErrTimeout = errors.New("Timeout")
ErrDstUnreachable = errors.New("Destination Unreachable")
ErrParamProblem = errors.New("Parameter problem")
ErrTimeExceeded = errors.New("Time Exceeded")
ErrRedirect = errors.New("Redirect Message")
ErrUnknown = errors.New("Unknown Packet")
ErrPingerNotRegistered = errors.New("Ping not registered")
ErrCouldNotStartPinger = errors.New("Could not start pinger")
)
/*** Pinger Registry ***/
var (
pregistry map[string]Pinger
pregistryMutex sync.Mutex
)
//RegPingerAdd Used to register new low implementations of the Pinger interface
func RegPingerAdd(name string, pinger Pinger) {
pregistryMutex.Lock()
defer pregistryMutex.Unlock()
if pregistry == nil {
pregistry = make(map[string]Pinger)
}
pregistry[name] = pinger
}
//RegPingerGet returns a Pinger implementation
func RegPingerGet(name string) (Pinger, error) {
pregistryMutex.Lock()
defer pregistryMutex.Unlock()
if pinger, ok := pregistry[name]; ok {
return pinger, nil
}
return nil, ErrPingerNotRegistered
}
//RegPingerList returns a list of Pinger Implementations that exists in runtime
func RegPingerList() []string {
pregistryMutex.Lock()
defer pregistryMutex.Unlock()
names := make([]string, len(pregistry))
i := 0
for name := range pregistry {
names[i] = name
i++
}
return names
}