// 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 (
	
	
	
	
	
	
	

	
)

// ProcSnmp6 models the content of /proc/<pid>/net/snmp6.
type ProcSnmp6 struct {
	// The process ID.
	PID int
	Ip6
	Icmp6
	Udp6
	UdpLite6
}

type Ip6 struct { // nolint:revive
	InReceives       *float64
	InHdrErrors      *float64
	InTooBigErrors   *float64
	InNoRoutes       *float64
	InAddrErrors     *float64
	InUnknownProtos  *float64
	InTruncatedPkts  *float64
	InDiscards       *float64
	InDelivers       *float64
	OutForwDatagrams *float64
	OutRequests      *float64
	OutDiscards      *float64
	OutNoRoutes      *float64
	ReasmTimeout     *float64
	ReasmReqds       *float64
	ReasmOKs         *float64
	ReasmFails       *float64
	FragOKs          *float64
	FragFails        *float64
	FragCreates      *float64
	InMcastPkts      *float64
	OutMcastPkts     *float64
	InOctets         *float64
	OutOctets        *float64
	InMcastOctets    *float64
	OutMcastOctets   *float64
	InBcastOctets    *float64
	OutBcastOctets   *float64
	InNoECTPkts      *float64
	InECT1Pkts       *float64
	InECT0Pkts       *float64
	InCEPkts         *float64
}

type Icmp6 struct {
	InMsgs                    *float64
	InErrors                  *float64
	OutMsgs                   *float64
	OutErrors                 *float64
	InCsumErrors              *float64
	InDestUnreachs            *float64
	InPktTooBigs              *float64
	InTimeExcds               *float64
	InParmProblems            *float64
	InEchos                   *float64
	InEchoReplies             *float64
	InGroupMembQueries        *float64
	InGroupMembResponses      *float64
	InGroupMembReductions     *float64
	InRouterSolicits          *float64
	InRouterAdvertisements    *float64
	InNeighborSolicits        *float64
	InNeighborAdvertisements  *float64
	InRedirects               *float64
	InMLDv2Reports            *float64
	OutDestUnreachs           *float64
	OutPktTooBigs             *float64
	OutTimeExcds              *float64
	OutParmProblems           *float64
	OutEchos                  *float64
	OutEchoReplies            *float64
	OutGroupMembQueries       *float64
	OutGroupMembResponses     *float64
	OutGroupMembReductions    *float64
	OutRouterSolicits         *float64
	OutRouterAdvertisements   *float64
	OutNeighborSolicits       *float64
	OutNeighborAdvertisements *float64
	OutRedirects              *float64
	OutMLDv2Reports           *float64
	InType1                   *float64
	InType134                 *float64
	InType135                 *float64
	InType136                 *float64
	InType143                 *float64
	OutType133                *float64
	OutType135                *float64
	OutType136                *float64
	OutType143                *float64
}

type Udp6 struct { // nolint:revive
	InDatagrams  *float64
	NoPorts      *float64
	InErrors     *float64
	OutDatagrams *float64
	RcvbufErrors *float64
	SndbufErrors *float64
	InCsumErrors *float64
	IgnoredMulti *float64
}

type UdpLite6 struct { // nolint:revive
	InDatagrams  *float64
	NoPorts      *float64
	InErrors     *float64
	OutDatagrams *float64
	RcvbufErrors *float64
	SndbufErrors *float64
	InCsumErrors *float64
}

func ( Proc) () (ProcSnmp6, error) {
	 := .path("net/snmp6")
	,  := util.ReadFileNoStat()
	if  != nil {
		// On systems with IPv6 disabled, this file won't exist.
		// Do nothing.
		if errors.Is(, os.ErrNotExist) {
			return ProcSnmp6{PID: .PID}, nil
		}

		return ProcSnmp6{PID: .PID}, 
	}

	,  := parseSNMP6Stats(bytes.NewReader())
	.PID = .PID
	return , 
}

