441 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			441 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2022 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"
 | 
						|
	"bytes"
 | 
						|
	"fmt"
 | 
						|
	"io"
 | 
						|
	"strconv"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"github.com/prometheus/procfs/internal/util"
 | 
						|
)
 | 
						|
 | 
						|
// ProcNetstat models the content of /proc/<pid>/net/netstat.
 | 
						|
type ProcNetstat struct {
 | 
						|
	// The process ID.
 | 
						|
	PID int
 | 
						|
	TcpExt
 | 
						|
	IpExt
 | 
						|
}
 | 
						|
 | 
						|
type TcpExt struct { // nolint:revive
 | 
						|
	SyncookiesSent            float64
 | 
						|
	SyncookiesRecv            float64
 | 
						|
	SyncookiesFailed          float64
 | 
						|
	EmbryonicRsts             float64
 | 
						|
	PruneCalled               float64
 | 
						|
	RcvPruned                 float64
 | 
						|
	OfoPruned                 float64
 | 
						|
	OutOfWindowIcmps          float64
 | 
						|
	LockDroppedIcmps          float64
 | 
						|
	ArpFilter                 float64
 | 
						|
	TW                        float64
 | 
						|
	TWRecycled                float64
 | 
						|
	TWKilled                  float64
 | 
						|
	PAWSActive                float64
 | 
						|
	PAWSEstab                 float64
 | 
						|
	DelayedACKs               float64
 | 
						|
	DelayedACKLocked          float64
 | 
						|
	DelayedACKLost            float64
 | 
						|
	ListenOverflows           float64
 | 
						|
	ListenDrops               float64
 | 
						|
	TCPHPHits                 float64
 | 
						|
	TCPPureAcks               float64
 | 
						|
	TCPHPAcks                 float64
 | 
						|
	TCPRenoRecovery           float64
 | 
						|
	TCPSackRecovery           float64
 | 
						|
	TCPSACKReneging           float64
 | 
						|
	TCPSACKReorder            float64
 | 
						|
	TCPRenoReorder            float64
 | 
						|
	TCPTSReorder              float64
 | 
						|
	TCPFullUndo               float64
 | 
						|
	TCPPartialUndo            float64
 | 
						|
	TCPDSACKUndo              float64
 | 
						|
	TCPLossUndo               float64
 | 
						|
	TCPLostRetransmit         float64
 | 
						|
	TCPRenoFailures           float64
 | 
						|
	TCPSackFailures           float64
 | 
						|
	TCPLossFailures           float64
 | 
						|
	TCPFastRetrans            float64
 | 
						|
	TCPSlowStartRetrans       float64
 | 
						|
	TCPTimeouts               float64
 | 
						|
	TCPLossProbes             float64
 | 
						|
	TCPLossProbeRecovery      float64
 | 
						|
	TCPRenoRecoveryFail       float64
 | 
						|
	TCPSackRecoveryFail       float64
 | 
						|
	TCPRcvCollapsed           float64
 | 
						|
	TCPDSACKOldSent           float64
 | 
						|
	TCPDSACKOfoSent           float64
 | 
						|
	TCPDSACKRecv              float64
 | 
						|
	TCPDSACKOfoRecv           float64
 | 
						|
	TCPAbortOnData            float64
 | 
						|
	TCPAbortOnClose           float64
 | 
						|
	TCPAbortOnMemory          float64
 | 
						|
	TCPAbortOnTimeout         float64
 | 
						|
	TCPAbortOnLinger          float64
 | 
						|
	TCPAbortFailed            float64
 | 
						|
	TCPMemoryPressures        float64
 | 
						|
	TCPMemoryPressuresChrono  float64
 | 
						|
	TCPSACKDiscard            float64
 | 
						|
	TCPDSACKIgnoredOld        float64
 | 
						|
	TCPDSACKIgnoredNoUndo     float64
 | 
						|
	TCPSpuriousRTOs           float64
 | 
						|
	TCPMD5NotFound            float64
 | 
						|
	TCPMD5Unexpected          float64
 | 
						|
	TCPMD5Failure             float64
 | 
						|
	TCPSackShifted            float64
 | 
						|
	TCPSackMerged             float64
 | 
						|
	TCPSackShiftFallback      float64
 | 
						|
	TCPBacklogDrop            float64
 | 
						|
	PFMemallocDrop            float64
 | 
						|
	TCPMinTTLDrop             float64
 | 
						|
	TCPDeferAcceptDrop        float64
 | 
						|
	IPReversePathFilter       float64
 | 
						|
	TCPTimeWaitOverflow       float64
 | 
						|
	TCPReqQFullDoCookies      float64
 | 
						|
	TCPReqQFullDrop           float64
 | 
						|
	TCPRetransFail            float64
 | 
						|
	TCPRcvCoalesce            float64
 | 
						|
	TCPOFOQueue               float64
 | 
						|
	TCPOFODrop                float64
 | 
						|
	TCPOFOMerge               float64
 | 
						|
	TCPChallengeACK           float64
 | 
						|
	TCPSYNChallenge           float64
 | 
						|
	TCPFastOpenActive         float64
 | 
						|
	TCPFastOpenActiveFail     float64
 | 
						|
	TCPFastOpenPassive        float64
 | 
						|
	TCPFastOpenPassiveFail    float64
 | 
						|
	TCPFastOpenListenOverflow float64
 | 
						|
	TCPFastOpenCookieReqd     float64
 | 
						|
	TCPFastOpenBlackhole      float64
 | 
						|
	TCPSpuriousRtxHostQueues  float64
 | 
						|
	BusyPollRxPackets         float64
 | 
						|
	TCPAutoCorking            float64
 | 
						|
	TCPFromZeroWindowAdv      float64
 | 
						|
	TCPToZeroWindowAdv        float64
 | 
						|
	TCPWantZeroWindowAdv      float64
 | 
						|
	TCPSynRetrans             float64
 | 
						|
	TCPOrigDataSent           float64
 | 
						|
	TCPHystartTrainDetect     float64
 | 
						|
	TCPHystartTrainCwnd       float64
 | 
						|
	TCPHystartDelayDetect     float64
 | 
						|
	TCPHystartDelayCwnd       float64
 | 
						|
	TCPACKSkippedSynRecv      float64
 | 
						|
	TCPACKSkippedPAWS         float64
 | 
						|
	TCPACKSkippedSeq          float64
 | 
						|
	TCPACKSkippedFinWait2     float64
 | 
						|
	TCPACKSkippedTimeWait     float64
 | 
						|
	TCPACKSkippedChallenge    float64
 | 
						|
	TCPWinProbe               float64
 | 
						|
	TCPKeepAlive              float64
 | 
						|
	TCPMTUPFail               float64
 | 
						|
	TCPMTUPSuccess            float64
 | 
						|
	TCPWqueueTooBig           float64
 | 
						|
}
 | 
						|
 | 
						|
