// Copyright 2019 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 procfsimport ()// Learned from include/uapi/linux/if_arp.h.const (// Completed entry (ha valid).ATFComplete = 0x02// Permanent entry.ATFPermanent = 0x04// Publish entry.ATFPublish = 0x08// Has requested trailers.ATFUseTrailers = 0x10// Obsoleted: Want to use a netmask (only for proxy entries).ATFNetmask = 0x20// Don't answer this addresses.ATFDontPublish = 0x40)// ARPEntry contains a single row of the columnar data represented in// /proc/net/arp.typeARPEntrystruct {// IP address IPAddr net.IP// MAC address HWAddr net.HardwareAddr// Name of the device Device string// Flags Flags byte}// GatherARPEntries retrieves all the ARP entries, parse the relevant columns,// and then return a slice of ARPEntry's.func ( FS) () ([]ARPEntry, error) { , := os.ReadFile(.proc.Path("net/arp"))if != nil {returnnil, fmt.Errorf("%w: error reading arp %s: %w", ErrFileRead, .proc.Path("net/arp"), ) }returnparseARPEntries()}func parseARPEntries( []byte) ([]ARPEntry, error) { := strings.Split(string(), "\n") := make([]ARPEntry, 0)varerrorconst ( = 6 = 9 )for , := range { := strings.Fields() := len()if == || == 0 {continue } elseif == { , := parseARPEntry()if != nil {return []ARPEntry{}, fmt.Errorf("%w: Failed to parse ARP entry: %v: %w", ErrFileParse, , ) } = append(, ) } else {return []ARPEntry{}, fmt.Errorf("%w: %d columns found, but expected %d: %w", ErrFileParse, , , ) } }return , }func parseARPEntry( []string) (ARPEntry, error) { := ARPEntry{Device: [5]} := net.ParseIP([0]) .IPAddr = if , := net.ParseMAC([3]); == nil { .HWAddr = } else {returnARPEntry{}, }if , := strconv.ParseUint([2], 0, 8); == nil { .Flags = byte() } else {returnARPEntry{}, }return , nil}// IsComplete returns true if ARP entry is marked with complete flag.func ( *ARPEntry) () bool {return .Flags&ATFComplete != 0}
The pages are generated with Goldsv0.8.2. (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu.
PR and bug reports are welcome and can be submitted to the issue list.
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds.