Date: Thu, 09 Mar 2023 16:38:14 +0100 From: Kristof Provost <kp@FreeBSD.org> To: "Alexander V. Chernikov" <melifaro@FreeBSD.org> Cc: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Subject: Re: git: 7e5bf68495cc - main - netlink: add netlink support Message-ID: <3D3095AE-60CC-4CCD-8C8A-A6E53EEB6A8A@FreeBSD.org> In-Reply-To: <202210011419.291EJ3aa000309@gitrepo.freebsd.org> References: <202210011419.291EJ3aa000309@gitrepo.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --] On 1 Oct 2022, at 16:19, Alexander V. Chernikov wrote: > The branch main has been updated by melifaro: > > URL: > https://cgit.FreeBSD.org/src/commit/?id=7e5bf68495cc0a8c9793a338a8a02009a7f6dbb6 > > commit 7e5bf68495cc0a8c9793a338a8a02009a7f6dbb6 > Author: Alexander V. Chernikov <melifaro@FreeBSD.org> > AuthorDate: 2022-01-20 21:39:21 +0000 > Commit: Alexander V. Chernikov <melifaro@FreeBSD.org> > CommitDate: 2022-10-01 14:15:35 +0000 > > netlink: add netlink support > > Netlinks is a communication protocol currently used in Linux > kernel to modify, > read and subscribe for nearly all networking state. Interfaces, > addresses, routes, > firewall, fibs, vnets, etc are controlled via netlink. > It is async, TLV-based protocol, providing 1-1 and 1-many > communications. > > The current implementation supports the subset of NETLINK_ROUTE > family. To be more specific, the following is supported: > * Dumps: > - routes > - nexthops / nexthop groups > - interfaces > - interface addresses > - neighbors (arp/ndp) > * Notifications: > - interface arrival/departure > - interface address arrival/departure > - route addition/deletion > * Modifications: > - adding/deleting routes > - adding/deleting nexthops/nexthops groups > - adding/deleting neghbors > - adding/deleting interfaces (basic support only) > * Rtsock interaction > - route events are bridged both ways > > The implementation also supports the NETLINK_GENERIC family > framework. > > Implementation notes: > Netlink is implemented via loadable/unloadable kernel module, > not touching many kernel parts. > Each netlink socket uses dedicated taskqueue to support async > operations > that can sleep, such as interface creation. All message > processing is > performed within these taskqueues. > > Compatibility: > Most of the Netlink data models specified above maps to FreeBSD > concepts > nicely. Unmodified ip(8) binary correctly works with > interfaces, addresses, routes, nexthops and nexthop groups. Some > software such as net/bird require header-only modifications to > compile > and work with FreeBSD netlink. > > Reviewed by: imp > Differential Revision: https://reviews.freebsd.org/D36002 > MFC after: 2 months > --- > etc/mtree/BSD.include.dist | 4 + > sys/modules/Makefile | 1 + > sys/modules/netlink/Makefile | 17 + > sys/net/route.c | 11 + > sys/net/route/route_ctl.h | 7 + > sys/net/rtsock.c | 42 ++ > sys/netlink/netlink.h | 257 +++++++++ > sys/netlink/netlink_ctl.h | 102 ++++ > sys/netlink/netlink_debug.h | 82 +++ > sys/netlink/netlink_domain.c | 689 +++++++++++++++++++++++ > sys/netlink/netlink_generic.c | 472 ++++++++++++++++ > sys/netlink/netlink_generic.h | 112 ++++ > sys/netlink/netlink_io.c | 528 ++++++++++++++++++ > sys/netlink/netlink_linux.h | 54 ++ > sys/netlink/netlink_message_parser.c | 472 ++++++++++++++++ > sys/netlink/netlink_message_parser.h | 270 +++++++++ > sys/netlink/netlink_message_writer.c | 686 +++++++++++++++++++++++ > sys/netlink/netlink_message_writer.h | 250 +++++++++ > sys/netlink/netlink_module.c | 228 ++++++++ > sys/netlink/netlink_route.c | 135 +++++ > sys/netlink/netlink_route.h | 43 ++ > sys/netlink/netlink_var.h | 142 +++++ > sys/netlink/route/common.h | 213 ++++++++ > sys/netlink/route/iface.c | 857 > +++++++++++++++++++++++++++++ > sys/netlink/route/iface_drivers.c | 165 ++++++ > sys/netlink/route/ifaddrs.h | 90 +++ > sys/netlink/route/interface.h | 245 +++++++++ > sys/netlink/route/neigh.c | 571 +++++++++++++++++++ > sys/netlink/route/neigh.h | 105 ++++ > sys/netlink/route/nexthop.c | 1000 > ++++++++++++++++++++++++++++++++++ > sys/netlink/route/nexthop.h | 102 ++++ > sys/netlink/route/route.c | 972 > +++++++++++++++++++++++++++++++++ > sys/netlink/route/route.h | 366 +++++++++++++ > sys/netlink/route/route_var.h | 101 ++++ > 34 files changed, 9391 insertions(+) > > diff --git a/sys/netlink/netlink.h b/sys/netlink/netlink.h > new file mode 100644 > index 000000000000..6a68dcec1382 > --- /dev/null > +++ b/sys/netlink/netlink.h > @@ -0,0 +1,257 @@ > +/*- > + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD > + * > + * Copyright (c) 2021 Ng Peng Nam Sean > + * Copyright (c) 2022 Alexander V. Chernikov <melifaro@FreeBSD.org> > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions > + * are met: > + * 1. Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * 2. Redistributions in binary form must reproduce the above > copyright > + * notice, this list of conditions and the following disclaimer in > the > + * documentation and/or other materials provided with the > distribution. > + * > + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' > AND > + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, > THE > + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR > PURPOSE > + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE > LIABLE > + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR > CONSEQUENTIAL > + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE > GOODS > + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS > INTERRUPTION) > + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN > CONTRACT, STRICT > + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN > ANY WAY > + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE > POSSIBILITY OF > + * SUCH DAMAGE. > + * > + * Copyright (C) The Internet Society (2003). All Rights Reserved. > + * > + * This document and translations of it may be copied and furnished > to > + * others, and derivative works that comment on or otherwise explain > it > + * or assist in its implementation may be prepared, copied, published > + * and distributed, in whole or in part, without restriction of any > + * kind, provided that the above copyright notice and this paragraph > are > + * included on all such copies and derivative works. However, this > + * document itself may not be modified in any way, such as by > removing > + * the copyright notice or references to the Internet Society or > other > + * Internet organizations, except as needed for the purpose of > + * developing Internet standards in which case the procedures for > + * copyrights defined in the Internet Standards process must be > + * followed, or as required to translate it into languages other than > + * English. > + * > + * The limited permissions granted above are perpetual and will not > be > + * revoked by the Internet Society or its successors or assignees. > + * > + * This document and the information contained herein is provided on > an > + * "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET > ENGINEERING > + * TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING > + * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION > + * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF > + * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. > + > + */ > + > +/* > + * This file contains structures and constants for RFC 3549 (Netlink) > + * protocol. Some values have been taken from Linux implementation. > + */ > + > +#ifndef _NETLINK_NETLINK_H_ > +#define _NETLINK_NETLINK_H_ > + > +#include <sys/types.h> > +#include <sys/socket.h> > + > +struct sockaddr_nl { > + uint8_t nl_len; /* sizeof(sockaddr_nl) */ > + sa_family_t nl_family; /* netlink family */ > + uint16_t nl_pad; /* reserved, set to 0 */ > + uint32_t nl_pid; /* desired port ID, 0 for auto-select */ > + uint32_t nl_groups; /* multicast groups mask to bind to */ > +}; > + > +#define SOL_NETLINK 270 > + > +/* Netlink socket options */ > +#define NETLINK_ADD_MEMBERSHIP 1 /* Subscribe for the specified > group notifications */ > +#define NETLINK_DROP_MEMBERSHIP 2 /* Unsubscribe from the specified > group */ > +#define NETLINK_PKTINFO 3 /* XXX: not supported */ > +#define NETLINK_BROADCAST_ERROR 4 /* XXX: not supported */ > +#define NETLINK_NO_ENOBUFS 5 /* XXX: not supported */ > +#define NETLINK_RX_RING 6 /* XXX: not supported */ > +#define NETLINK_TX_RING 7 /* XXX: not supported */ > +#define NETLINK_LISTEN_ALL_NSID 8 /* XXX: not supported */ > + > +#define NETLINK_LIST_MEMBERSHIPS 9 > +#define NETLINK_CAP_ACK 10 /* Send only original message header in > the reply */ > +#define NETLINK_EXT_ACK 11 /* Ack support for receiving additional > TLVs in ack */ > +#define NETLINK_GET_STRICT_CHK 12 /* Strict header checking */ > + > + > +/* > + * RFC 3549, 2.3.2 Netlink Message Header > + */ > +struct nlmsghdr { > + uint32_t nlmsg_len; /* Length of message including header */ > + uint16_t nlmsg_type; /* Message type identifier */ > + uint16_t nlmsg_flags; /* Flags (NLM_F_) */ > + uint32_t nlmsg_seq; /* Sequence number */ > + uint32_t nlmsg_pid; /* Sending process port ID */ > +}; > + > +/* > + * RFC 3549, 2.3.2 standard flag bits (nlmsg_flags) > + */ > +#define NLM_F_REQUEST 0x01 /* Indicateds request to kernel */ > +#define NLM_F_MULTI 0x02 /* Message is part of a group terminated by > NLMSG_DONE msg */ > +#define NLM_F_ACK 0x04 /* Reply with ack message containing > resulting error code */ > +#define NLM_F_ECHO 0x08 /* (not supported) Echo this request back */ > +#define NLM_F_DUMP_INTR 0x10 /* Dump was inconsistent due to > sequence change */ > +#define NLM_F_DUMP_FILTERED 0x20 /* Dump was filtered as requested */ > + > +/* > + * RFC 3549, 2.3.2 Additional flag bits for GET requests > + */ > +#define NLM_F_ROOT 0x100 /* Return the complete table */ > +#define NLM_F_MATCH 0x200 /* Return all entries matching criteria */ > +#define NLM_F_ATOMIC 0x400 /* Return an atomic snapshot (ignored) */ > +#define NLM_F_DUMP (NLM_F_ROOT | NLM_F_MATCH) > + > +/* > + * RFC 3549, 2.3.2 Additional flag bits for NEW requests > + */ > +#define NLM_F_REPLACE 0x100 /* Replace existing matching config > object */ > +#define NLM_F_EXCL 0x200 /* Don't replace the object if exists */ > +#define NLM_F_CREATE 0x400 /* Create if it does not exist */ > +#define NLM_F_APPEND 0x800 /* Add to end of list */ > + > +/* Modifiers to DELETE requests */ > +#define NLM_F_NONREC 0x100 /* Do not delete recursively */ > + > +/* Flags for ACK message */ > +#define NLM_F_CAPPED 0x100 /* request was capped */ > +#define NLM_F_ACK_TLVS 0x200 /* extended ACK TVLs were included */ > + > +/* > + * RFC 3549, 2.3.2 standard message types (nlmsg_type). > + */ > +#define NLMSG_NOOP 0x1 /* Message is ignored. */ > +#define NLMSG_ERROR 0x2 /* reply error code reporting */ > +#define NLMSG_DONE 0x3 /* Message terminates a multipart message. */ > +#define NLMSG_OVERRUN 0x4 /* overrun detected, data is lost */ > + > +#define NLMSG_MIN_TYPE 0x10 /* < 0x10: reserved control messages */ > + > +/* > + * Defition of numbers assigned to the netlink subsystems. > + */ > +#define NETLINK_ROUTE 0 /* Routing/device hook */ > +#define NETLINK_UNUSED 1 /* not supported */ > +#define NETLINK_USERSOCK 2 /* not supported */ > +#define NETLINK_FIREWALL 3 /* not supported */ > +#define NETLINK_SOCK_DIAG 4 /* not supported */ > +#define NETLINK_NFLOG 5 /* not supported */ > +#define NETLINK_XFRM 6 /* (not supported) PF_SETKEY */ > +#define NETLINK_SELINUX 7 /* not supported */ > +#define NETLINK_ISCSI 8 /* not supported */ > +#define NETLINK_AUDIT 9 /* not supported */ > +#define NETLINK_FIB_LOOKUP 10 /* not supported */ > +#define NETLINK_CONNECTOR 11 /* not supported */ > +#define NETLINK_NETFILTER 12 /* not supported */ > +#define NETLINK_IP6_FW 13 /* not supported */ > +#define NETLINK_DNRTMSG 14 /* not supported */ > +#define NETLINK_KOBJECT_UEVENT 15 /* not supported */ > +#define NETLINK_GENERIC 16 /* Generic netlink (dynamic families) */ > + So, really fun thing here, we also have `#define NETLINK_GENERIC 0` in sys/net/if_mib.h. (And that’s exposed to userspace, and used there, so we can’t just change that.) Which leads to much fun if we decided to do something like including the netlink_generic header in other headers, so we can define messages that contain the genlmsghdr struct. I ran into that experimenting with netlink for carp(4). I think I can work around it by adding a separate ip_carp_nl.h header for the netlink stuff, but sooner or later this is going to bite us. Kristof [-- Attachment #2 --] <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/xhtml; charset=utf-8"> </head> <body><div style="font-family: sans-serif;"><div class="markdown" style="white-space: normal;"> <p dir="auto">On 1 Oct 2022, at 16:19, Alexander V. Chernikov wrote:</p> </div><div class="plaintext" style="white-space: normal;"><blockquote style="margin: 0 0 5px; padding-left: 5px; border-left: 2px solid #136BCE; color: #136BCE;"><p dir="auto">The branch main has been updated by melifaro:</p> <p dir="auto">URL: <a href="https://cgit.FreeBSD.org/src/commit/?id=7e5bf68495cc0a8c9793a338a8a02009a7f6dbb6">https://cgit.FreeBSD.org/src/commit/?id=7e5bf68495cc0a8c9793a338a8a02009a7f6dbb6</a></p> <p dir="auto">commit 7e5bf68495cc0a8c9793a338a8a02009a7f6dbb6 <br> Author: Alexander V. Chernikov <melifaro@FreeBSD.org> <br> AuthorDate: 2022-01-20 21:39:21 +0000 <br> Commit: Alexander V. Chernikov <melifaro@FreeBSD.org> <br> CommitDate: 2022-10-01 14:15:35 +0000</p> <p dir="auto"> netlink: add netlink support</p> <p dir="auto"> Netlinks is a communication protocol currently used in Linux kernel to modify, <br> read and subscribe for nearly all networking state. Interfaces, addresses, routes, <br> firewall, fibs, vnets, etc are controlled via netlink. <br> It is async, TLV-based protocol, providing 1-1 and 1-many communications.</p> <p dir="auto"> The current implementation supports the subset of NETLINK_ROUTE <br> family. To be more specific, the following is supported: <br> * Dumps: <br> - routes <br> - nexthops / nexthop groups <br> - interfaces <br> - interface addresses <br> - neighbors (arp/ndp) <br> * Notifications: <br> - interface arrival/departure <br> - interface address arrival/departure <br> - route addition/deletion <br> * Modifications: <br> - adding/deleting routes <br> - adding/deleting nexthops/nexthops groups <br> - adding/deleting neghbors <br> - adding/deleting interfaces (basic support only) <br> * Rtsock interaction <br> - route events are bridged both ways</p> <p dir="auto"> The implementation also supports the NETLINK_GENERIC family framework.</p> <p dir="auto"> Implementation notes: <br> Netlink is implemented via loadable/unloadable kernel module, <br> not touching many kernel parts. <br> Each netlink socket uses dedicated taskqueue to support async operations <br> that can sleep, such as interface creation. All message processing is <br> performed within these taskqueues.</p> <p dir="auto"> Compatibility: <br> Most of the Netlink data models specified above maps to FreeBSD concepts <br> nicely. Unmodified ip(8) binary correctly works with <br> interfaces, addresses, routes, nexthops and nexthop groups. Some <br> software such as net/bird require header-only modifications to compile <br> and work with FreeBSD netlink.</p> <p dir="auto"> Reviewed by: imp <br> Differential Revision: <a href="https://reviews.freebsd.org/D36002">https://reviews.freebsd.org/D36002</a> <br> MFC after: 2 months <br> --- <br> etc/mtree/BSD.include.dist | 4 + <br> sys/modules/Makefile | 1 + <br> sys/modules/netlink/Makefile | 17 + <br> sys/net/route.c | 11 + <br> sys/net/route/route_ctl.h | 7 + <br> sys/net/rtsock.c | 42 ++ <br> sys/netlink/netlink.h | 257 +++++++++ <br> sys/netlink/netlink_ctl.h | 102 ++++ <br> sys/netlink/netlink_debug.h | 82 +++ <br> sys/netlink/netlink_domain.c | 689 +++++++++++++++++++++++ <br> sys/netlink/netlink_generic.c | 472 ++++++++++++++++ <br> sys/netlink/netlink_generic.h | 112 ++++ <br> sys/netlink/netlink_io.c | 528 ++++++++++++++++++ <br> sys/netlink/netlink_linux.h | 54 ++ <br> sys/netlink/netlink_message_parser.c | 472 ++++++++++++++++ <br> sys/netlink/netlink_message_parser.h | 270 +++++++++ <br> sys/netlink/netlink_message_writer.c | 686 +++++++++++++++++++++++ <br> sys/netlink/netlink_message_writer.h | 250 +++++++++ <br> sys/netlink/netlink_module.c | 228 ++++++++ <br> sys/netlink/netlink_route.c | 135 +++++ <br> sys/netlink/netlink_route.h | 43 ++ <br> sys/netlink/netlink_var.h | 142 +++++ <br> sys/netlink/route/common.h | 213 ++++++++ <br> sys/netlink/route/iface.c | 857 +++++++++++++++++++++++++++++ <br> sys/netlink/route/iface_drivers.c | 165 ++++++ <br> sys/netlink/route/ifaddrs.h | 90 +++ <br> sys/netlink/route/interface.h | 245 +++++++++ <br> sys/netlink/route/neigh.c | 571 +++++++++++++++++++ <br> sys/netlink/route/neigh.h | 105 ++++ <br> sys/netlink/route/nexthop.c | 1000 ++++++++++++++++++++++++++++++++++ <br> sys/netlink/route/nexthop.h | 102 ++++ <br> sys/netlink/route/route.c | 972 +++++++++++++++++++++++++++++++++ <br> sys/netlink/route/route.h | 366 +++++++++++++ <br> sys/netlink/route/route_var.h | 101 ++++ <br> 34 files changed, 9391 insertions(+)</p> <p dir="auto">diff --git a/sys/netlink/netlink.h b/sys/netlink/netlink.h <br> new file mode 100644 <br> index 000000000000..6a68dcec1382 <br> --- /dev/null <br> +++ b/sys/netlink/netlink.h <br> @@ -0,0 +1,257 @@ <br> +/*- <br> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD <br> + * <br> + * Copyright (c) 2021 Ng Peng Nam Sean <br> + * Copyright (c) 2022 Alexander V. Chernikov <melifaro@FreeBSD.org> <br> + * <br> + * Redistribution and use in source and binary forms, with or without <br> + * modification, are permitted provided that the following conditions <br> + * are met: <br> + * 1. Redistributions of source code must retain the above copyright <br> + * notice, this list of conditions and the following disclaimer. <br> + * 2. Redistributions in binary form must reproduce the above copyright <br> + * notice, this list of conditions and the following disclaimer in the <br> + * documentation and/or other materials provided with the distribution. <br> + * <br> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND <br> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE <br> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE <br> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE <br> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL <br> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS <br> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) <br> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT <br> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY <br> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF <br> + * SUCH DAMAGE. <br> + * <br> + * Copyright (C) The Internet Society (2003). All Rights Reserved. <br> + * <br> + * This document and translations of it may be copied and furnished to <br> + * others, and derivative works that comment on or otherwise explain it <br> + * or assist in its implementation may be prepared, copied, published <br> + * and distributed, in whole or in part, without restriction of any <br> + * kind, provided that the above copyright notice and this paragraph are <br> + * included on all such copies and derivative works. However, this <br> + * document itself may not be modified in any way, such as by removing <br> + * the copyright notice or references to the Internet Society or other <br> + * Internet organizations, except as needed for the purpose of <br> + * developing Internet standards in which case the procedures for <br> + * copyrights defined in the Internet Standards process must be <br> + * followed, or as required to translate it into languages other than <br> + * English. <br> + * <br> + * The limited permissions granted above are perpetual and will not be <br> + * revoked by the Internet Society or its successors or assignees. <br> + * <br> + * This document and the information contained herein is provided on an <br> + * "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING <br> + * TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING <br> + * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION <br> + * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF <br> + * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. <br> + <br> + */ <br> + <br> +/* <br> + * This file contains structures and constants for RFC 3549 (Netlink) <br> + * protocol. Some values have been taken from Linux implementation. <br> + */ <br> + <br> +#ifndef _NETLINK_NETLINK_H_ <br> +#define _NETLINK_NETLINK_H_ <br> + <br> +#include <sys/types.h> <br> +#include <sys/socket.h> <br> + <br> +struct sockaddr_nl { <br> + uint8_t nl_len; /* sizeof(sockaddr_nl) */ <br> + sa_family_t nl_family; /* netlink family */ <br> + uint16_t nl_pad; /* reserved, set to 0 */ <br> + uint32_t nl_pid; /* desired port ID, 0 for auto-select */ <br> + uint32_t nl_groups; /* multicast groups mask to bind to */ <br> +}; <br> + <br> +#define SOL_NETLINK 270 <br> + <br> +/* Netlink socket options */ <br> +#define NETLINK_ADD_MEMBERSHIP 1 /* Subscribe for the specified group notifications */ <br> +#define NETLINK_DROP_MEMBERSHIP 2 /* Unsubscribe from the specified group */ <br> +#define NETLINK_PKTINFO 3 /* XXX: not supported */ <br> +#define NETLINK_BROADCAST_ERROR 4 /* XXX: not supported */ <br> +#define NETLINK_NO_ENOBUFS 5 /* XXX: not supported */ <br> +#define NETLINK_RX_RING 6 /* XXX: not supported */ <br> +#define NETLINK_TX_RING 7 /* XXX: not supported */ <br> +#define NETLINK_LISTEN_ALL_NSID 8 /* XXX: not supported */ <br> + <br> +#define NETLINK_LIST_MEMBERSHIPS 9 <br> +#define NETLINK_CAP_ACK 10 /* Send only original message header in the reply */ <br> +#define NETLINK_EXT_ACK 11 /* Ack support for receiving additional TLVs in ack */ <br> +#define NETLINK_GET_STRICT_CHK 12 /* Strict header checking */ <br> + <br> + <br> +/* <br> + * RFC 3549, 2.3.2 Netlink Message Header <br> + */ <br> +struct nlmsghdr { <br> + uint32_t nlmsg_len; /* Length of message including header */ <br> + uint16_t nlmsg_type; /* Message type identifier */ <br> + uint16_t nlmsg_flags; /* Flags (NLM_F_) */ <br> + uint32_t nlmsg_seq; /* Sequence number */ <br> + uint32_t nlmsg_pid; /* Sending process port ID */ <br> +}; <br> + <br> +/* <br> + * RFC 3549, 2.3.2 standard flag bits (nlmsg_flags) <br> + */ <br> +#define NLM_F_REQUEST 0x01 /* Indicateds request to kernel */ <br> +#define NLM_F_MULTI 0x02 /* Message is part of a group terminated by NLMSG_DONE msg */ <br> +#define NLM_F_ACK 0x04 /* Reply with ack message containing resulting error code */ <br> +#define NLM_F_ECHO 0x08 /* (not supported) Echo this request back */ <br> +#define NLM_F_DUMP_INTR 0x10 /* Dump was inconsistent due to sequence change */ <br> +#define NLM_F_DUMP_FILTERED 0x20 /* Dump was filtered as requested */ <br> + <br> +/* <br> + * RFC 3549, 2.3.2 Additional flag bits for GET requests <br> + */ <br> +#define NLM_F_ROOT 0x100 /* Return the complete table */ <br> +#define NLM_F_MATCH 0x200 /* Return all entries matching criteria */ <br> +#define NLM_F_ATOMIC 0x400 /* Return an atomic snapshot (ignored) */ <br> +#define NLM_F_DUMP (NLM_F_ROOT | NLM_F_MATCH) <br> + <br> +/* <br> + * RFC 3549, 2.3.2 Additional flag bits for NEW requests <br> + */ <br> +#define NLM_F_REPLACE 0x100 /* Replace existing matching config object */ <br> +#define NLM_F_EXCL 0x200 /* Don't replace the object if exists */ <br> +#define NLM_F_CREATE 0x400 /* Create if it does not exist */ <br> +#define NLM_F_APPEND 0x800 /* Add to end of list */ <br> + <br> +/* Modifiers to DELETE requests */ <br> +#define NLM_F_NONREC 0x100 /* Do not delete recursively */ <br> + <br> +/* Flags for ACK message */ <br> +#define NLM_F_CAPPED 0x100 /* request was capped */ <br> +#define NLM_F_ACK_TLVS 0x200 /* extended ACK TVLs were included */ <br> + <br> +/* <br> + * RFC 3549, 2.3.2 standard message types (nlmsg_type). <br> + */ <br> +#define NLMSG_NOOP 0x1 /* Message is ignored. */ <br> +#define NLMSG_ERROR 0x2 /* reply error code reporting */ <br> +#define NLMSG_DONE 0x3 /* Message terminates a multipart message. */ <br> +#define NLMSG_OVERRUN 0x4 /* overrun detected, data is lost */ <br> + <br> +#define NLMSG_MIN_TYPE 0x10 /* < 0x10: reserved control messages */ <br> + <br> +/* <br> + * Defition of numbers assigned to the netlink subsystems. <br> + */ <br> +#define NETLINK_ROUTE 0 /* Routing/device hook */ <br> +#define NETLINK_UNUSED 1 /* not supported */ <br> +#define NETLINK_USERSOCK 2 /* not supported */ <br> +#define NETLINK_FIREWALL 3 /* not supported */ <br> +#define NETLINK_SOCK_DIAG 4 /* not supported */ <br> +#define NETLINK_NFLOG 5 /* not supported */ <br> +#define NETLINK_XFRM 6 /* (not supported) PF_SETKEY */ <br> +#define NETLINK_SELINUX 7 /* not supported */ <br> +#define NETLINK_ISCSI 8 /* not supported */ <br> +#define NETLINK_AUDIT 9 /* not supported */ <br> +#define NETLINK_FIB_LOOKUP 10 /* not supported */ <br> +#define NETLINK_CONNECTOR 11 /* not supported */ <br> +#define NETLINK_NETFILTER 12 /* not supported */ <br> +#define NETLINK_IP6_FW 13 /* not supported */ <br> +#define NETLINK_DNRTMSG 14 /* not supported */ <br> +#define NETLINK_KOBJECT_UEVENT 15 /* not supported */ <br> +#define NETLINK_GENERIC 16 /* Generic netlink (dynamic families) */ <br> +</p> </blockquote></div> <div class="markdown" style="white-space: normal;"> <p dir="auto">So, really fun thing here, we also have <code style="padding: 0 0.25em; background-color: #E4E4E4;">#define NETLINK_GENERIC 0</code> in sys/net/if_mib.h. (And that’s exposed to userspace, and used there, so we can’t just change that.)</p> <p dir="auto">Which leads to much fun if we decided to do something like including the netlink_generic header in other headers, so we can define messages that contain the genlmsghdr struct.</p> <p dir="auto">I ran into that experimenting with netlink for carp(4). I think I can work around it by adding a separate ip_carp_nl.h header for the netlink stuff, but sooner or later this is going to bite us.</p> <p dir="auto">Kristof</p> </div> </div> </body> </html>
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3D3095AE-60CC-4CCD-8C8A-A6E53EEB6A8A>