type IpExt struct { // nolint:revive
 | 
						|
	InNoRoutes      float64
 | 
						|
	InTruncatedPkts float64
 | 
						|
	InMcastPkts     float64
 | 
						|
	OutMcastPkts    float64
 | 
						|
	InBcastPkts     float64
 | 
						|
	OutBcastPkts    float64
 | 
						|
	InOctets        float64
 | 
						|
	OutOctets       float64
 | 
						|
	InMcastOctets   float64
 | 
						|
	OutMcastOctets  float64
 | 
						|
	InBcastOctets   float64
 | 
						|
	OutBcastOctets  float64
 | 
						|
	InCsumErrors    float64
 | 
						|
	InNoECTPkts     float64
 | 
						|
	InECT1Pkts      float64
 | 
						|
	InECT0Pkts      float64
 | 
						|
	InCEPkts        float64
 | 
						|
	ReasmOverlaps   float64
 | 
						|
}
 | 
						|
 | 
						|
func (p Proc) Netstat() (ProcNetstat, error) {
 | 
						|
	filename := p.path("net/netstat")
 | 
						|
	data, err := util.ReadFileNoStat(filename)
 | 
						|
	if err != nil {
 | 
						|
		return ProcNetstat{PID: p.PID}, err
 | 
						|
	}
 | 
						|
	procNetstat, err := parseNetstat(bytes.NewReader(data), filename)
 | 
						|
	procNetstat.PID = p.PID
 | 
						|
	return procNetstat, err
 | 
						|
}
 | 
						|
 | 
						|
