Skip to content

Commit

Permalink
This commit brings in a fragmentary, experimental implementation of N…
Browse files Browse the repository at this point in the history
…ETLINK sockets. There is not too much to that socket support on this initial commit, just the netlink socketer framework. However, I decided to bring it into master because there is a enough that I would not want to lose what is in place. And since it is dependent on CONFIG_EXPERIMENATL, its presence on master should be innocuous.

Squashed commit of the following:

    net/netlink:  Mark netlink support as EXPERIMENTAL.
    net/netlink/netlink_sockif.c:  Add netlink_getpeername to the socket interface.
    net:  Add getpeeername() support for netlink sockets.
    include/netpacket/netlink.h:  Add a few more definitions and structures used at the NetLink interface.  Still missing many.
    net/netlink:  Add basic framework for Netlink socket support.
    include/:  Add basic Netlink definitions.
  • Loading branch information
gregory-nutt committed Aug 3, 2018
1 parent caa7fa7 commit 056d704
Show file tree
Hide file tree
Showing 13 changed files with 1,403 additions and 3 deletions.
2 changes: 1 addition & 1 deletion drivers/audio/wm8776.c
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/****************************************************************************
* drivers/audio/wm8776.c
*
* Copyright 2017,2018 Sony Video & Sound Products Inc.
* Copyright 2017, 2018 Sony Video & Sound Products Inc.
* Author: Masayuki Ishikawa <Masayuki.Ishikawa@jp.sony.com>
*
* Based on drivers/audio/wm8904.c
Expand Down
323 changes: 323 additions & 0 deletions include/netpacket/netlink.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,323 @@
/****************************************************************************
* include/netpacket/netlink.h
*
* Copyright (C) 2018 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.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.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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
* COPYRIGHT OWNER 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.
*
****************************************************************************/

#ifndef __INCLUDE_NETPACKET_NETLINK_H
#define __INCLUDE_NETPACKET_NETLINK_H

/****************************************************************************
* Included Files
****************************************************************************/

#include <sys/socket.h>
#include <stdint.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
*/

#define NETLINK_ROUTE 0 /* Routing/device hook for user-space
* routing daemons */
#define NETLINK_FIREWALL 1 /* Interface to receive packets from
* the firewall */
#define NETLINK_NFLOG 2 /* netfilter/iptables ULOG */
#define NETLINK_ARPD 3 /* Interface to manage the ARP table */
#define NETLINK_AUDIT 4 /* Interface to auditing sub-system */
#define NETLINK_IP6_FW 5 /* Interface to transport packets from
* netfilter to user-space. */
#define NETLINK_ROUTE6 6
#define NETLINK_TAPBASE 7
#define NETLINK_NETFILTER 8
#define NETLINK_TCPDIAG 9
#define NETLINK_XFRM 10 /* Interface to IPsec security databases
* for key-manager daemons using the Internet
* Key Exchange protocol. */
#define NETLINK_USERSOCK 11 /* Reserved for user mode socket protocols */

/* 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 0
#define RTM_DELLINK 1
#define RTM_GETLINK 2
#define RTM_SETLINK 3

/* 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 4
#define RTM_DELADDR 5
#define RTM_GETADDR 6

/* 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 7
#define RTM_DELROUTE 8
#define RTM_GETROUTE 9

/* 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 10
#define RTM_DELNEIGH 11
#define RTM_GETNEIGH 12

/* Routing rules:
*
* RTM_NEWRULE, RTM_DELRULE, RTM_GETRULE
* Add, delete or retrieve a routing rule. Carries a struct rtmsg
*/

#define RTM_NEWRULE 13
#define RTM_DELRULE 14
#define RTM_GETRULE 15

/* 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 16
#define RTM_DELQDISC 17
#define RTM_GETQDISC 18

/* 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 19
#define RTM_DELTCLASS 20
#define RTM_GETTCLASS 21

/* 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 22
#define RTM_DELTFILTER 23
#define RTM_GETTFILTER 24

/* Others: */

#define RTM_NEWACTION 25
#define RTM_DELACTION 26
#define RTM_GETACTION 27
#define RTM_NEWPREFIX 28
#define RTM_GETPREFIX 29
#define RTM_GETMULTICAST 30
#define RTM_GETANYCAST 31
#define RTM_NEWNEIGHTBL 32
#define RTM_GETNEIGHTBL 33
#define RTM_SETNEIGHTBL 34

/* 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 rtattr ********************************************/
/* Macros to handle rtattributes */