// parseSnmp6 parses the metrics from proc/<pid>/net/snmp6 file
// and returns a map contains those metrics.
func parseSNMP6Stats( io.Reader) (ProcSnmp6, error) {
	var (
		   = bufio.NewScanner()
		 = ProcSnmp6{}
	)

	for .Scan() {
		 := strings.Fields(.Text())
		if len() < 2 {
			continue
		}
		// Expect to have "6" in metric name, skip line otherwise
		if  := strings.Index([0], "6");  != -1 {
			 := [0][:+1]
			 := [0][+1:]
			,  := strconv.ParseFloat([1], 64)
			if  != nil {
				return , 
			}

			switch  {
			case "Ip6":
				switch  {
				case "InReceives":
					.InReceives = &
				case "InHdrErrors":
					.InHdrErrors = &
				case "InTooBigErrors":
					.InTooBigErrors = &
				case "InNoRoutes":
					.InNoRoutes = &
				case "InAddrErrors":
					.InAddrErrors = &
				case "InUnknownProtos":
					.InUnknownProtos = &
				case "InTruncatedPkts":
					.InTruncatedPkts = &
				case "InDiscards":
					.InDiscards = &
				case "InDelivers":
					.InDelivers = &
				case "OutForwDatagrams":
					.OutForwDatagrams = &
				case "OutRequests":
					.OutRequests = &
				case "OutDiscards":
					.OutDiscards = &
				case "OutNoRoutes":
					.OutNoRoutes = &
				case "ReasmTimeout":
					.ReasmTimeout = &
				case "ReasmReqds":
					.ReasmReqds = &
				case "ReasmOKs":
					.ReasmOKs = &
				case "ReasmFails":
					.ReasmFails = &
				case "FragOKs":
					.FragOKs = &
				case "FragFails":
					.FragFails = &
				case "FragCreates":
					.FragCreates = &
				case "InMcastPkts":
					.InMcastPkts = &
				case "OutMcastPkts":
					.OutMcastPkts = &
				case "InOctets":
					.InOctets = &
				case "OutOctets":
					.OutOctets = &
				case "InMcastOctets":
					.InMcastOctets = &
				case "OutMcastOctets":
					.OutMcastOctets = &
				case "InBcastOctets":
					.InBcastOctets = &
				case "OutBcastOctets":
					.OutBcastOctets = &
				case "InNoECTPkts":
					.InNoECTPkts = &
				case "InECT1Pkts":
					.InECT1Pkts = &
				case "InECT0Pkts":
					.InECT0Pkts = &
				case "InCEPkts":
					.InCEPkts = &

				}
			case "Icmp6":
				switch  {
				case "InMsgs":
					.InMsgs = &
				case "InErrors":
					.Icmp6.InErrors = &
				case "OutMsgs":
					.OutMsgs = &
				case "OutErrors":
					.OutErrors = &
				case "InCsumErrors":
					.Icmp6.InCsumErrors = &
				case "InDestUnreachs":
					.InDestUnreachs = &
				case "InPktTooBigs":
					.InPktTooBigs = &
				case "InTimeExcds":
					.InTimeExcds = &
				case "InParmProblems":
					.InParmProblems = &
				case "InEchos":
					.InEchos = &
				case "InEchoReplies":
					.InEchoReplies = &
				case "InGroupMembQueries":
					.InGroupMembQueries = &
				case "InGroupMembResponses":
					.InGroupMembResponses = &
				case "InGroupMembReductions":
					.InGroupMembReductions = &
				case "InRouterSolicits":
					.InRouterSolicits = &
				case "InRouterAdvertisements":
					.InRouterAdvertisements = &
				case "InNeighborSolicits":
					.InNeighborSolicits = &
				case "InNeighborAdvertisements":
					.InNeighborAdvertisements = &
				case "InRedirects":
					.InRedirects = &
				case "InMLDv2Reports":
					.InMLDv2Reports = &
				case "OutDestUnreachs":
					.OutDestUnreachs = &
				case "OutPktTooBigs":
					.OutPktTooBigs = &
				case "OutTimeExcds":
					.OutTimeExcds = &
				case "OutParmProblems":
					.OutParmProblems = &
				case "OutEchos":
					.OutEchos = &
				case "OutEchoReplies":
					.OutEchoReplies = &
				case "OutGroupMembQueries":
					.OutGroupMembQueries = &
				case "OutGroupMembResponses":
					.OutGroupMembResponses = &
				case "OutGroupMembReductions":
					.OutGroupMembReductions = &
				case "OutRouterSolicits":
					.OutRouterSolicits = &
				case "OutRouterAdvertisements":
					.OutRouterAdvertisements = &
				case "OutNeighborSolicits":
					.OutNeighborSolicits = &
				case "OutNeighborAdvertisements":
					.OutNeighborAdvertisements = &
				case "OutRedirects":
					.OutRedirects = &
				case "OutMLDv2Reports":
					.OutMLDv2Reports = &
				case "InType1":
					.InType1 = &
				case "InType134":
					.InType134 = &
				case "InType135":
					.InType135 = &
				case "InType136":
					.InType136 = &
				case "InType143":
					.InType143 = &
				case "OutType133":
					.OutType133 = &
				case "OutType135":
					.OutType135 = &
				case "OutType136":
					.OutType136 = &
				case "OutType143":
					.OutType143 = &
				}
			case "Udp6":
				switch  {
				case "InDatagrams":
					.Udp6.InDatagrams = &
				case "NoPorts":
					.Udp6.NoPorts = &
				case "InErrors":
					.Udp6.InErrors = &
				case "OutDatagrams":
					.Udp6.OutDatagrams = &
				case "RcvbufErrors":
					.Udp6.RcvbufErrors = &
				case "SndbufErrors":
					.Udp6.SndbufErrors = &
				case "InCsumErrors":
					.Udp6.InCsumErrors = &
				case "IgnoredMulti":
					.IgnoredMulti = &
				}
			case "UdpLite6":
				switch  {
				case "InDatagrams":
					.UdpLite6.InDatagrams = &
				case "NoPorts":
					.UdpLite6.NoPorts = &
				case "InErrors":
					.UdpLite6.InErrors = &
				case "OutDatagrams":
					.UdpLite6.OutDatagrams = &
				case "RcvbufErrors":
					.UdpLite6.RcvbufErrors = &
				case "SndbufErrors":
					.UdpLite6.SndbufErrors = &
				case "InCsumErrors":
					.UdpLite6.InCsumErrors = &
				}
			}
		}
	}
	return , .Err()
}