| // Copyright 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" |
| |
| "github.com/prometheus/procfs/internal/util" |
| ) |
| |
| const nfNetLinkQueueFormat = "%d %d %d %d %d %d %d %d %d" |
| |
| // NFNetLinkQueue contains general information about netfilter queues found in /proc/net/netfilter/nfnetlink_queue. |
| type NFNetLinkQueue struct { |
| // id of the queue |
| QueueID uint |
| // pid of process handling the queue |
| PeerPID uint |
| // number of packets waiting for a decision |
| QueueTotal uint |
| // indicate how userspace receive packets |
| CopyMode uint |
| // size of copy |
| CopyRange uint |
| // number of items dropped by the kernel because too many packets were waiting a decision. |
| // It queue_total is superior to queue_max_len (1024 per default) the packets are dropped. |
| QueueDropped uint |
| // number of packets dropped by userspace (due to kernel send failure on the netlink socket) |
| QueueUserDropped uint |
| // sequence number of packets queued. It gives a correct approximation of the number of queued packets. |
| SequenceID uint |
| // internal value (number of entity using the queue) |
| Use uint |
| } |
| |
| // NFNetLinkQueue returns information about current state of netfilter queues. |
| func (fs FS) NFNetLinkQueue() ([]NFNetLinkQueue, error) { |
| data, err := util.ReadFileNoStat(fs.proc.Path("net/netfilter/nfnetlink_queue")) |
| if err != nil { |
| return nil, err |
| } |
| |
| queue := []NFNetLinkQueue{} |
| if len(data) == 0 { |
| return queue, nil |
| } |
| |
| scanner := bufio.NewScanner(bytes.NewReader(data)) |
| for scanner.Scan() { |
| line := scanner.Text() |
| nFNetLinkQueue, err := parseNFNetLinkQueueLine(line) |
| if err != nil { |
| return nil, err |
| } |
| queue = append(queue, *nFNetLinkQueue) |
| } |
| return queue, nil |
| } |
| |
| // parseNFNetLinkQueueLine parses each line of the /proc/net/netfilter/nfnetlink_queue file. |
| func parseNFNetLinkQueueLine(line string) (*NFNetLinkQueue, error) { |
| nFNetLinkQueue := NFNetLinkQueue{} |
| _, err := fmt.Sscanf( |
| line, nfNetLinkQueueFormat, |
| &nFNetLinkQueue.QueueID, &nFNetLinkQueue.PeerPID, &nFNetLinkQueue.QueueTotal, &nFNetLinkQueue.CopyMode, |
| &nFNetLinkQueue.CopyRange, &nFNetLinkQueue.QueueDropped, &nFNetLinkQueue.QueueUserDropped, &nFNetLinkQueue.SequenceID, &nFNetLinkQueue.Use, |
| ) |
| if err != nil { |
| return nil, err |
| } |
| return &nFNetLinkQueue, nil |
| } |