Fix wrong NTP result

This commit is contained in:
KusakabeSi 2022-01-02 15:45:50 +00:00
parent 999fb6d641
commit 9886e2bf09
4 changed files with 29 additions and 24 deletions

View File

@ -149,16 +149,16 @@ SendAddr | Packet send address for `*sock` mode(client mode)
<a name="IType"></a>IType | Description <a name="IType"></a>IType | Description
-----------|:----- -----------|:-----
dummy | Dymmy interface, drop any packet received. You need this if you want to setup it as a relay node. dummy | Dymmy interface, drop any packet received. You need this if you want to setup it as a relay node.
stdio | Wrtie to stdoutread from stdin. <br>Required parameter: `MacAddrPrefix` && `L2HeaderMode` stdio | Wrtie to stdoutread from stdin. <br>Required parameter: `MacAddrPrefix` && `L2HeaderMode`
udpsock | Read/Write the raw packet to an udp socket.<br>Required parameter: `RecvAddr` && `SendAddr` udpsock | Read/Write the raw packet to an udp socket.<br>Required parameter: `RecvAddr` && `SendAddr`
tcpsock | Read/Write the raw packet to a tcp socket. <br>Required parameter: `RecvAddr` \|\| `SendAddr` tcpsock | Read/Write the raw packet to a tcp socket. <br>Required parameter: `RecvAddr` \|\| `SendAddr`
unixsock | Read/Write the raw packet to an unix socket(SOCK_STREAM mode).<br>Required parameter: `RecvAddr` \|\| `SendAddr` unixsock | Read/Write the raw packet to an unix socket(SOCK_STREAM mode).<br>Required parameter: `RecvAddr` \|\| `SendAddr`
udpsock | Read/Write the raw packet to an unix socket(SOCK_DGRAM mode)<br>Required parameter: `RecvAddr` \|\| `SendAddr` unixgramsock | Read/Write the raw packet to an unix socket(SOCK_DGRAM mode)<br>Required parameter: `RecvAddr` \|\| `SendAddr`
udpsock | Read/Write the raw packet to an unix socket(SOCK_SEQPACKET mode).<br>Required parameter: `RecvAddr` \|\| `SendAddr` unixpacketsock | Read/Write the raw packet to an unix socket(SOCK_SEQPACKET mode).<br>Required parameter: `RecvAddr` \|\| `SendAddr`
fd | Read/Write the raw packet to specific file descriptor.<br>Required parameter: None. But require environment variable `EG_FD_RX` && `EG_FD_TX` fd | Read/Write the raw packet to specific file descriptor.<br>Required parameter: None. But require environment variable `EG_FD_RX` && `EG_FD_TX`
vpp | Integrate to VPP by libmemif. <br>Required parameter: `Name` && `VPPIFaceID` && `VPPBridgeID` && `MacAddrPrefix` && `MTU` vpp | Integrate to VPP by libmemif. <br>Required parameter: `Name` && `VPPIFaceID` && `VPPBridgeID` && `MacAddrPrefix` && `MTU`
tap | Read/Write to tap device from linux.<br>Required parameter: `Name` && `MacAddrPrefix` && `MTU`<br>Optional Parameter:`IPv4CIDR` , `IPv6CIDR` , `IPv6LLPrefix` tap | Read/Write to tap device from linux.<br>Required parameter: `Name` && `MacAddrPrefix` && `MTU`<br>Optional Parameter:`IPv4CIDR` , `IPv6CIDR` , `IPv6LLPrefix`
<a name="L2HeaderMode"></a>L2HeaderMode | Description <a name="L2HeaderMode"></a>L2HeaderMode | Description
---------------|:----- ---------------|:-----

View File

