From 0dd21e044737d68e52694b7b370f725291436203 Mon Sep 17 00:00:00 2001 From: Felix Geschwindner Date: Thu, 9 Jan 2025 02:08:11 -0800 Subject: [PATCH] Add support for per-interface SNMP6 stats Signed-off-by: Felix Geschwindner --- README.md | 6 +- net_dev_snmp6.go | 96 ++++++++++++ net_dev_snmp6_test.go | 86 ++++++++++ testdata/fixtures.ttar | 348 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 533 insertions(+), 3 deletions(-) create mode 100644 net_dev_snmp6.go create mode 100644 net_dev_snmp6_test.go diff --git a/README.md b/README.md index 1224816c..0718239c 100644 --- a/README.md +++ b/README.md @@ -47,15 +47,15 @@ However, most of the API includes unit tests which can be run with `make test`. The procfs library includes a set of test fixtures which include many example files from the `/proc` and `/sys` filesystems. These fixtures are included as a [ttar](https://github.com/ideaship/ttar) file which is extracted automatically during testing. To add/update the test fixtures, first -ensure the `fixtures` directory is up to date by removing the existing directory and then -extracting the ttar file using `make fixtures/.unpacked` or just `make test`. +ensure the `testdata/fixtures` directory is up to date by removing the existing directory and then +extracting the ttar file using `make testdata/fixtures/.unpacked` or just `make test`. ```bash rm -rf testdata/fixtures make test ``` -Next, make the required changes to the extracted files in the `fixtures` directory. When +Next, make the required changes to the extracted files in the `testdata/fixtures` directory. When the changes are complete, run `make update_fixtures` to create a new `fixtures.ttar` file based on the updated `fixtures` directory. And finally, verify the changes using `git diff testdata/fixtures.ttar`. diff --git a/net_dev_snmp6.go b/net_dev_snmp6.go new file mode 100644 index 00000000..f50b38e3 --- /dev/null +++ b/net_dev_snmp6.go @@ -0,0 +1,96 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "errors" + "io" + "os" + "strconv" + "strings" +) + +// NetDevSNMP6 is parsed from files in /proc/net/dev_snmp6/ or /proc//net/dev_snmp6/. +// The outer map's keys are interface names and the inner map's keys are stat names. +// +// If you'd like a total across all interfaces, please use the Snmp6() method of the Proc type. +type NetDevSNMP6 map[string]map[string]uint64 + +// Returns kernel/system statistics read from interface files within the /proc/net/dev_snmp6/ +// directory. +func (fs FS) NetDevSNMP6() (NetDevSNMP6, error) { + return newNetDevSNMP6(fs.proc.Path("net/dev_snmp6")) +} + +// Returns kernel/system statistics read from interface files within the /proc//net/dev_snmp6/ +// directory. +func (p Proc) NetDevSNMP6() (NetDevSNMP6, error) { + return newNetDevSNMP6(p.path("net/dev_snmp6")) +} + +// newNetDevSNMP6 creates a new NetDevSNMP6 from the contents of the given directory. +func newNetDevSNMP6(dir string) (NetDevSNMP6, error) { + netDevSNMP6 := make(NetDevSNMP6) + + // The net/dev_snmp6 folders contain one file per interface + ifaceFiles, err := os.ReadDir(dir) + if err != nil { + // On systems with IPv6 disabled, this directory won't exist. + // Do nothing. + if errors.Is(err, os.ErrNotExist) { + return netDevSNMP6, err + } + return netDevSNMP6, err + } + + for _, iFaceFile := range ifaceFiles { + f, err := os.Open(dir + "/" + iFaceFile.Name()) + if err != nil { + return netDevSNMP6, err + } + defer f.Close() + + netDevSNMP6[iFaceFile.Name()], err = parseNetDevSNMP6Stats(f) + if err != nil { + return netDevSNMP6, err + } + } + + return netDevSNMP6, nil +} + +func parseNetDevSNMP6Stats(r io.Reader) (map[string]uint64, error) { + m := make(map[string]uint64) + + scanner := bufio.NewScanner(r) + for scanner.Scan() { + stat := strings.Fields(scanner.Text()) + if len(stat) < 2 { + continue + } + key, val := stat[0], stat[1] + + // Expect stat name to contain "6" or be "ifIndex" + if strings.Contains(key, "6") || key == "ifIndex" { + v, err := strconv.ParseUint(val, 10, 64) + if err != nil { + return m, err + } + + m[key] = v + } + } + return m, scanner.Err() +} diff --git a/net_dev_snmp6_test.go b/net_dev_snmp6_test.go new file mode 100644 index 00000000..7df3af21 --- /dev/null +++ b/net_dev_snmp6_test.go @@ -0,0 +1,86 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "fmt" + "testing" +) + +func TestNetDevSNMP6(t *testing.T) { + fs, err := NewFS(procTestFixtures) + if err != nil { + t.Fatal(err) + } + + netDevSNMP6, err := fs.NetDevSNMP6() + if err != nil { + t.Fatal(err) + } + + if err := validateNetDevSNMP6(netDevSNMP6); err != nil { + t.Error(err.Error()) + } +} + +func TestProcNetDevSNMP6(t *testing.T) { + p, err := getProcFixtures(t).Proc(26231) + if err != nil { + t.Fatal(err) + } + + procNetDevSNMP6, err := p.NetDevSNMP6() + if err != nil { + t.Fatal(err) + } + + if err := validateNetDevSNMP6(procNetDevSNMP6); err != nil { + t.Error(err.Error()) + } +} + +func validateNetDevSNMP6(have NetDevSNMP6) error { + var wantNetDevSNMP6 = map[string]map[string]uint64{ + "eth0": map[string]uint64{ + "ifIndex": 1, + "Ip6InOctets": 14064059261, + "Ip6OutOctets": 811213622, + "Icmp6InMsgs": 53293, + "Icmp6OutMsgs": 20400, + }, + "eth1": map[string]uint64{ + "ifIndex": 2, + "Ip6InOctets": 303177290674, + "Ip6OutOctets": 29245052746, + "Icmp6InMsgs": 37911, + "Icmp6OutMsgs": 114015, + }, + } + + for wantIface, wantData := range wantNetDevSNMP6 { + if haveData, ok := have[wantIface]; ok { + for wantStat, wantVal := range wantData { + if haveVal, ok := haveData[wantStat]; !ok { + return fmt.Errorf("stat %s missing from %s test data", wantStat, wantIface) + } else if wantVal != haveVal { + return fmt.Errorf("%s - %s: want %d, have %d", wantIface, wantStat, wantVal, haveVal) + } + } + } else { + return fmt.Errorf("%s not found in test data", wantIface) + } + } + + return nil +} diff --git a/testdata/fixtures.ttar b/testdata/fixtures.ttar index dfbcd345..f12e7fbe 100644 --- a/testdata/fixtures.ttar +++ b/testdata/fixtures.ttar @@ -209,6 +209,180 @@ Inter-| Receive | Transmit eth0: 438 5 0 0 0 0 0 0 648 8 0 0 0 0 0 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/26231/net/dev_snmp6 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/net/dev_snmp6/eth0 +Lines: 83 +ifIndex 1 +Ip6InReceives 3057229 +Ip6InHdrErrors 0 +Ip6InTooBigErrors 0 +Ip6InNoRoutes 0 +Ip6InAddrErrors 0 +Ip6InUnknownProtos 0 +Ip6InTruncatedPkts 0 +Ip6InDiscards 0 +Ip6InDelivers 3056375 +Ip6OutForwDatagrams 0 +Ip6OutRequests 2359950 +Ip6OutDiscards 0 +Ip6OutNoRoutes 0 +Ip6ReasmTimeout 0 +Ip6ReasmReqds 0 +Ip6ReasmOKs 0 +Ip6ReasmFails 0 +Ip6FragOKs 0 +Ip6FragFails 5 +Ip6FragCreates 0 +Ip6InMcastPkts 40895 +Ip6OutMcastPkts 6221 +Ip6InOctets 14064059261 +Ip6OutOctets 811213622 +Ip6InMcastOctets 3425239 +Ip6OutMcastOctets 791888 +Ip6InBcastOctets 0 +Ip6OutBcastOctets 0 +Ip6InNoECTPkts 10518218 +Ip6InECT1Pkts 0 +Ip6InECT0Pkts 179561 +Ip6InCEPkts 0 +Ip6OutTransmits 2359950 +Icmp6InMsgs 53293 +Icmp6InErrors 0 +Icmp6OutMsgs 20400 +Icmp6OutErrors 0 +Icmp6InCsumErrors 0 +Icmp6OutRateLimitHost 0 +Icmp6InDestUnreachs 306 +Icmp6InPktTooBigs 12 +Icmp6InTimeExcds 0 +Icmp6InParmProblems 0 +Icmp6InEchos 11 +Icmp6InEchoReplies 0 +Icmp6InGroupMembQueries 0 +Icmp6InGroupMembResponses 0 +Icmp6InGroupMembReductions 0 +Icmp6InRouterSolicits 0 +Icmp6InRouterAdvertisements 16615 +Icmp6InNeighborSolicits 8892 +Icmp6InNeighborAdvertisements 27457 +Icmp6InRedirects 0 +Icmp6InMLDv2Reports 0 +Icmp6OutDestUnreachs 275 +Icmp6OutPktTooBigs 5 +Icmp6OutTimeExcds 0 +Icmp6OutParmProblems 0 +Icmp6OutEchos 0 +Icmp6OutEchoReplies 11 +Icmp6OutGroupMembQueries 0 +Icmp6OutGroupMembResponses 0 +Icmp6OutGroupMembReductions 0 +Icmp6OutRouterSolicits 1 +Icmp6OutRouterAdvertisements 0 +Icmp6OutNeighborSolicits 5864 +Icmp6OutNeighborAdvertisements 8891 +Icmp6OutRedirects 0 +Icmp6OutMLDv2Reports 5353 +Icmp6InType1 306 +Icmp6InType2 12 +Icmp6InType128 11 +Icmp6InType134 16615 +Icmp6InType135 8892 +Icmp6InType136 27457 +Icmp6OutType1 275 +Icmp6OutType2 5 +Icmp6OutType129 11 +Icmp6OutType133 1 +Icmp6OutType135 5864 +Icmp6OutType136 8891 +Icmp6OutType143 5353 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/26231/net/dev_snmp6/eth1 +Lines: 80 +ifIndex 2 +Ip6InReceives 234373162 +Ip6InHdrErrors 12 +Ip6InTooBigErrors 0 +Ip6InNoRoutes 48 +Ip6InAddrErrors 0 +Ip6InUnknownProtos 0 +Ip6InTruncatedPkts 0 +Ip6InDiscards 0 +Ip6InDelivers 2023911 +Ip6OutForwDatagrams 43716990 +Ip6OutRequests 2185080 +Ip6OutDiscards 0 +Ip6OutNoRoutes 0 +Ip6ReasmTimeout 0 +Ip6ReasmReqds 0 +Ip6ReasmOKs 0 +Ip6ReasmFails 0 +Ip6FragOKs 0 +Ip6FragFails 0 +Ip6FragCreates 0 +Ip6InMcastPkts 7648 +Ip6OutMcastPkts 15218 +Ip6InOctets 303177290674 +Ip6OutOctets 29245052746 +Ip6InMcastOctets 805916 +Ip6OutMcastOctets 2976102 +Ip6InBcastOctets 0 +Ip6OutBcastOctets 0 +Ip6InNoECTPkts 152608869 +Ip6InECT1Pkts 73833 +Ip6InECT0Pkts 81686963 +Ip6InCEPkts 3497 +Ip6OutTransmits 47151828 +Icmp6InMsgs 37911 +Icmp6InErrors 3 +Icmp6OutMsgs 114015 +Icmp6OutErrors 0 +Icmp6InCsumErrors 0 +Icmp6OutRateLimitHost 1899 +Icmp6InDestUnreachs 12 +Icmp6InPktTooBigs 0 +Icmp6InTimeExcds 0 +Icmp6InParmProblems 0 +Icmp6InEchos 0 +Icmp6InEchoReplies 0 +Icmp6InGroupMembQueries 0 +Icmp6InGroupMembResponses 0 +Icmp6InGroupMembReductions 0 +Icmp6InRouterSolicits 0 +Icmp6InRouterAdvertisements 7521 +Icmp6InNeighborSolicits 13184 +Icmp6InNeighborAdvertisements 17194 +Icmp6InRedirects 0 +Icmp6InMLDv2Reports 0 +Icmp6OutDestUnreachs 68537 +Icmp6OutPktTooBigs 0 +Icmp6OutTimeExcds 12 +Icmp6OutParmProblems 0 +Icmp6OutEchos 0 +Icmp6OutEchoReplies 0 +Icmp6OutGroupMembQueries 0 +Icmp6OutGroupMembResponses 0 +Icmp6OutGroupMembReductions 0 +Icmp6OutRouterSolicits 7 +Icmp6OutRouterAdvertisements 0 +Icmp6OutNeighborSolicits 17216 +Icmp6OutNeighborAdvertisements 13184 +Icmp6OutRedirects 0 +Icmp6OutMLDv2Reports 15059 +Icmp6InType1 12 +Icmp6InType134 7521 +Icmp6InType135 13184 +Icmp6InType136 17194 +Icmp6OutType1 68537 +Icmp6OutType3 12 +Icmp6OutType133 7 +Icmp6OutType135 17216 +Icmp6OutType136 13184 +Icmp6OutType143 15059 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/proc/26231/net/netstat Lines: 4 TcpExt: SyncookiesSent SyncookiesRecv SyncookiesFailed EmbryonicRsts PruneCalled RcvPruned OfoPruned OutOfWindowIcmps LockDroppedIcmps ArpFilter TW TWRecycled TWKilled PAWSActive PAWSEstab DelayedACKs DelayedACKLocked DelayedACKLost ListenOverflows ListenDrops TCPHPHits TCPPureAcks TCPHPAcks TCPRenoRecovery TCPSackRecovery TCPSACKReneging TCPSACKReorder TCPRenoReorder TCPTSReorder TCPFullUndo TCPPartialUndo TCPDSACKUndo TCPLossUndo TCPLostRetransmit TCPRenoFailures TCPSackFailures TCPLossFailures TCPFastRetrans TCPSlowStartRetrans TCPTimeouts TCPLossProbes TCPLossProbeRecovery TCPRenoRecoveryFail TCPSackRecoveryFail TCPRcvCollapsed TCPDSACKOldSent TCPDSACKOfoSent TCPDSACKRecv TCPDSACKOfoRecv TCPAbortOnData TCPAbortOnClose TCPAbortOnMemory TCPAbortOnTimeout TCPAbortOnLinger TCPAbortFailed TCPMemoryPressures TCPMemoryPressuresChrono TCPSACKDiscard TCPDSACKIgnoredOld TCPDSACKIgnoredNoUndo TCPSpuriousRTOs TCPMD5NotFound TCPMD5Unexpected TCPMD5Failure TCPSackShifted TCPSackMerged TCPSackShiftFallback TCPBacklogDrop PFMemallocDrop TCPMinTTLDrop TCPDeferAcceptDrop IPReversePathFilter TCPTimeWaitOverflow TCPReqQFullDoCookies TCPReqQFullDrop TCPRetransFail TCPRcvCoalesce TCPRcvQDrop TCPOFOQueue TCPOFODrop TCPOFOMerge TCPChallengeACK TCPSYNChallenge TCPFastOpenActive TCPFastOpenActiveFail TCPFastOpenPassive TCPFastOpenPassiveFail TCPFastOpenListenOverflow TCPFastOpenCookieReqd TCPFastOpenBlackhole TCPSpuriousRtxHostQueues BusyPollRxPackets TCPAutoCorking TCPFromZeroWindowAdv TCPToZeroWindowAdv TCPWantZeroWindowAdv TCPSynRetrans TCPOrigDataSent TCPHystartTrainDetect TCPHystartTrainCwnd TCPHystartDelayDetect TCPHystartDelayCwnd TCPACKSkippedSynRecv TCPACKSkippedPAWS TCPACKSkippedSeq TCPACKSkippedFinWait2 TCPACKSkippedTimeWait TCPACKSkippedChallenge TCPWinProbe TCPKeepAlive TCPMTUPFail TCPMTUPSuccess TCPWqueueTooBig @@ -2383,6 +2557,180 @@ docker0: 2568 38 0 0 0 0 0 0 438 eth0: 874354587 1036395 0 0 0 0 0 0 563352563 732147 0 0 0 0 0 0 Mode: 644 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/proc/net/dev_snmp6 +Mode: 755 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/dev_snmp6/eth0 +Lines: 83 +ifIndex 1 +Ip6InReceives 3057229 +Ip6InHdrErrors 0 +Ip6InTooBigErrors 0 +Ip6InNoRoutes 0 +Ip6InAddrErrors 0 +Ip6InUnknownProtos 0 +Ip6InTruncatedPkts 0 +Ip6InDiscards 0 +Ip6InDelivers 3056375 +Ip6OutForwDatagrams 0 +Ip6OutRequests 2359950 +Ip6OutDiscards 0 +Ip6OutNoRoutes 0 +Ip6ReasmTimeout 0 +Ip6ReasmReqds 0 +Ip6ReasmOKs 0 +Ip6ReasmFails 0 +Ip6FragOKs 0 +Ip6FragFails 5 +Ip6FragCreates 0 +Ip6InMcastPkts 40895 +Ip6OutMcastPkts 6221 +Ip6InOctets 14064059261 +Ip6OutOctets 811213622 +Ip6InMcastOctets 3425239 +Ip6OutMcastOctets 791888 +Ip6InBcastOctets 0 +Ip6OutBcastOctets 0 +Ip6InNoECTPkts 10518218 +Ip6InECT1Pkts 0 +Ip6InECT0Pkts 179561 +Ip6InCEPkts 0 +Ip6OutTransmits 2359950 +Icmp6InMsgs 53293 +Icmp6InErrors 0 +Icmp6OutMsgs 20400 +Icmp6OutErrors 0 +Icmp6InCsumErrors 0 +Icmp6OutRateLimitHost 0 +Icmp6InDestUnreachs 306 +Icmp6InPktTooBigs 12 +Icmp6InTimeExcds 0 +Icmp6InParmProblems 0 +Icmp6InEchos 11 +Icmp6InEchoReplies 0 +Icmp6InGroupMembQueries 0 +Icmp6InGroupMembResponses 0 +Icmp6InGroupMembReductions 0 +Icmp6InRouterSolicits 0 +Icmp6InRouterAdvertisements 16615 +Icmp6InNeighborSolicits 8892 +Icmp6InNeighborAdvertisements 27457 +Icmp6InRedirects 0 +Icmp6InMLDv2Reports 0 +Icmp6OutDestUnreachs 275 +Icmp6OutPktTooBigs 5 +Icmp6OutTimeExcds 0 +Icmp6OutParmProblems 0 +Icmp6OutEchos 0 +Icmp6OutEchoReplies 11 +Icmp6OutGroupMembQueries 0 +Icmp6OutGroupMembResponses 0 +Icmp6OutGroupMembReductions 0 +Icmp6OutRouterSolicits 1 +Icmp6OutRouterAdvertisements 0 +Icmp6OutNeighborSolicits 5864 +Icmp6OutNeighborAdvertisements 8891 +Icmp6OutRedirects 0 +Icmp6OutMLDv2Reports 5353 +Icmp6InType1 306 +Icmp6InType2 12 +Icmp6InType128 11 +Icmp6InType134 16615 +Icmp6InType135 8892 +Icmp6InType136 27457 +Icmp6OutType1 275 +Icmp6OutType2 5 +Icmp6OutType129 11 +Icmp6OutType133 1 +Icmp6OutType135 5864 +Icmp6OutType136 8891 +Icmp6OutType143 5353 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/proc/net/dev_snmp6/eth1 +Lines: 80 +ifIndex 2 +Ip6InReceives 234373162 +Ip6InHdrErrors 12 +Ip6InTooBigErrors 0 +Ip6InNoRoutes 48 +Ip6InAddrErrors 0 +Ip6InUnknownProtos 0 +Ip6InTruncatedPkts 0 +Ip6InDiscards 0 +Ip6InDelivers 2023911 +Ip6OutForwDatagrams 43716990 +Ip6OutRequests 2185080 +Ip6OutDiscards 0 +Ip6OutNoRoutes 0 +Ip6ReasmTimeout 0 +Ip6ReasmReqds 0 +Ip6ReasmOKs 0 +Ip6ReasmFails 0 +Ip6FragOKs 0 +Ip6FragFails 0 +Ip6FragCreates 0 +Ip6InMcastPkts 7648 +Ip6OutMcastPkts 15218 +Ip6InOctets 303177290674 +Ip6OutOctets 29245052746 +Ip6InMcastOctets 805916 +Ip6OutMcastOctets 2976102 +Ip6InBcastOctets 0 +Ip6OutBcastOctets 0 +Ip6InNoECTPkts 152608869 +Ip6InECT1Pkts 73833 +Ip6InECT0Pkts 81686963 +Ip6InCEPkts 3497 +Ip6OutTransmits 47151828 +Icmp6InMsgs 37911 +Icmp6InErrors 3 +Icmp6OutMsgs 114015 +Icmp6OutErrors 0 +Icmp6InCsumErrors 0 +Icmp6OutRateLimitHost 1899 +Icmp6InDestUnreachs 12 +Icmp6InPktTooBigs 0 +Icmp6InTimeExcds 0 +Icmp6InParmProblems 0 +Icmp6InEchos 0 +Icmp6InEchoReplies 0 +Icmp6InGroupMembQueries 0 +Icmp6InGroupMembResponses 0 +Icmp6InGroupMembReductions 0 +Icmp6InRouterSolicits 0 +Icmp6InRouterAdvertisements 7521 +Icmp6InNeighborSolicits 13184 +Icmp6InNeighborAdvertisements 17194 +Icmp6InRedirects 0 +Icmp6InMLDv2Reports 0 +Icmp6OutDestUnreachs 68537 +Icmp6OutPktTooBigs 0 +Icmp6OutTimeExcds 12 +Icmp6OutParmProblems 0 +Icmp6OutEchos 0 +Icmp6OutEchoReplies 0 +Icmp6OutGroupMembQueries 0 +Icmp6OutGroupMembResponses 0 +Icmp6OutGroupMembReductions 0 +Icmp6OutRouterSolicits 7 +Icmp6OutRouterAdvertisements 0 +Icmp6OutNeighborSolicits 17216 +Icmp6OutNeighborAdvertisements 13184 +Icmp6OutRedirects 0 +Icmp6OutMLDv2Reports 15059 +Icmp6InType1 12 +Icmp6InType134 7521 +Icmp6InType135 13184 +Icmp6InType136 17194 +Icmp6OutType1 68537 +Icmp6OutType3 12 +Icmp6OutType133 7 +Icmp6OutType135 17216 +Icmp6OutType136 13184 +Icmp6OutType143 15059 +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path: fixtures/proc/net/ip_vs Lines: 21 IP Virtual Server version 1.2.1 (size=4096)