// parseNetstat parses the metrics from proc/<pid>/net/netstat file
 | 
						|
// and returns a ProcNetstat structure.
 | 
						|
func parseNetstat(r io.Reader, fileName string) (ProcNetstat, error) {
 | 
						|
	var (
 | 
						|
		scanner     = bufio.NewScanner(r)
 | 
						|
		procNetstat = ProcNetstat{}
 | 
						|
	)
 | 
						|
 | 
						|
	for scanner.Scan() {
 | 
						|
		nameParts := strings.Split(scanner.Text(), " ")
 | 
						|
		scanner.Scan()
 | 
						|
		valueParts := strings.Split(scanner.Text(), " ")
 | 
						|
		// Remove trailing :.
 | 
						|
		protocol := strings.TrimSuffix(nameParts[0], ":")
 | 
						|
		if len(nameParts) != len(valueParts) {
 | 
						|
			return procNetstat, fmt.Errorf("mismatch field count mismatch in %s: %s",
 | 
						|
				fileName, protocol)
 | 
						|
		}
 | 
						|
		for i := 1; i < len(nameParts); i++ {
 | 
						|
			value, err := strconv.ParseFloat(valueParts[i], 64)
 | 
						|
			if err != nil {
 | 
						|
				return procNetstat, err
 | 
						|
			}
 | 
						|
			key := nameParts[i]
 | 
						|
 | 
						|
			switch protocol {
 | 
						|
			case "TcpExt":
 | 
						|
				switch key {
 | 
						|
				case "SyncookiesSent":
 | 
						|
					procNetstat.TcpExt.SyncookiesSent = value
 | 
						|
				case "SyncookiesRecv":
 | 
						|
					procNetstat.TcpExt.SyncookiesRecv = value
 | 
						|
				case "SyncookiesFailed":
 | 
						|
					procNetstat.TcpExt.SyncookiesFailed = value
 | 
						|
				case "EmbryonicRsts":
 | 
						|
					procNetstat.TcpExt.EmbryonicRsts = value
 | 
						|
				case "PruneCalled":
 | 
						|
					procNetstat.TcpExt.PruneCalled = value
 | 
						|
				case "RcvPruned":
 | 
						|
					procNetstat.TcpExt.RcvPruned = value
 | 
						|
				case "OfoPruned":
 | 
						|
					procNetstat.TcpExt.OfoPruned = value
 | 
						|
				case "OutOfWindowIcmps":
 | 
						|
					procNetstat.TcpExt.OutOfWindowIcmps = value
 | 
						|
				case "LockDroppedIcmps":
 | 
						|
					procNetstat.TcpExt.LockDroppedIcmps = value
 | 
						|
				case "ArpFilter":
 | 
						|
					procNetstat.TcpExt.ArpFilter = value
 | 
						|
				case "TW":
 | 
						|
					procNetstat.TcpExt.TW = value
 | 
						|
				case "TWRecycled":
 | 
						|
					procNetstat.TcpExt.TWRecycled = value
 | 
						|
				case "TWKilled":
 | 
						|
					procNetstat.TcpExt.TWKilled = value
 | 
						|
				case "PAWSActive":
 | 
						|
					procNetstat.TcpExt.PAWSActive = value
 | 
						|
				case "PAWSEstab":
 | 
						|
					procNetstat.TcpExt.PAWSEstab = value
 | 
						|
				case "DelayedACKs":
 | 
						|
					procNetstat.TcpExt.DelayedACKs = value
 | 
						|
				case "DelayedACKLocked":
 | 
						|
					procNetstat.TcpExt.DelayedACKLocked = value
 | 
						|
				case "DelayedACKLost":
 | 
						|
					procNetstat.TcpExt.DelayedACKLost = value
 | 
						|
				case "ListenOverflows":
 | 
						|
					procNetstat.TcpExt.ListenOverflows = value
 | 
						|
				case "ListenDrops":
 | 
						|
					procNetstat.TcpExt.ListenDrops = value
 | 
						|
				case "TCPHPHits":
 | 
						|
					procNetstat.TcpExt.TCPHPHits = value
 | 
						|
				case "TCPPureAcks":
 | 
						|
					procNetstat.TcpExt.TCPPureAcks = value
 | 
						|
				case "TCPHPAcks":
 | 
						|
					procNetstat.TcpExt.TCPHPAcks = value
 | 
						|
				case "TCPRenoRecovery":
 | 
						|
					procNetstat.TcpExt.TCPRenoRecovery = value
 | 
						|
				case "TCPSackRecovery":
 | 
						|
					procNetstat.TcpExt.TCPSackRecovery = value
 | 
						|
				case "TCPSACKReneging":
 | 
						|
					procNetstat.TcpExt.TCPSACKReneging = value
 | 
						|
				case "TCPSACKReorder":
 | 
						|
					procNetstat.TcpExt.TCPSACKReorder = value
 | 
						|
				case "TCPRenoReorder":
 | 
						|
					procNetstat.TcpExt.TCPRenoReorder = value
 | 
						|
				case "TCPTSReorder":
 | 
						|
					procNetstat.TcpExt.TCPTSReorder = value
 | 
						|
				case "TCPFullUndo":
 | 
						|
					procNetstat.TcpExt.TCPFullUndo = value
 | 
						|
				case "TCPPartialUndo":
 | 
						|
					procNetstat.TcpExt.TCPPartialUndo = value
 | 
						|
				case "TCPDSACKUndo":
 | 
						|
					procNetstat.TcpExt.TCPDSACKUndo = value
 | 
						|
				case "TCPLossUndo":
 | 
						|
					procNetstat.TcpExt.TCPLossUndo = value
 | 
						|
				case "TCPLostRetransmit":
 | 
						|
					procNetstat.TcpExt.TCPLostRetransmit = value
 | 
						|
				case "TCPRenoFailures":
 | 
						|
					procNetstat.TcpExt.TCPRenoFailures = value
 | 
						|
				case "TCPSackFailures":
 | 
						|
					procNetstat.TcpExt.TCPSackFailures = value
 | 
						|
				case "TCPLossFailures":
 | 
						|
					procNetstat.TcpExt.TCPLossFailures = value
 | 
						|
				case "TCPFastRetrans":
 | 
						|
					procNetstat.TcpExt.TCPFastRetrans = value
 | 
						|
				case "TCPSlowStartRetrans":
 | 
						|
					procNetstat.TcpExt.TCPSlowStartRetrans = value
 | 
						|
				case "TCPTimeouts":
 | 
						|
					procNetstat.TcpExt.TCPTimeouts = value
 | 
						|
				case "TCPLossProbes":
 | 
						|
					procNetstat.TcpExt.TCPLossProbes = value
 | 
						|
				case "TCPLossProbeRecovery":
 | 
						|
					procNetstat.TcpExt.TCPLossProbeRecovery = value
 | 
						|
				case "TCPRenoRecoveryFail":
 | 
						|
					procNetstat.TcpExt.TCPRenoRecoveryFail = value
 | 
						|
				case "TCPSackRecoveryFail":
 | 
						|
					procNetstat.TcpExt.TCPSackRecoveryFail = value
 | 
						|
				case "TCPRcvCollapsed":
 | 
						|
					procNetstat.TcpExt.TCPRcvCollapsed = value
 | 
						|
				case "TCPDSACKOldSent":
 | 
						|
					procNetstat.TcpExt.TCPDSACKOldSent = value
 | 
						|
				case "TCPDSACKOfoSent":
 | 
						|
					procNetstat.TcpExt.TCPDSACKOfoSent = value
 | 
						|
				case "TCPDSACKRecv":
 | 
						|
					procNetstat.TcpExt.TCPDSACKRecv = value
 | 
						|
				case "TCPDSACKOfoRecv":
 | 
						|
					procNetstat.TcpExt.TCPDSACKOfoRecv = value
 | 
						|
				case "TCPAbortOnData":
 | 
						|
					procNetstat.TcpExt.TCPAbortOnData = value
 | 
						|
				case "TCPAbortOnClose":
 | 
						|
					procNetstat.TcpExt.TCPAbortOnClose = value
 | 
						|
				case "TCPDeferAcceptDrop":
 | 
						|
					procNetstat.TcpExt.TCPDeferAcceptDrop = value
 | 
						|
				case "IPReversePathFilter":
 | 
						|
					procNetstat.TcpExt.IPReversePathFilter = value
 | 
						|
				case "TCPTimeWaitOverflow":
 | 
						|
					procNetstat.TcpExt.TCPTimeWaitOverflow = value
 | 
						|
				case "TCPReqQFullDoCookies":
 | 
						|
					procNetstat.TcpExt.TCPReqQFullDoCookies = value
 | 
						|
				case "TCPReqQFullDrop":
 | 
						|
					procNetstat.TcpExt.TCPReqQFullDrop = value
 | 
						|
				case "TCPRetransFail":
 | 
						|
					procNetstat.TcpExt.TCPRetransFail = value
 | 
						|
				case "TCPRcvCoalesce":
 | 
						|
					procNetstat.TcpExt.TCPRcvCoalesce = value
 | 
						|
				case "TCPOFOQueue":
 | 
						|
					procNetstat.TcpExt.TCPOFOQueue = value
 | 
						|
				case "TCPOFODrop":
 | 
						|
					procNetstat.TcpExt.TCPOFODrop = value
 | 
						|
				case "TCPOFOMerge":
 | 
						|
					procNetstat.TcpExt.TCPOFOMerge = value
 | 
						|
				case "TCPChallengeACK":
 | 
						|
					procNetstat.TcpExt.TCPChallengeACK = value
 | 
						|
				case "TCPSYNChallenge":
 | 
						|
					procNetstat.TcpExt.TCPSYNChallenge = value
 | 
						|
				case "TCPFastOpenActive":
 | 
						|
					procNetstat.TcpExt.TCPFastOpenActive = value
 | 
						|
				case "TCPFastOpenActiveFail":
 | 
						|
					procNetstat.TcpExt.TCPFastOpenActiveFail = value
 | 
						|
				case "TCPFastOpenPassive":
 | 
						|
					procNetstat.TcpExt.TCPFastOpenPassive = value
 | 
						|
				case "TCPFastOpenPassiveFail":
 | 
						|
					procNetstat.TcpExt.TCPFastOpenPassiveFail = value
 | 
						|
				case "TCPFastOpenListenOverflow":
 | 
						|
					procNetstat.TcpExt.TCPFastOpenListenOverflow = value
 | 
						|
				case "TCPFastOpenCookieReqd":
 | 
						|
					procNetstat.TcpExt.TCPFastOpenCookieReqd = value
 | 
						|
				case "TCPFastOpenBlackhole":
 | 
						|
					procNetstat.TcpExt.TCPFastOpenBlackhole = value
 | 
						|
				case "TCPSpuriousRtxHostQueues":
 | 
						|
					procNetstat.TcpExt.TCPSpuriousRtxHostQueues = value
 | 
						|
				case "BusyPollRxPackets":
 | 
						|
					procNetstat.TcpExt.BusyPollRxPackets = value
 | 
						|
				case "TCPAutoCorking":
 | 
						|
					procNetstat.TcpExt.TCPAutoCorking = value
 | 
						|
				case "TCPFromZeroWindowAdv":
 | 
						|
					procNetstat.TcpExt.TCPFromZeroWindowAdv = value
 | 
						|
				case "TCPToZeroWindowAdv":
 | 
						|
					procNetstat.TcpExt.TCPToZeroWindowAdv = value
 | 
						|
				case "TCPWantZeroWindowAdv":
 | 
						|
					procNetstat.TcpExt.TCPWantZeroWindowAdv = value
 | 
						|
				case "TCPSynRetrans":
 | 
						|
					procNetstat.TcpExt.TCPSynRetrans = value
 | 
						|
				case "TCPOrigDataSent":
 | 
						|
					procNetstat.TcpExt.TCPOrigDataSent = value
 | 
						|
				case "TCPHystartTrainDetect":
 | 
						|
					procNetstat.TcpExt.TCPHystartTrainDetect = value
 | 
						|
				case "TCPHystartTrainCwnd":
 | 
						|
					procNetstat.TcpExt.TCPHystartTrainCwnd = value
 | 
						|
				case "TCPHystartDelayDetect":
 | 
						|
					procNetstat.TcpExt.TCPHystartDelayDetect = value
 | 
						|
				case "TCPHystartDelayCwnd":
 | 
						|
					procNetstat.TcpExt.TCPHystartDelayCwnd = value
 | 
						|
				case "TCPACKSkippedSynRecv":
 | 
						|
					procNetstat.TcpExt.TCPACKSkippedSynRecv = value
 | 
						|
				case "TCPACKSkippedPAWS":
 | 
						|
					procNetstat.TcpExt.TCPACKSkippedPAWS = value
 | 
						|
				case "TCPACKSkippedSeq":
 | 
						|
					procNetstat.TcpExt.TCPACKSkippedSeq = value
 | 
						|
				case "TCPACKSkippedFinWait2":
 | 
						|
					procNetstat.TcpExt.TCPACKSkippedFinWait2 = value
 | 
						|
				case "TCPACKSkippedTimeWait":
 | 
						|
					procNetstat.TcpExt.TCPACKSkippedTimeWait = value
 | 
						|
				case "TCPACKSkippedChallenge":
 | 
						|
					procNetstat.TcpExt.TCPACKSkippedChallenge = value
 | 
						|
				case "TCPWinProbe":
 | 
						|
					procNetstat.TcpExt.TCPWinProbe = value
 | 
						|
				case "TCPKeepAlive":
 | 
						|
					procNetstat.TcpExt.TCPKeepAlive = value
 | 
						|
				case "TCPMTUPFail":
 | 
						|
					procNetstat.TcpExt.TCPMTUPFail = value
 | 
						|
				case "TCPMTUPSuccess":
 | 
						|
					procNetstat.TcpExt.TCPMTUPSuccess = value
 | 
						|
				case "TCPWqueueTooBig":
 | 
						|
					procNetstat.TcpExt.TCPWqueueTooBig = value
 | 
						|
				}
 | 
						|
			case "IpExt":
 | 
						|
				switch key {
 | 
						|
				case "InNoRoutes":
 | 
						|
					procNetstat.IpExt.InNoRoutes = value
 | 
						|
				case "InTruncatedPkts":
 | 
						|
					procNetstat.IpExt.InTruncatedPkts = value
 | 
						|
				case "InMcastPkts":
 | 
						|
					procNetstat.IpExt.InMcastPkts = value
 | 
						|
				case "OutMcastPkts":
 | 
						|
					procNetstat.IpExt.OutMcastPkts = value
 | 
						|
				case "InBcastPkts":
 | 
						|
					procNetstat.IpExt.InBcastPkts = value
 | 
						|
				case "OutBcastPkts":
 | 
						|
					procNetstat.IpExt.OutBcastPkts = value
 | 
						|
				case "InOctets":
 | 
						|
					procNetstat.IpExt.InOctets = value
 | 
						|
				case "OutOctets":
 | 
						|
					procNetstat.IpExt.OutOctets = value
 | 
						|
				case "InMcastOctets":
 | 
						|
					procNetstat.IpExt.InMcastOctets = value
 | 
						|
				case "OutMcastOctets":
 | 
						|
					procNetstat.IpExt.OutMcastOctets = value
 | 
						|
				case "InBcastOctets":
 | 
						|
					procNetstat.IpExt.InBcastOctets = value
 | 
						|
				case "OutBcastOctets":
 | 
						|
					procNetstat.IpExt.OutBcastOctets = value
 | 
						|
				case "InCsumErrors":
 | 
						|
					procNetstat.IpExt.InCsumErrors = value
 | 
						|
				case "InNoECTPkts":
 | 
						|
					procNetstat.IpExt.InNoECTPkts = value
 | 
						|
				case "InECT1Pkts":
 | 
						|
					procNetstat.IpExt.InECT1Pkts = value
 | 
						|
				case "InECT0Pkts":
 | 
						|
					procNetstat.IpExt.InECT0Pkts = value
 | 
						|
				case "InCEPkts":
 | 
						|
					procNetstat.IpExt.InCEPkts = value
 | 
						|
				case "ReasmOverlaps":
 | 
						|
					procNetstat.IpExt.ReasmOverlaps = value
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return procNetstat, scanner.Err()
 | 
						|
}
 |