@ -159,17 +159,17 @@ SendAddr | 連線地址VPN網路收到的東西丟去這個地址。僅
[L2HeaderMode](#L2HeaderMode) | 僅限 `stdio` 生效。debug用途有三種模式 [L2HeaderMode](#L2HeaderMode) | 僅限 `stdio` 生效。debug用途有三種模式
<a name="IType"></a>IType | Description <a name="IType"></a>IType | Description
-----------|:----- ---------------|:-----
dummy | 收到的封包直接丟棄,但幫忙轉發。作為中繼節點,本身不加入網路使用 dummy | 收到的封包直接丟棄,但幫忙轉發。作為中繼節點,本身不加入網路使用
stdio | 收到的封包丟stdoutstdin進來的資料丟入vpn網路debug用途<br>需要參數: `MacAddrPrefix` && `L2HeaderMode` stdio | 收到的封包丟stdoutstdin進來的資料丟入vpn網路debug用途<br>需要參數: `MacAddrPrefix` && `L2HeaderMode`
udpsock | 收到的封包丟去一個udp socket<br>需要參數: `RecvAddr` && `SendAddr` udpsock | 收到的封包丟去一個udp socket<br>需要參數: `RecvAddr` && `SendAddr`
tcpsock | 收到的封包丟去一個tcp socket<br>需要參數: `RecvAddr` \|\| `SendAddr` tcpsock | 收到的封包丟去一個tcp socket<br>需要參數: `RecvAddr` \|\| `SendAddr`
unixsock | 收到的封包丟去一個unix socket(SOCK_STREAM 模式)<br>需要參數: `RecvAddr` \|\| `SendAddr` unixsock | 收到的封包丟去一個unix socket(SOCK_STREAM 模式)<br>需要參數: `RecvAddr` \|\| `SendAddr`
udpsock | 收到的封包丟去一個unix socket(SOCK_DGRAM 模式)<br>需要參數: `RecvAddr` \|\| `SendAddr` unixgramsock | 收到的封包丟去一個unix socket(SOCK_DGRAM 模式)<br>需要參數: `RecvAddr` \|\| `SendAddr`
udpsock | 收到的封包丟去一個unix socket(SOCK_SEQPACKET 模式)<br>需要參數: `RecvAddr` \|\| `SendAddr` unixpacketsock | 收到的封包丟去一個unix socket(SOCK_SEQPACKET 模式)<br>需要參數: `RecvAddr` \|\| `SendAddr`
fd | 收到的封包丟去一個特定的file descriptor<br>需要參數: 無. 但是使用環境變數 `EG_FD_RX` && `EG_FD_TX` 來指定 fd | 收到的封包丟去一個特定的file descriptor<br>需要參數: 無. 但是使用環境變數 `EG_FD_RX` && `EG_FD_TX` 來指定
vpp | 使用libmemif使vpp加入VPN網路<br>需要參數: `Name` && `VPPIFaceID` && `VPPBridgeID` && `MacAddrPrefix` && `MTU` vpp | 使用libmemif使vpp加入VPN網路<br>需要參數: `Name` && `VPPIFaceID` && `VPPBridgeID` && `MacAddrPrefix` && `MTU`
tap | Linux的tap設備。讓linux加入VPN網路<br>需要參數: `Name` && `MacAddrPrefix` && `MTU`<br>可選參數:`IPv4CIDR` , `IPv6CIDR` , `IPv6LLPrefix` tap | Linux的tap設備。讓linux加入VPN網路<br>需要參數: `Name` && `MacAddrPrefix` && `MTU`<br>可選參數:`IPv4CIDR` , `IPv6CIDR` , `IPv6LLPrefix`
<a name="L2HeaderMode"></a>L2HeaderMode | Description <a name="L2HeaderMode"></a>L2HeaderMode | Description
---------------|:----- ---------------|:-----

View File

@ -13,6 +13,7 @@ import (
var forever = time.Hour * 99999 var forever = time.Hour * 99999
func (g *IG) InitNTP() { func (g *IG) InitNTP() {
g.ntp_init_t = time.Now()
if g.ntp_info.UseNTP { if g.ntp_info.UseNTP {
if len(g.ntp_info.Servers) == 0 { if len(g.ntp_info.Servers) == 0 {
g.ntp_info.UseNTP = false g.ntp_info.UseNTP = false
@ -72,12 +73,15 @@ func (g *IG) SyncTimeMultiple(count int) {
g.ntp_servers.Sort(func(a *orderedmap.Pair, b *orderedmap.Pair) bool { g.ntp_servers.Sort(func(a *orderedmap.Pair, b *orderedmap.Pair) bool {
return a.Value().(ntp.Response).RTT < b.Value().(ntp.Response).RTT return a.Value().(ntp.Response).RTT < b.Value().(ntp.Response).RTT
}) })
results := make([]time.Duration, count) results := make([]time.Duration, 0, count)
for _, url := range g.ntp_servers.Keys() { for index, url := range g.ntp_servers.Keys() {
val, has := g.ntp_servers.Get(url) val, has := g.ntp_servers.Get(url)
if !has { if !has {
continue continue
} }
if index >= count {
break
}
result := val.(ntp.Response) result := val.(ntp.Response)
if result.RTT < forever { if result.RTT < forever {
results = append(results, result.ClockOffset) results = append(results, result.ClockOffset)
@ -117,7 +121,7 @@ func (g *IG) SyncTime(url string, timeout time.Duration) {
fmt.Println("NTP: NTP server :" + url + "\tFailed :" + err.Error()) fmt.Println("NTP: NTP server :" + url + "\tFailed :" + err.Error())
} }
g.ntp_servers.Set(url, ntp.Response{ g.ntp_servers.Set(url, ntp.Response{
RTT: forever, RTT: forever + time.Since(g.ntp_init_t),
}) })
} }
g.ntp_wg.Done() g.ntp_wg.Done()

View File

@ -49,6 +49,7 @@ type IG struct {
ntp_wg sync.WaitGroup ntp_wg sync.WaitGroup
ntp_info mtypes.NTPInfo ntp_info mtypes.NTPInfo
ntp_init_t time.Time
ntp_offset time.Duration ntp_offset time.Duration
ntp_servers orderedmap.OrderedMap // serverurl:lentancy ntp_servers orderedmap.OrderedMap // serverurl:lentancy
} }