github.com/hxx258456/ccgo@v0.0.5-0.20230213014102-48b35f46f66f/grpc/channelz/service/func_linux.go (about) 1 /* 2 * 3 * Copyright 2018 gRPC authors. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 */ 18 19 package service 20 21 import ( 22 "time" 23 24 "github.com/golang/protobuf/ptypes" 25 durpb "github.com/golang/protobuf/ptypes/duration" 26 channelzpb "github.com/hxx258456/ccgo/grpc/channelz/grpc_channelz_v1" 27 "github.com/hxx258456/ccgo/grpc/internal/channelz" 28 "github.com/hxx258456/ccgo/grpc/internal/testutils" 29 ) 30 31 func convertToPtypesDuration(sec int64, usec int64) *durpb.Duration { 32 return ptypes.DurationProto(time.Duration(sec*1e9 + usec*1e3)) 33 } 34 35 func sockoptToProto(skopts *channelz.SocketOptionData) []*channelzpb.SocketOption { 36 var opts []*channelzpb.SocketOption 37 if skopts.Linger != nil { 38 opts = append(opts, &channelzpb.SocketOption{ 39 Name: "SO_LINGER", 40 Additional: testutils.MarshalAny(&channelzpb.SocketOptionLinger{ 41 Active: skopts.Linger.Onoff != 0, 42 Duration: convertToPtypesDuration(int64(skopts.Linger.Linger), 0), 43 }), 44 }) 45 } 46 if skopts.RecvTimeout != nil { 47 opts = append(opts, &channelzpb.SocketOption{ 48 Name: "SO_RCVTIMEO", 49 Additional: testutils.MarshalAny(&channelzpb.SocketOptionTimeout{ 50 Duration: convertToPtypesDuration(int64(skopts.RecvTimeout.Sec), int64(skopts.RecvTimeout.Usec)), 51 }), 52 }) 53 } 54 if skopts.SendTimeout != nil { 55 opts = append(opts, &channelzpb.SocketOption{ 56 Name: "SO_SNDTIMEO", 57 Additional: testutils.MarshalAny(&channelzpb.SocketOptionTimeout{ 58 Duration: convertToPtypesDuration(int64(skopts.SendTimeout.Sec), int64(skopts.SendTimeout.Usec)), 59 }), 60 }) 61 } 62 if skopts.TCPInfo != nil { 63 additional := testutils.MarshalAny(&channelzpb.SocketOptionTcpInfo{ 64 TcpiState: uint32(skopts.TCPInfo.State), 65 TcpiCaState: uint32(skopts.TCPInfo.Ca_state), 66 TcpiRetransmits: uint32(skopts.TCPInfo.Retransmits), 67 TcpiProbes: uint32(skopts.TCPInfo.Probes), 68 TcpiBackoff: uint32(skopts.TCPInfo.Backoff), 69 TcpiOptions: uint32(skopts.TCPInfo.Options), 70 // https://golang.org/pkg/syscall/#TCPInfo 71 // TCPInfo struct does not contain info about TcpiSndWscale and TcpiRcvWscale. 72 TcpiRto: skopts.TCPInfo.Rto, 73 TcpiAto: skopts.TCPInfo.Ato, 74 TcpiSndMss: skopts.TCPInfo.Snd_mss, 75 TcpiRcvMss: skopts.TCPInfo.Rcv_mss, 76 TcpiUnacked: skopts.TCPInfo.Unacked, 77 TcpiSacked: skopts.TCPInfo.Sacked, 78 TcpiLost: skopts.TCPInfo.Lost, 79 TcpiRetrans: skopts.TCPInfo.Retrans, 80 TcpiFackets: skopts.TCPInfo.Fackets, 81 TcpiLastDataSent: skopts.TCPInfo.Last_data_sent, 82 TcpiLastAckSent: skopts.TCPInfo.Last_ack_sent, 83 TcpiLastDataRecv: skopts.TCPInfo.Last_data_recv, 84 TcpiLastAckRecv: skopts.TCPInfo.Last_ack_recv, 85 TcpiPmtu: skopts.TCPInfo.Pmtu, 86 TcpiRcvSsthresh: skopts.TCPInfo.Rcv_ssthresh, 87 TcpiRtt: skopts.TCPInfo.Rtt, 88 TcpiRttvar: skopts.TCPInfo.Rttvar, 89 TcpiSndSsthresh: skopts.TCPInfo.Snd_ssthresh, 90 TcpiSndCwnd: skopts.TCPInfo.Snd_cwnd, 91 TcpiAdvmss: skopts.TCPInfo.Advmss, 92 TcpiReordering: skopts.TCPInfo.Reordering, 93 }) 94 opts = append(opts, &channelzpb.SocketOption{ 95 Name: "TCP_INFO", 96 Additional: additional, 97 }) 98 } 99 return opts 100 }