4702a09538
Signed-off-by: meijian <meijian@xiaomi.com>
899 lines
30 KiB
C
899 lines
30 KiB
C
/****************************************************************************
|
|
* include/netpacket/netlink.h
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership. The
|
|
* ASF licenses this file to you 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.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifndef __INCLUDE_NETPACKET_NETLINK_H
|
|
#define __INCLUDE_NETPACKET_NETLINK_H
|
|
|
|
/****************************************************************************
|
|
* Included Files
|
|
****************************************************************************/
|
|
|
|
#include <nuttx/config.h>
|
|
#include <nuttx/compiler.h>
|
|
|
|
#include <sys/socket.h>
|
|
#include <stdint.h>
|
|
|
|
#include <netpacket/if_addr.h>
|
|
|
|
/****************************************************************************
|
|
* Pre-processor Definitions
|
|
****************************************************************************/
|
|
|
|
/* Netlink socket protocols *************************************************/
|
|
|
|
/* The AF_NETLINK family offers multiple protocol subsets. Each interfaces
|
|
* to a different kernel component and has a different messaging subset. The
|
|
* subset is referenced by the protocol field in the socket call:
|
|
*
|
|
* int socket(AF_NETLINK, SOCK_DGRAM or SOCK_RAW, protocol)
|
|
*
|
|
* Ref. Wikipedia.org
|
|
*
|
|
* Namespace is Linux compatible.
|
|
*/
|
|
|
|
#define NETLINK_ROUTE 0 /* Routing/device hook for user-space
|
|
* routing daemons (default) */
|
|
#define NETLINK_UNUSED 1 /* Unused number */
|
|
#define NETLINK_USERSOCK 2 /* Reserved for user mode socket protocols */
|
|
#define NETLINK_FIREWALL 3 /* Interface to receive packets from
|
|
* the firewall */
|
|
#define NETLINK_SOCK_DIAG 4 /* Socket monitoring */
|
|
#define NETLINK_NFLOG 5 /* netfilter/iptables ULOG */
|
|
#define NETLINK_XFRM 6 /* Interface to IPsec security databases
|
|
* for key-manager daemons using the
|
|
* Internet Key Exchange protocol. */
|
|
#define NETLINK_SELINUX 7 /* SELinux event notifications */
|
|
#define NETLINK_ISCSI 8 /* Open-iSCSI */
|
|
#define NETLINK_AUDIT 9 /* Interface to auditing sub-system */
|
|
#define NETLINK_FIB_LOOKUP 10
|
|
#define NETLINK_CONNECTOR 11
|
|
#define NETLINK_NETFILTER 12 /* netfilter subsystem */
|
|
#define NETLINK_IP6_FW 13 /* Interface to transport packets from
|
|
* netfilter to user-space. */
|
|
#define NETLINK_DNRTMSG 14 /* DECnet routing messages */
|
|
#define NETLINK_KOBJECT_UEVENT 15 /* Kernel messages to userspace */
|
|
#define NETLINK_GENERIC 16
|
|
/* NETLINK_DM (DM Events) */
|
|
#define NETLINK_SCSITRANSPORT 18 /* SCSI Transports */
|
|
#define NETLINK_ECRYPTFS 19
|
|
#define NETLINK_RDMA 20
|
|
#define NETLINK_CRYPTO 21 /* Crypto layer */
|
|
#define NETLINK_SMC 22 /* SMC monitoring */
|
|
|
|
/* Definitions associated with struct sockaddr_nl ***************************/
|
|
|
|
/* Flags values */
|
|
|
|
#define NLM_F_REQUEST 0x0001 /* It is request message. */
|
|
#define NLM_F_MULTI 0x0002 /* Multipart message, terminated by NLMSG_DONE */
|
|
#define NLM_F_ACK 0x0004 /* Reply with ack, with zero or error code */
|
|
#define NLM_F_ECHO 0x0008 /* Echo this request */
|
|
#define NLM_F_DUMP_INTR 0x0010 /* Dump was inconsistent due to sequence change */
|
|
#define NLM_F_DUMP_FILTERED 0x0020 /* Dump was filtered as requested */
|
|
|
|
/* Modifiers to GET request */
|
|
|
|
#define NLM_F_ROOT 0x0100 /* specify tree root */
|
|
#define NLM_F_MATCH 0x0200 /* return all matching */
|
|
#define NLM_F_ATOMIC 0x0400 /* atomic GET */
|
|
#define NLM_F_DUMP (NLM_F_ROOT | NLM_F_MATCH)
|
|
|
|
/* Modifiers to NEW request */
|
|
|
|
#define NLM_F_REPLACE 0x0100 /* Override existing */
|
|
#define NLM_F_EXCL 0x0200 /* Do not touch, if it exists */
|
|
#define NLM_F_CREATE 0x0400 /* Create, if it does not exist */
|
|
#define NLM_F_APPEND 0x0800 /* Add to end of list */
|
|
|
|
/* Modifiers to DELETE request */
|
|
|
|
#define NLM_F_NONREC 0x0100 /* Do not delete recursively */
|
|
|
|
/* Flags for ACK message */
|
|
|
|
#define NLM_F_CAPPED 0x0100 /* request was capped */
|
|
#define NLM_F_ACK_TLVS 0x0200 /* extended ACK TVLs were included */
|
|
|
|
/* Definitions for struct nlmsghdr ******************************************/
|
|
|
|
#define NLMSG_MASK (sizeof(uint32_t) - 1)
|
|
#define NLMSG_ALIGN(n) (((n) + NLMSG_MASK) & ~NLMSG_MASK)
|
|
#define NLMSG_HDRLEN sizeof(struct nlmsghdr)
|
|
#define NLMSG_LENGTH(n) (NLMSG_HDRLEN + (n))
|
|
#define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len))
|
|
#define NLMSG_DATA(hdr) ((FAR void *)(((FAR char *)hdr) + NLMSG_HDRLEN))
|
|
#define NLMSG_NEXT(hdr, n) \
|
|
((n) -= NLMSG_ALIGN((hdr)->nlmsg_len), \
|
|
(FAR struct nlmsghdr *) \
|
|
(((FAR char *)(hdr)) + NLMSG_ALIGN((hdr)->nlmsg_len)))
|
|
#define NLMSG_OK(nlh, len) \
|
|
((len) >= (int)sizeof(struct nlmsghdr) && \
|
|
(nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && \
|
|
(nlh)->nlmsg_len <= (len))
|
|
#define NLMSG_PAYLOAD(hdr, len) \
|
|
((hdr)->nlmsg_len - NLMSG_SPACE(len))
|
|
|
|
#define NLMSG_NOOP 1 /* Nothing */
|
|
#define NLMSG_ERROR 2 /* Error */
|
|
#define NLMSG_DONE 3 /* End of a dump */
|
|
#define NLMSG_OVERRUN 4 /* Data lost */
|
|
#define NLMSG_MIN_TYPE 16 /* < 16: Reserved control messages */
|
|
|
|
/* Attribute definitions for struct rtattr **********************************/
|
|
|
|
/* Macros to handle attribute lists */
|
|
|
|
#define RTA_MASK (sizeof(uint32_t) - 1)
|
|
#define RTA_ALIGN(n) (((n) + RTA_MASK) & ~RTA_MASK)
|
|
#define RTA_OK(rta, n) \
|
|
((n) >= (int)sizeof(struct rtattr) && \
|
|
(rta)->rta_len >= sizeof(struct rtattr) && \
|
|
(rta)->rta_len <= (n))
|
|
#define RTA_NEXT(rta, attrlen) \
|
|
((attrlen) -= RTA_ALIGN((rta)->rta_len), \
|
|
(FAR struct rtattr *)(((FAR char *)(rta)) + RTA_ALIGN((rta)->rta_len)))
|
|
#define RTA_LENGTH(n) (sizeof(struct rtattr) + (n))
|
|
#define RTA_SPACE(n) RTA_ALIGN(RTA_LENGTH(n))
|
|
#define RTA_DATA(rta) ((FAR void *)(((FAR char *)(rta)) + RTA_LENGTH(0)))
|
|
#define RTA_PAYLOAD(rta) ((int)((rta)->rta_len) - RTA_LENGTH(0))
|
|
|
|
/* NETLINK_ROUTE: Routing table attributes */
|
|
|
|
#define RTA_UNSPEC 0 /* Inored */
|
|
#define RTA_DST 1 /* Argument: Route destination address */
|
|
#define RTA_SRC 2 /* Argument: Route source address */
|
|
#define RTA_IIF 3 /* Argument: Input interface index */
|
|
#define RTA_OIF 4 /* Argument: Output interface index */
|
|
#define RTA_GATEWAY 5 /* Argument: Gateway address of the route */
|
|
#define RTA_GENMASK 6 /* Argument: Network address mask of sub-net */
|
|
#define RTA_PRIORITY 7 /* Argument: Route priority */
|
|
#define RTA_TABLE 8 /* Argument: Route table */
|
|
#define RTA_PREFSRC 9 /* Argument: Preferred source address */
|
|
#define RTA_METRICS 10 /* Argument: Route metric */
|
|
#define RTA_MAX 10 /* MAX type, same as last argument */
|
|
|
|
/* NETLINK_ROUTE protocol message types *************************************/
|
|
|
|
/* Link layer:
|
|
*
|
|
* RTM_NEWLINK, RTM_DELLINK, RTM_GETLINK
|
|
* Create, remove or get information about a specific network interface.
|
|
* These messages contain an ifinfomsg structure followed by a series
|
|
* of rtattr structures.
|
|
*/
|
|
|
|
#define RTM_NEWLINK 16
|
|
#define RTM_DELLINK 17
|
|
#define RTM_GETLINK 18
|
|
#define RTM_SETLINK 19
|
|
|
|
/* Address settings:
|
|
*
|
|
* RTM_NEWADDR, RTM_DELADDR, RTM_GETADDR
|
|
* Add, remove or receive information about an IP address associated with
|
|
* an interface. These messages contain an ifaddrmsg structure, optionally
|
|
* followed by rtattr routing attributes.
|
|
*/
|
|
|
|
#define RTM_NEWADDR 20
|
|
#define RTM_DELADDR 21
|
|
#define RTM_GETADDR 22
|
|
|
|
/* Routing tables:
|
|
*
|
|
* RTM_NEWROUTE, RTM_DELROUTE, RTM_GETROUTE
|
|
* Create, remove or receive information about a network route. These
|
|
* messages contain an rtmsg structure with an optional sequence of
|
|
* rtattr structures following.
|
|
*
|
|
* For RTM_GETROUTE, setting rtm_dst_len and rtm_src_len to 0 means you
|
|
* get all entries for the specified routing table. For the other fields,
|
|
* except rtm_table and rtm_protocol, 0 is the wildcard.
|
|
*/
|
|
|
|
#define RTM_NEWROUTE 24
|
|
#define RTM_DELROUTE 25
|
|
#define RTM_GETROUTE 26
|
|
|
|
/* Neighbor cache:
|
|
*
|
|
* RTM_NEWNEIGH, RTM_DELNEIGH, RTM_GETNEIGH
|
|
* Add, remove or receive information about a neighbor table entry (e.g.,
|
|
* an ARP entry). The message contains an ndmsg structure.
|
|
*/
|
|
|
|
#define RTM_NEWNEIGH 28
|
|
#define RTM_DELNEIGH 29
|
|
#define RTM_GETNEIGH 30
|
|
|
|
/* Routing rules:
|
|
*
|
|
* RTM_NEWRULE, RTM_DELRULE, RTM_GETRULE
|
|
* Add, delete or retrieve a routing rule. Carries a struct rtmsg
|
|
*/
|
|
|
|
#define RTM_NEWRULE 32
|
|
#define RTM_DELRULE 33
|
|
#define RTM_GETRULE 34
|
|
|
|
/* Queuing discipline settings:
|
|
*
|
|
* RTM_NEWQDISC, RTM_DELQDISC, RTM_GETQDISC
|
|
* Add, remove or get a queuing discipline. The message contains a
|
|
* struct tcmsg and may be followed by a series of attributes.
|
|
*/
|
|
|
|
#define RTM_NEWQDISC 36
|
|
#define RTM_DELQDISC 37
|
|
#define RTM_GETQDISC 38
|
|
|
|
/* Traffic classes used with queues:
|
|
*
|
|
* RTM_NEWTCLASS, RTM_DELTCLASS, RTM_GETTCLASS
|
|
* Add, remove or get a traffic class. These messages contain a struct
|
|
* tcmsg as described above.
|
|
*/
|
|
|
|
#define RTM_NEWTCLASS 40
|
|
#define RTM_DELTCLASS 41
|
|
#define RTM_GETTCLASS 42
|
|
|
|
/* Traffic filters:
|
|
*
|
|
* RTM_NEWTFILTER, RTM_DELTFILTER, RTM_GETTFILTER
|
|
* Add, remove or receive information about a traffic filter. These
|
|
* messages contain a struct tcmsg as described above.
|
|
*/
|
|
|
|
#define RTM_NEWTFILTER 44
|
|
#define RTM_DELTFILTER 45
|
|
#define RTM_GETTFILTER 46
|
|
|
|
/* Others: */
|
|
|
|
#define RTM_NEWACTION 48
|
|
#define RTM_DELACTION 49
|
|
#define RTM_GETACTION 50
|
|
#define RTM_NEWPREFIX 52
|
|
#define RTM_GETMULTICAST 58
|
|
#define RTM_GETANYCAST 62
|
|
#define RTM_NEWNEIGHTBL 64
|
|
#define RTM_GETNEIGHTBL 66
|
|
#define RTM_SETNEIGHTBL 67
|
|
#define RTM_NEWNDUSEROPT 68
|
|
|
|
#define RTM_BASE 16
|
|
#define RTM_MAX 68
|
|
|
|
/* Definitions for struct ifinfomsg *****************************************/
|
|
|
|
#define IFLA_RTA(r) ((FAR struct rtattr *) \
|
|
(((FAR char *)(r)) + \
|
|
NLMSG_ALIGN(sizeof(struct ifinfomsg))))
|
|
#define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n, sizeof(struct ifinfomsg))
|
|
|
|
/* Values for rta_type */
|
|
|
|
#define IFLA_IFNAME 1
|
|
#define IFLA_ADDRESS 2
|
|
#define IFLA_MTU 3
|
|
#define IFLA_WIRELESS 4
|
|
#define IFLA_STATS 5
|
|
#define IFLA_OPERSTATE 6
|
|
#define IFLA_LINKMODE 7
|
|
#define IFLA_BROADCAST 8
|
|
#define IFLA_LINK 9
|
|
#define IFLA_QDISC 10
|
|
#define IFLA_COST 11
|
|
#define IFLA_PRIORITY 12
|
|
#define IFLA_MASTER 13
|
|
#define IFLA_PROTINFO 14
|
|
#define IFLA_TXQLEN 15
|
|
#define IFLA_MAP 16
|
|
#define IFLA_WEIGHT 17
|
|
|
|
/* Definitions for struct rtmsg *********************************************/
|
|
|
|
#define RTM_RTA(r) ((FAR struct rtattr *)\
|
|
(((FAR char *)(r)) + \
|
|
NLMSG_ALIGN(sizeof(struct rtmsg))))
|
|
#define RTM_PAYLOAD(n) NLMSG_PAYLOAD(n, sizeof(struct rtmsg))
|
|
|
|
/* rtm_table. Routing table identifiers */
|
|
|
|
#define RT_TABLE_UNSPEC 0
|
|
/* 1-251: User defined values */
|
|
#define RT_TABLE_MAIN 254
|
|
#define RT_TABLE_MAX 0xffffffff
|
|
|
|
/* rtm_type */
|
|
|
|
#define RTN_UNSPEC 0
|
|
#define RTN_UNICAST 1 /* Gateway or direct route */
|
|
#define RTN_LOCAL 2 /* Accept locally */
|
|
#define RTN_BROADCAST 3 /* Accept locally as broadcast;
|
|
* send as broadcast */
|
|
#define RTN_ANYCAST 4 /* Accept locally as broadcast
|
|
* but send as unicast */
|
|
#define RTN_MULTICAST 5 /* Multicast route */
|
|
|
|
/* rtm_protocol */
|
|
|
|
#define RTPROT_UNSPEC 0
|
|
#define RTPROT_REDIRECT 1 /* Route installed by ICMP redirects */
|
|
#define RTPROT_KERNEL 2 /* Route installed by kernel */
|
|
#define RTPROT_BOOT 3 /* Route installed during boot */
|
|
#define RTPROT_STATIC 4 /* Route installed by administrator */
|
|
#define RTPROT_RA 9 /* RDISC/ND router advertisements */
|
|
#define RTPROT_DHCP 16 /* DHCP client */
|
|
|
|
/* rtm_scope */
|
|
|
|
#define RT_SCOPE_UNIVERSE 0 /* Global route */
|
|
/* 1-199: User defined values */
|
|
#define RT_SCOPE_SITE 200 /* Interior route in local system */
|
|
#define RT_SCOPE_LINK 253 /* Route on this link */
|
|
#define RT_SCOPE_HOST 254 /* Route on local host */
|
|
#define RT_SCOPE_NOWHERE 255 /* Destination does not exist */
|
|
|
|
/* RTnetlink multicast groups (userspace) */
|
|
|
|
#define RTMGRP_LINK 1
|
|
#define RTMGRP_NOTIFY 2
|
|
#define RTMGRP_NEIGH 4
|
|
#define RTMGRP_TC 8
|
|
|
|
#define RTMGRP_IPV4_IFADDR 0x10
|
|
#define RTMGRP_IPV4_MROUTE 0x20
|
|
#define RTMGRP_IPV4_ROUTE 0x40
|
|
#define RTMGRP_IPV4_RULE 0x80
|
|
|
|
#define RTMGRP_IPV6_IFADDR 0x100
|
|
#define RTMGRP_IPV6_MROUTE 0x200
|
|
#define RTMGRP_IPV6_ROUTE 0x400
|
|
#define RTMGRP_IPV6_IFINFO 0x800
|
|
|
|
#define RTMGRP_DECnet_IFADDR 0x1000
|
|
#define RTMGRP_DECnet_ROUTE 0x4000
|
|
|
|
#define RTMGRP_IPV6_PREFIX 0x20000
|
|
|
|
/* RTnetlink multicast groups */
|
|
|
|
#define RTNLGRP_NONE 0
|
|
#define RTNLGRP_LINK 1
|
|
#define RTNLGRP_NOTIFY 2
|
|
#define RTNLGRP_NEIGH 3
|
|
#define RTNLGRP_TC 4
|
|
#define RTNLGRP_IPV4_IFADDR 5
|
|
#define RTNLGRP_IPV4_MROUTE 6
|
|
#define RTNLGRP_IPV4_ROUTE 7
|
|
#define RTNLGRP_IPV4_RULE 8
|
|
#define RTNLGRP_IPV6_IFADDR 9
|
|
#define RTNLGRP_IPV6_MROUTE 10
|
|
#define RTNLGRP_IPV6_ROUTE 11
|
|
#define RTNLGRP_IPV6_IFINFO 12
|
|
#define RTNLGRP_DECnet_IFADDR 13
|
|
#define RTNLGRP_NOP2 14
|
|
#define RTNLGRP_DECnet_ROUTE 15
|
|
#define RTNLGRP_DECnet_RULE 16
|
|
#define RTNLGRP_NOP4 17
|
|
#define RTNLGRP_IPV6_PREFIX 18
|
|
#define RTNLGRP_IPV6_RULE 19
|
|
#define RTNLGRP_ND_USEROPT 20
|
|
#define RTNLGRP_PHONET_IFADDR 21
|
|
#define RTNLGRP_PHONET_ROUTE 22
|
|
#define RTNLGRP_DCB 23
|
|
#define RTNLGRP_IPV4_NETCONF 24
|
|
#define RTNLGRP_IPV6_NETCONF 25
|
|
#define RTNLGRP_MDB 26
|
|
#define RTNLGRP_MPLS_ROUTE 27
|
|
#define RTNLGRP_NSID 28
|
|
#define RTNLGRP_MAX 29
|
|
|
|
#define FRA_UNSPEC 0
|
|
#define FRA_FWMARK 1 /* Mark */
|
|
#define FRA_TABLE 2 /* Extended table id */
|
|
#define FRA_FWMASK 3 /* Mask for netfilter mark */
|
|
|
|
/* nla_type (16 bits)
|
|
* +---+---+-------------------------------+
|
|
* | N | O | Attribute Type |
|
|
* +---+---+-------------------------------+
|
|
* N := Carries nested attributes
|
|
* O := Payload stored in network byte order
|
|
*
|
|
* Note: The N and O flag are mutually exclusive.
|
|
*/
|
|
|
|
#define NLA_F_NET_BYTEORDER (1 << 14)
|
|
#define NLA_F_NESTED (1 << 15)
|
|
#define NLA_TYPE_MASK ~(NLA_F_NESTED | NLA_F_NET_BYTEORDER)
|
|
|
|
#define NLA_ALIGNTO 4
|
|
#define NLA_ALIGN(len) (((len) + NLA_ALIGNTO - 1) & ~(NLA_ALIGNTO - 1))
|
|
#define NLA_HDRLEN (NLA_ALIGN(sizeof(struct nlattr)))
|
|
|
|
/* rtm_flags */
|
|
|
|
#define RTM_F_CLONED 0x200 /* This route is cloned */
|
|
|
|
/* Attribute definitions for struct nfattr **********************************/
|
|
|
|
/* Macros to handle attribute lists */
|
|
|
|
#define NFNL_NFA_NEST 0x8000
|
|
#define NFA_TYPE(attr) ((attr)->nfa_type & 0x7fff)
|
|
|
|
#define NFA_MASK (sizeof(uint32_t) - 1)
|
|
#define NFA_ALIGN(n) (((n) + NFA_MASK) & ~NFA_MASK)
|
|
#define NFA_OK(nfa, n) \
|
|
((n) >= (int)sizeof(struct nfattr) && \
|
|
(nfa)->nfa_len >= sizeof(struct nfattr) && \
|
|
(nfa)->nfa_len <= (n))
|
|
#define NFA_NEXT(nfa, attrlen) \
|
|
((attrlen) -= NFA_ALIGN((nfa)->nfa_len), \
|
|
(FAR struct nfattr *)(((FAR char *)(nfa)) + NFA_ALIGN((nfa)->nfa_len)))
|
|
#define NFA_LENGTH(len) ((sizeof(struct nfattr)) + (len))
|
|
#define NFA_SPACE(len) NFA_ALIGN(NFA_LENGTH(len))
|
|
#define NFA_DATA(nfa) ((FAR void *)(((FAR char *)(nfa)) + NFA_LENGTH(0)))
|
|
#define NFA_PAYLOAD(nfa) ((int)((nfa)->nfa_len) - NFA_LENGTH(0))
|
|
|
|
/* Definitions for struct nfgenmsg ******************************************/
|
|
|
|
#define NFM_NFA(n) ((FAR struct nfattr *) \
|
|
(((FAR char *)(n)) + \
|
|
NLMSG_ALIGN(sizeof(struct nfgenmsg))))
|
|
#define NFM_PAYLOAD(n) NLMSG_PAYLOAD(n, sizeof(struct nfgenmsg))
|
|
|
|
/* Definitions for NETLINK_NETFILTER ****************************************/
|
|
|
|
#define NFNETLINK_V0 0
|
|
|
|
/* netfilter netlink message types are split in two pieces:
|
|
* 8 bit subsystem, 8bit operation.
|
|
*/
|
|
|
|
#define NFNL_SUBSYS_ID(x) (((x) & 0xff00) >> 8)
|
|
#define NFNL_MSG_TYPE(x) ((x) & 0x00ff)
|
|
|
|
/* subsystems */
|
|
|
|
#define NFNL_SUBSYS_NONE 0
|
|
#define NFNL_SUBSYS_CTNETLINK 1
|
|
#define NFNL_SUBSYS_CTNETLINK_EXP 2
|
|
#define NFNL_SUBSYS_QUEUE 3
|
|
#define NFNL_SUBSYS_ULOG 4
|
|
#define NFNL_SUBSYS_OSF 5
|
|
#define NFNL_SUBSYS_IPSET 6
|
|
#define NFNL_SUBSYS_ACCT 7
|
|
#define NFNL_SUBSYS_CTNETLINK_TIMEOUT 8
|
|
#define NFNL_SUBSYS_CTHELPER 9
|
|
#define NFNL_SUBSYS_NFTABLES 10
|
|
#define NFNL_SUBSYS_NFT_COMPAT 11
|
|
#define NFNL_SUBSYS_HOOK 12
|
|
#define NFNL_SUBSYS_COUNT 13
|
|
|
|
/* NETLINK_NETFILTER: subsystem CTNL (ip conntrack netlink) message types */
|
|
|
|
#define IPCTNL_MSG_CT_NEW 0
|
|
#define IPCTNL_MSG_CT_GET 1
|
|
#define IPCTNL_MSG_CT_DELETE 2
|
|
#define IPCTNL_MSG_CT_GET_CTRZERO 3
|
|
#define IPCTNL_MSG_CT_GET_STATS_CPU 4
|
|
#define IPCTNL_MSG_CT_GET_STATS 5
|
|
#define IPCTNL_MSG_CT_GET_DYING 6
|
|
#define IPCTNL_MSG_CT_GET_UNCONFIRMED 7
|
|
#define IPCTNL_MSG_MAX 8
|
|
|
|
/* NETLINK_NETFILTER: Conntrack attributes */
|
|
|
|
#define CTA_UNSPEC 0
|
|
#define CTA_TUPLE_ORIG 1
|
|
#define CTA_TUPLE_REPLY 2
|
|
#define CTA_STATUS 3
|
|
#define CTA_PROTOINFO 4
|
|
#define CTA_HELP 5
|
|
#define CTA_NAT_SRC 6
|
|
#define CTA_TIMEOUT 7
|
|
#define CTA_MARK 8
|
|
#define CTA_COUNTERS_ORIG 9
|
|
#define CTA_COUNTERS_REPLY 10
|
|
#define CTA_USE 11
|
|
#define CTA_ID 12
|
|
#define CTA_NAT_DST 13
|
|
#define CTA_TUPLE_MASTER 14
|
|
#define CTA_SEQ_ADJ_ORIG 15
|
|
#define CTA_NAT_SEQ_ADJ_ORIG CTA_SEQ_ADJ_ORIG
|
|
#define CTA_SEQ_ADJ_REPLY 16
|
|
#define CTA_NAT_SEQ_ADJ_REPLY CTA_SEQ_ADJ_REPLY
|
|
#define CTA_ZONE 18
|
|
#define CTA_SECCTX 19
|
|
#define CTA_TIMESTAMP 20
|
|
#define CTA_MARK_MASK 21
|
|
#define CTA_LABELS 22
|
|
#define CTA_LABELS_MASK 23
|
|
#define CTA_SYNPROXY 24
|
|
#define CTA_FILTER 25
|
|
#define CTA_STATUS_MASK 26
|
|
#define CTA_MAX 26
|
|
|
|
/* NETLINK_NETFILTER: Conntrack tuple attributes */
|
|
|
|
#define CTA_TUPLE_UNSPEC 0
|
|
#define CTA_TUPLE_IP 1
|
|
#define CTA_TUPLE_PROTO 2
|
|
#define CTA_TUPLE_ZONE 3
|
|
#define CTA_TUPLE_MAX 3
|
|
|
|
/* NETLINK_NETFILTER: Conntrack IP attributes */
|
|
|
|
#define CTA_IP_UNSPEC 0
|
|
#define CTA_IP_V4_SRC 1
|
|
#define CTA_IP_V4_DST 2
|
|
#define CTA_IP_V6_SRC 3
|
|
#define CTA_IP_V6_DST 4
|
|
#define CTA_IP_MAX 4
|
|
|
|
/* NETLINK_NETFILTER: Conntrack protocol attributes */
|
|
|
|
#define CTA_PROTO_UNSPEC 0
|
|
#define CTA_PROTO_NUM 1
|
|
#define CTA_PROTO_SRC_PORT 2
|
|
#define CTA_PROTO_DST_PORT 3
|
|
#define CTA_PROTO_ICMP_ID 4
|
|
#define CTA_PROTO_ICMP_TYPE 5
|
|
#define CTA_PROTO_ICMP_CODE 6
|
|
#define CTA_PROTO_ICMPV6_ID 7
|
|
#define CTA_PROTO_ICMPV6_TYPE 8
|
|
#define CTA_PROTO_ICMPV6_CODE 9
|
|
#define CTA_PROTO_MAX 9
|
|
|
|
/* NFnetlink multicast groups (userspace) */
|
|
|
|
#define NF_NETLINK_CONNTRACK_NEW 0x00000001
|
|
#define NF_NETLINK_CONNTRACK_UPDATE 0x00000002
|
|
#define NF_NETLINK_CONNTRACK_DESTROY 0x00000004
|
|
#define NF_NETLINK_CONNTRACK_EXP_NEW 0x00000008
|
|
#define NF_NETLINK_CONNTRACK_EXP_UPDATE 0x00000010
|
|
#define NF_NETLINK_CONNTRACK_EXP_DESTROY 0x00000020
|
|
|
|
/* NFnetlink multicast groups */
|
|
|
|
#define NFNLGRP_NONE 0
|
|
#define NFNLGRP_CONNTRACK_NEW 1
|
|
#define NFNLGRP_CONNTRACK_UPDATE 2
|
|
#define NFNLGRP_CONNTRACK_DESTROY 3
|
|
#define NFNLGRP_CONNTRACK_EXP_NEW 4
|
|
#define NFNLGRP_CONNTRACK_EXP_UPDATE 5
|
|
#define NFNLGRP_CONNTRACK_EXP_DESTROY 6
|
|
#define NFNLGRP_NFTABLES 7
|
|
#define NFNLGRP_ACCT_QUOTA 8
|
|
#define NFNLGRP_NFTRACE 9
|
|
#define NFNLGRP_MAX 9
|
|
|
|
/****************************************************************************
|
|
* Public Type Definitions
|
|
****************************************************************************/
|
|
|
|
/* Netlink socket address type. */
|
|
|
|
struct sockaddr_nl
|
|
{
|
|
sa_family_t nl_family; /* AF_NETLINK */
|
|
uint16_t nl_pad; /* Zero */
|
|
uint32_t nl_pid; /* Port ID */
|
|
uint32_t nl_groups; /* Multicast groups mask */
|
|
};
|
|
|
|
/* Packet structure. The Netlink message header, struct nlmsghdr, must be
|
|
* prepared by the caller. The Netlink socket generally works in a SOCK_RAW-
|
|
* like mode (even if SOCK_DGRAM was used to create it).
|
|
*
|
|
* The data portion then contains a subsystem-specific message that may be
|
|
* further nested.
|
|
*/
|
|
|
|
struct nlmsghdr
|
|
{
|
|
uint32_t nlmsg_len; /* Length of message including header */
|
|
uint16_t nlmsg_type; /* Message content */
|
|
uint16_t nlmsg_flags; /* Additional flags */
|
|
uint32_t nlmsg_seq; /* Sequence number */
|
|
uint32_t nlmsg_pid; /* Sending process port ID */
|
|
/* Data follows */
|
|
};
|
|
|
|
struct nlmsgerr
|
|
{
|
|
int error;
|
|
struct nlmsghdr msg;
|
|
|
|
/* Followed by the message contents unless NETLINK_CAP_ACK was set
|
|
* or the ACK indicates success (error == 0)
|
|
* message length is aligned with NLMSG_ALIGN()
|
|
*/
|
|
|
|
/* Followed by TLVs defined in enum nlmsgerr_attrs
|
|
* if NETLINK_EXT_ACK was set
|
|
*/
|
|
};
|
|
|
|
/* NETLINK_ROUTE Message Structures *****************************************/
|
|
|
|
/* RTM_NEWLINK, RTM_DELLINK, RTM_GETLINK
|
|
*
|
|
* Create, remove or get information about a specific network interface.
|
|
* These messages contain an ifinfomsg structure followed by a series
|
|
* of rtattr structures.
|
|
*
|
|
* These attributes should be manipulated using only the RTA_*
|
|
*/
|
|
|
|
struct rtattr
|
|
{
|
|
uint16_t rta_len; /* Length of option */
|
|
uint16_t rta_type; /* Type of option */
|
|
/* Data follows */
|
|
};
|
|
|
|
struct ifinfomsg
|
|
{
|
|
uint8_t ifi_family; /* AF_UNSPEC */
|
|
uint8_t ifi_pad;
|
|
uint16_t ifi_type; /* Device type (ARPHRD) */
|
|
int32_t ifi_index; /* Unique interface index */
|
|
uint32_t ifi_flags; /* Device IFF_* flags */
|
|
uint32_t ifi_change; /* Change mask, must always be 0xffffffff */
|
|
};
|
|
|
|
/* General form of address family dependent message. */
|
|
|
|
struct rtgenmsg
|
|
{
|
|
uint8_t rtgen_family;
|
|
};
|
|
|
|
/* RTM_NEWNEIGH, RTM_DELNEIGH, RTM_GETNEIGH
|
|
* Add, remove or receive information about a neighbor table entry (e.g.,
|
|
* an ARP entry). The message contains an ndmsg structure.
|
|
*/
|
|
|
|
struct ndmsg
|
|
{
|
|
uint8_t ndm_family;
|
|
uint8_t ndm_pad1;
|
|
uint16_t ndm_pad2;
|
|
int32_t ndm_ifindex;
|
|
uint16_t ndm_state;
|
|
uint8_t ndm_flags;
|
|
uint8_t ndm_type;
|
|
};
|
|
|
|
/* Structures used in routing table administration. */
|
|
|
|
struct rtmsg
|
|
{
|
|
uint8_t rtm_family;
|
|
uint8_t rtm_dst_len;
|
|
uint8_t rtm_src_len;
|
|
uint8_t rtm_tos;
|
|
uint8_t rtm_table; /* Routing table id */
|
|
uint8_t rtm_protocol; /* Routing protocol; See RTPROT_ definitions. */
|
|
uint8_t rtm_scope; /* See RT_SCOPE_* definitions */
|
|
uint8_t rtm_type; /* See RTN_* definitions */
|
|
uint32_t rtm_flags;
|
|
};
|
|
|
|
/* Structures used in prefix information. */
|
|
|
|
struct prefixmsg
|
|
{
|
|
uint8_t prefix_family;
|
|
uint8_t prefix_pad1;
|
|
uint16_t prefix_pad2;
|
|
int32_t prefix_ifindex;
|
|
uint8_t prefix_type;
|
|
uint8_t prefix_len;
|
|
uint8_t prefix_flags;
|
|
uint8_t prefix_pad3;
|
|
};
|
|
|
|
enum
|
|
{
|
|
PREFIX_UNSPEC,
|
|
PREFIX_ADDRESS,
|
|
PREFIX_CACHEINFO,
|
|
__PREFIX_MAX
|
|
};
|
|
|
|
#define PREFIX_MAX (__PREFIX_MAX - 1)
|
|
|
|
struct prefix_cacheinfo
|
|
{
|
|
uint32_t preferred_time;
|
|
uint32_t valid_time;
|
|
};
|
|
|
|
/* <------- NLA_HDRLEN ------> <-- NLA_ALIGN(payload)-->
|
|
* +---------------------+- - -+- - - - - - - - - -+- - -+
|
|
* | Header | Pad | Payload | Pad |
|
|
* | (struct nlattr) | ing | | ing |
|
|
* +---------------------+- - -+- - - - - - - - - -+- - -+
|
|
* <-------------- nlattr->nla_len -------------->
|
|
*/
|
|
|
|
struct nlattr
|
|
{
|
|
uint16_t nla_len;
|
|
uint16_t nla_type;
|
|
};
|
|
|
|
/* Generic 32 bitflags attribute content sent to the kernel.
|
|
*
|
|
* The value is a bitmap that defines the values being set
|
|
* The selector is a bitmask that defines which value is legit
|
|
*
|
|
* Examples:
|
|
* value = 0x0, and selector = 0x1
|
|
* implies we are selecting bit 1 and we want to set its value to 0.
|
|
*
|
|
* value = 0x2, and selector = 0x2
|
|
* implies we are selecting bit 2 and we want to set its value to 1.
|
|
*
|
|
*/
|
|
|
|
struct nla_bitfield32
|
|
{
|
|
uint32_t value;
|
|
uint32_t selector;
|
|
};
|
|
|
|
/* NETLINK_NETFILTER Message Structures *************************************/
|
|
|
|
/* These attributes should be manipulated using only the NFA_* */
|
|
|
|
struct nfattr
|
|
{
|
|
uint16_t nfa_len;
|
|
uint16_t nfa_type;
|
|
};
|
|
|
|
/* General form of address family dependent message. */
|
|
|
|
struct nfgenmsg
|
|
{
|
|
uint8_t nfgen_family; /* AF_xxx */
|
|
uint8_t version; /* nfnetlink version */
|
|
uint16_t res_id; /* resource id */
|
|
};
|
|
|
|
/****************************************************************************
|
|
* Neighbor Discovery userland options
|
|
*/
|
|
|
|
struct nduseroptmsg
|
|
{
|
|
unsigned char nduseropt_family;
|
|
unsigned char nduseropt_pad1;
|
|
unsigned short nduseropt_opts_len; /* Total length of options */
|
|
int nduseropt_ifindex;
|
|
uint8_t nduseropt_icmp_type;
|
|
uint8_t nduseropt_icmp_code;
|
|
unsigned short nduseropt_pad2;
|
|
unsigned int nduseropt_pad3;
|
|
|
|
/* Followed by one or more ND options */
|
|
};
|
|
|
|
enum
|
|
{
|
|
NDUSEROPT_UNSPEC,
|
|
NDUSEROPT_SRCADDR,
|
|
__NDUSEROPT_MAX
|
|
};
|
|
|
|
/* This struct should be in sync with struct rtnl_link_stats64 */
|
|
|
|
struct rtnl_link_stats
|
|
{
|
|
uint32_t rx_packets; /* total packets received */
|
|
uint32_t tx_packets; /* total packets transmitted */
|
|
uint32_t rx_bytes; /* total bytes received */
|
|
uint32_t tx_bytes; /* total bytes transmitted */
|
|
uint32_t rx_errors; /* bad packets received */
|
|
uint32_t tx_errors; /* packet transmit problems */
|
|
uint32_t rx_dropped; /* no space in linux buffers */
|
|
uint32_t tx_dropped; /* no space available in linux */
|
|
uint32_t multicast; /* multicast packets received */
|
|
uint32_t collisions;
|
|
|
|
/* detailed rx_errors: */
|
|
|
|
uint32_t rx_length_errors;
|
|
uint32_t rx_over_errors; /* receiver ring buff overflow */
|
|
uint32_t rx_crc_errors; /* recved pkt with crc error */
|
|
uint32_t rx_frame_errors; /* recv'd frame alignment error */
|
|
uint32_t rx_fifo_errors; /* recv'r fifo overrun */
|
|
uint32_t rx_missed_errors; /* receiver missed packet */
|
|
|
|
/* detailed tx_errors */
|
|
|
|
uint32_t tx_aborted_errors;
|
|
uint32_t tx_carrier_errors;
|
|
uint32_t tx_fifo_errors;
|
|
uint32_t tx_heartbeat_errors;
|
|
uint32_t tx_window_errors;
|
|
|
|
/* for cslip etc */
|
|
|
|
uint32_t rx_compressed;
|
|
uint32_t tx_compressed;
|
|
|
|
uint32_t rx_nohandler; /* dropped, no handler found */
|
|
};
|
|
|
|
/* The main device statistics structure */
|
|
|
|
struct rtnl_link_stats64
|
|
{
|
|
uint64_t rx_packets; /* total packets received */
|
|
uint64_t tx_packets; /* total packets transmitted */
|
|
uint64_t rx_bytes; /* total bytes received */
|
|
uint64_t tx_bytes; /* total bytes transmitted */
|
|
uint64_t rx_errors; /* bad packets received */
|
|
uint64_t tx_errors; /* packet transmit problems */
|
|
uint64_t rx_dropped; /* no space in linux buffers */
|
|
uint64_t tx_dropped; /* no space available in linux */
|
|
uint64_t multicast; /* multicast packets received */
|
|
uint64_t collisions;
|
|
|
|
/* detailed rx_errors: */
|
|
|
|
uint64_t rx_length_errors;
|
|
uint64_t rx_over_errors; /* receiver ring buff overflow */
|
|
uint64_t rx_crc_errors; /* recved pkt with crc error */
|
|
uint64_t rx_frame_errors; /* recv'd frame alignment error */
|
|
uint64_t rx_fifo_errors; /* recv'r fifo overrun */
|
|
uint64_t rx_missed_errors; /* receiver missed packet */
|
|
|
|
/* detailed tx_errors */
|
|
|
|
uint64_t tx_aborted_errors;
|
|
uint64_t tx_carrier_errors;
|
|
uint64_t tx_fifo_errors;
|
|
uint64_t tx_heartbeat_errors;
|
|
uint64_t tx_window_errors;
|
|
|
|
/* for cslip etc */
|
|
|
|
uint64_t rx_compressed;
|
|
uint64_t tx_compressed;
|
|
uint64_t rx_nohandler; /* dropped, no handler found */
|
|
};
|
|
|
|
/****************************************************************************
|
|
* Public Function Prototypes
|
|
****************************************************************************/
|
|
|
|
#endif /* __INCLUDE_NETPACKET_NETLINK_H */
|