#define RTA_ALIGNTO 4
#define RTA_ALIGN(len) (((len)+RTA_ALIGNTO-1) & ~(RTA_ALIGNTO-1))
#define RTA_OK(rta,len) \
((len) >= (int)sizeof(struct rtattr) && \
(rta)->rta_len >= sizeof(struct rtattr) && \
(rta)->rta_len <= (len))
#define RTA_NEXT(rta,attrlen) \
((attrlen) -= RTA_ALIGN((rta)->rta_len), \
(struct rtattr*)(((char*)(rta)) + RTA_ALIGN((rta)->rta_len)))
#define RTA_LENGTH(len) (RTA_ALIGN(sizeof(struct rtattr)) + (len))
#define RTA_SPACE(len) RTA_ALIGN(RTA_LENGTH(len))
#define RTA_DATA(rta) ((FAR void *)(((FAR char *)(rta)) + RTA_LENGTH(0)))
#define RTA_PAYLOAD(rta) ((int)((rta)->rta_len) - RTA_LENGTH(0))

/* Definitions for struct ifaddrmsg ****************************************/
/* ifa_flags definitions: ifa_flags is a flag word of IFA_F_SECONDARY for
* secondary address (old alias interface), IFA_F_PERMANENT for a permanent
* address set by the user and other undocumented flags.
*/

#define IFA_F_SECONDARY 0x01
#define IFA_F_PERMANENT 0x02

/****************************************************************************
* 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 */
};

/* 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 */
uint16_t ifi_type; /* Device type */
int16_t ifi_index; /* Unique interface index */
uint32_t ifi_flags; /* Device flags */
uint32_t ifi_change; /* Change mask, must always be 0xffffffff */
};

/* 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.
*/

struct ifaddrmsg
{
uint8_t ifa_family; /* Address type: AF_INET or AF_INET6 */
uint8_t ifa_prefixlen; /* Prefix length of address */
uint8_t ifa_flags; /* Address flags. See IFA_F_* definitions */
uint8_t ifa_scope; /* Address scope */
int16_t ifa_index; /* Unique interface index */
};

/****************************************************************************
* Public Function Prototypes
****************************************************************************/

#endif /* __INCLUDE_NETPACKET_NETLINK_H */
4 changes: 3 additions & 1 deletion include/sys/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
#define PF_BLUETOOTH 5 /* Bluetooth sockets */
#define PF_IEEE802154 6 /* Low level IEEE 802.15.4 radio frame interface */
#define PF_PKTRADIO 7 /* Low level packet radio interface */
#define PF_NETLINK 8 /* Netlink IPC socket */

/* Supported Address Families. Opengroup.org requires only AF_UNSPEC,
* AF_UNIX, AF_INET and AF_INET6.
Expand All @@ -76,6 +77,7 @@
#define AF_BLUETOOTH PF_BLUETOOTH
#define AF_IEEE802154 PF_IEEE802154
#define AF_PKTRADIO PF_PKTRADIO
#define AF_NETLINK PF_NETLINK

/* The socket created by socket() has the indicated type, which specifies
* the communication semantics.
Expand Down Expand Up @@ -194,7 +196,7 @@
* return: int
*/

/* Protocol-level socket operations */
/* Protocol-level socket operations. */

#define SOL_IP 1 /* See options in include/netinet/ip.h */
#define SOL_IPV6 2 /* See options in include/netinet/ip6.h */
Expand Down
2 changes: 1 addition & 1 deletion net/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,6 @@ config NET_SLIP_PKTSIZE
256 MSS, but restrict transfers to 128 bytes (possibly by modifying
the MSS value in the TCP connection structure).


config NET_GUARDSIZE
int "Driver I/O guard size"
default 2
Expand Down Expand Up @@ -307,6 +306,7 @@ source "net/socket/Kconfig"
source "net/inet/Kconfig"
source "net/pkt/Kconfig"
source "net/local/Kconfig"
source "net/netlink/Kconfig"
source "net/tcp/Kconfig"
source "net/udp/Kconfig"
source "net/bluetooth/Kconfig"
Expand Down
1 change: 1 addition & 0 deletions net/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ include neighbor/Make.defs
include igmp/Make.defs
include pkt/Make.defs
include local/Make.defs
include netlink/Make.defs
include tcp/Make.defs
include udp/Make.defs
include sixlowpan/Make.defs
Expand Down
1 change: 1 addition & 0 deletions net/README.txt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ Directory Structure
+- loopback - Local loopback
+- neighbor - Neighbor Discovery Protocol (IPv6)
+- netdev - Socket network device interface
+- netlink - Netlink IPC socket interface
+- pkt - "Raw" packet socket support
+- sixlowpan - 6LoWPAN implementation
+- socket - BSD socket interface
Expand Down
Loading

0 comments on commit 056d704

Please sign in to comment.