Просмотр исходного кода

eliminate copy-paste in pinger

Nikolay Sivko 4 лет назад
Родитель
Сommit
21d3efcfd1
1 измененных файлов с 14 добавлено и 27 удалено
  1. 14 27
      pinger/pinger.go

+ 14 - 27
pinger/pinger.go

@@ -133,14 +133,8 @@ func send(conn *net.IPConn, seq int, ip net.Addr) error {
 	return err
 }
 
-func getTxTimestamp(socketFd int) (time.Time, error) {
+func getTimestampFromOutOfBandData(oob []byte, oobn int) (time.Time, error) {
 	var t time.Time
-	pktBuf := make([]byte, 1024)
-	oob := make([]byte, 1024)
-	_, oobn, _, _, err := syscall.Recvmsg(socketFd, pktBuf, oob, syscall.MSG_ERRQUEUE)
-	if err != nil {
-		return t, err
-	}
 	cms, err := syscall.ParseSocketControlMessage(oob[:oobn])
 	if err != nil {
 		return t, err
@@ -154,7 +148,18 @@ func getTxTimestamp(socketFd int) (time.Time, error) {
 			return time.Unix(tv.Unix()), nil
 		}
 	}
-	return t, errors.New("empty response")
+	return t, errors.New("no timestamp found")
+}
+
+func getTxTimestamp(socketFd int) (time.Time, error) {
+	pktBuf := make([]byte, 1024)
+	oob := make([]byte, 1024)
+	var t time.Time
+	_, oobn, _, _, err := syscall.Recvmsg(socketFd, pktBuf, oob, syscall.MSG_ERRQUEUE)
+	if err != nil {
+		return t, err
+	}
+	return getTimestampFromOutOfBandData(oob, oobn)
 }
 
 func receive(conn *net.IPConn) (*net.IPAddr, *icmp.Echo, time.Time, error) {
@@ -174,7 +179,7 @@ func receive(conn *net.IPConn) (*net.IPAddr, *icmp.Echo, time.Time, error) {
 		return nil, nil, ts, err
 	}
 
-	if ts, err = getRxTimestamp(oob, oobn); err != nil {
+	if ts, err = getTimestampFromOutOfBandData(oob, oobn); err != nil {
 		return nil, nil, ts, fmt.Errorf("failed to get RX timestamp: %s", err)
 	}
 
@@ -205,24 +210,6 @@ func extractEchoFromPacket(pktBuf []byte, n int) (*icmp.Echo, error) {
 	return echo, nil
 }
 
-func getRxTimestamp(oob []byte, oobn int) (time.Time, error) {
-	var ts time.Time
-	cms, err := syscall.ParseSocketControlMessage(oob[:oobn])
-	if err != nil {
-		return ts, err
-	}
-	for _, cm := range cms {
-		if cm.Header.Level == syscall.SOL_SOCKET && cm.Header.Type == syscall.SO_TIMESTAMP {
-			var tv syscall.Timeval
-			if err := binary.Read(bytes.NewBuffer(cm.Data), binary.LittleEndian, &tv); err != nil {
-				return ts, err
-			}
-			return time.Unix(tv.Unix()), nil
-		}
-	}
-	return ts, errors.New("invalid out-of-band data")
-}
-
 func openConn() (*net.IPConn, error) {
 	conn, err := net.ListenPacket("ip4:icmp", "0.0.0.0")
 	if err != nil {