// Copyright 2017 Prometheus Team
// 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 (
	
	
	
	
	
)

// XfrmStat models the contents of /proc/net/xfrm_stat.
type XfrmStat struct {
	// All errors which are not matched by other
	XfrmInError int
	// No buffer is left
	XfrmInBufferError int
	// Header Error
	XfrmInHdrError int
	// No state found
	// i.e. either inbound SPI, address, or IPSEC protocol at SA is wrong
	XfrmInNoStates int
	// Transformation protocol specific error
	// e.g. SA Key is wrong
	XfrmInStateProtoError int
	// Transformation mode specific error
	XfrmInStateModeError int
	// Sequence error
	// e.g. sequence number is out of window
	XfrmInStateSeqError int
	// State is expired
	XfrmInStateExpired int
	// State has mismatch option
	// e.g. UDP encapsulation type is mismatched
	XfrmInStateMismatch int
	// State is invalid
	XfrmInStateInvalid int
	// No matching template for states
	// e.g. Inbound SAs are correct but SP rule is wrong
	XfrmInTmplMismatch int
	// No policy is found for states
	// e.g. Inbound SAs are correct but no SP is found
	XfrmInNoPols int
	// Policy discards
	XfrmInPolBlock int
	// Policy error
	XfrmInPolError int
	// All errors which are not matched by others
	XfrmOutError int
	// Bundle generation error
	XfrmOutBundleGenError int
	// Bundle check error
	XfrmOutBundleCheckError int
	// No state was found
	XfrmOutNoStates int
	// Transformation protocol specific error
	XfrmOutStateProtoError int
	// Transportation mode specific error
	XfrmOutStateModeError int
	// Sequence error
	// i.e sequence number overflow
	XfrmOutStateSeqError int
	// State is expired
	XfrmOutStateExpired int
	// Policy discads
	XfrmOutPolBlock int
	// Policy is dead
	XfrmOutPolDead int
	// Policy Error
	XfrmOutPolError int
	// Forward routing of a packet is not allowed
	XfrmFwdHdrError int
	// State is invalid, perhaps expired
	XfrmOutStateInvalid int
	// State hasn’t been fully acquired before use
	XfrmAcquireError int
}

// NewXfrmStat reads the xfrm_stat statistics.
func () (XfrmStat, error) {
	,  := NewFS(DefaultMountPoint)
	if  != nil {
		return XfrmStat{}, 
	}

	return .NewXfrmStat()
}

// NewXfrmStat reads the xfrm_stat statistics from the 'proc' filesystem.
func ( FS) () (XfrmStat, error) {
	,  := os.Open(.proc.Path("net/xfrm_stat"))
	if  != nil {
		return XfrmStat{}, 
	}
	defer .Close()

	var (
		 = XfrmStat{}
		 = bufio.NewScanner()
	)

	for .Scan() {
		 := strings.Fields(.Text())

		if len() != 2 {
			return XfrmStat{}, fmt.Errorf("%w: %q line %q", ErrFileParse, .Name(), .Text())
		}

		 := [0]
		,  := strconv.Atoi([1])
		if  != nil {
			return XfrmStat{}, 
		}

		switch  {
		case "XfrmInError":
			.XfrmInError = 
		case "XfrmInBufferError":
			.XfrmInBufferError = 
		case "XfrmInHdrError":
			.XfrmInHdrError = 
		case "XfrmInNoStates":
			.XfrmInNoStates = 
		case "XfrmInStateProtoError":
			.XfrmInStateProtoError = 
		case "XfrmInStateModeError":
			.XfrmInStateModeError = 
		case "XfrmInStateSeqError":
			.XfrmInStateSeqError = 
		case "XfrmInStateExpired":
			.XfrmInStateExpired = 
		case "XfrmInStateInvalid":
			.XfrmInStateInvalid = 
		case "XfrmInTmplMismatch":
			.XfrmInTmplMismatch = 
		case "XfrmInNoPols":
			.XfrmInNoPols = 
		case "XfrmInPolBlock":
			.XfrmInPolBlock = 
		case "XfrmInPolError":
			.XfrmInPolError = 
		case "XfrmOutError":
			.XfrmOutError = 
		case "XfrmInStateMismatch":
			.XfrmInStateMismatch = 
		case "XfrmOutBundleGenError":
			.XfrmOutBundleGenError = 
		case "XfrmOutBundleCheckError":
			.XfrmOutBundleCheckError = 
		case "XfrmOutNoStates":
			.XfrmOutNoStates = 
		case "XfrmOutStateProtoError":
			.XfrmOutStateProtoError = 
		case "XfrmOutStateModeError":
			.XfrmOutStateModeError = 
		case "XfrmOutStateSeqError":
			.XfrmOutStateSeqError = 
		case "XfrmOutStateExpired":
			.XfrmOutStateExpired = 
		case "XfrmOutPolBlock":
			.XfrmOutPolBlock = 
		case "XfrmOutPolDead":
			.XfrmOutPolDead = 
		case "XfrmOutPolError":
			.XfrmOutPolError = 
		case "XfrmFwdHdrError":
			.XfrmFwdHdrError = 
		case "XfrmOutStateInvalid":
			.XfrmOutStateInvalid = 
		case "XfrmAcquireError":
			.XfrmAcquireError = 
		}

	}

	return , .Err()
}