/src/openvswitch/lib/netlink.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (c) 2008, 2009, 2010, 2011, 2013, 2015 Nicira, Inc. |
3 | | * |
4 | | * Licensed under the Apache License, Version 2.0 (the "License"); |
5 | | * you may not use this file except in compliance with the License. |
6 | | * You may obtain a copy of the License at: |
7 | | * |
8 | | * http://www.apache.org/licenses/LICENSE-2.0 |
9 | | * |
10 | | * Unless required by applicable law or agreed to in writing, software |
11 | | * distributed under the License is distributed on an "AS IS" BASIS, |
12 | | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
13 | | * See the License for the specific language governing permissions and |
14 | | * limitations under the License. |
15 | | */ |
16 | | |
17 | | #ifndef NETLINK_H |
18 | | #define NETLINK_H 1 |
19 | | |
20 | | /* Netlink message helpers. |
21 | | * |
22 | | * Netlink is a datagram-based network protocol primarily for communication |
23 | | * between user processes and the kernel, and mainly on Linux. Netlink is |
24 | | * specified in RFC 3549, "Linux Netlink as an IP Services Protocol". |
25 | | * |
26 | | * Netlink is not suitable for use in physical networks of heterogeneous |
27 | | * machines because host byte order is used throughout. |
28 | | * |
29 | | * This header file defines helper functions for working with Netlink messages. |
30 | | * For Netlink protocol definitions, see netlink-protocol.h. For |
31 | | * Linux-specific definitions for Netlink sockets, see netlink-socket.h. |
32 | | */ |
33 | | |
34 | | #include <sys/types.h> |
35 | | #include <netinet/in.h> |
36 | | #include <stdbool.h> |
37 | | #include <stddef.h> |
38 | | #include <stdint.h> |
39 | | #include "netlink-protocol.h" |
40 | | #include "openvswitch/types.h" |
41 | | |
42 | | struct ofpbuf; |
43 | | struct nlattr; |
44 | | |
45 | | /* Accessing headers and data. */ |
46 | | struct nlmsghdr *nl_msg_nlmsghdr(const struct ofpbuf *); |
47 | | struct genlmsghdr *nl_msg_genlmsghdr(const struct ofpbuf *); |
48 | | bool nl_msg_nlmsgerr(const struct ofpbuf *, int *error, const char **attr_msg); |
49 | | void nl_msg_reserve(struct ofpbuf *, size_t); |
50 | | |
51 | | /* Appending and prepending headers and raw data. */ |
52 | | void nl_msg_put_nlmsghdr(struct ofpbuf *, size_t expected_payload, |
53 | | uint32_t type, uint32_t flags); |
54 | | void nl_msg_put_genlmsghdr(struct ofpbuf *, size_t expected_payload, |
55 | | int family, uint32_t flags, |
56 | | uint8_t cmd, uint8_t version); |
57 | | void nl_msg_put(struct ofpbuf *, const void *, size_t); |
58 | | void *nl_msg_put_uninit(struct ofpbuf *, size_t); |
59 | | void nl_msg_push(struct ofpbuf *, const void *, size_t); |
60 | | void *nl_msg_push_uninit(struct ofpbuf *, size_t); |
61 | | |
62 | | /* Appending attributes. */ |
63 | | void *nl_msg_put_unspec_uninit(struct ofpbuf *, uint16_t type, size_t); |
64 | | void *nl_msg_put_unspec_zero(struct ofpbuf *, uint16_t type, size_t); |
65 | | void nl_msg_put_unspec(struct ofpbuf *, uint16_t type, const void *, size_t); |
66 | | void nl_msg_put_flag(struct ofpbuf *, uint16_t type); |
67 | | void nl_msg_put_u8(struct ofpbuf *, uint16_t type, uint8_t value); |
68 | | void nl_msg_put_u16(struct ofpbuf *, uint16_t type, uint16_t value); |
69 | | void nl_msg_put_u32(struct ofpbuf *, uint16_t type, uint32_t value); |
70 | | void nl_msg_put_u64(struct ofpbuf *, uint16_t type, uint64_t value); |
71 | | void nl_msg_put_u128(struct ofpbuf *, uint16_t type, ovs_u128 value); |
72 | | void nl_msg_put_be16(struct ofpbuf *, uint16_t type, ovs_be16 value); |
73 | | void nl_msg_put_be32(struct ofpbuf *, uint16_t type, ovs_be32 value); |
74 | | void nl_msg_put_be64(struct ofpbuf *, uint16_t type, ovs_be64 value); |
75 | | void nl_msg_put_be128(struct ofpbuf *, uint16_t type, ovs_be128 value); |
76 | | void nl_msg_put_in6_addr(struct ofpbuf *msg, uint16_t type, |
77 | | const struct in6_addr *value); |
78 | | void nl_msg_put_odp_port(struct ofpbuf *, uint16_t type, odp_port_t value); |
79 | | void nl_msg_put_string__(struct ofpbuf *, uint16_t type, const char *value, |
80 | | size_t len); |
81 | | void nl_msg_put_string(struct ofpbuf *, uint16_t type, const char *value); |
82 | | |
83 | | size_t nl_msg_start_nested(struct ofpbuf *, uint16_t type); |
84 | | size_t nl_msg_start_nested_with_flag(struct ofpbuf *, uint16_t type); |
85 | | void nl_msg_end_nested(struct ofpbuf *, size_t offset); |
86 | | void nl_msg_cancel_nested(struct ofpbuf *, size_t offset); |
87 | | bool nl_msg_end_non_empty_nested(struct ofpbuf *, size_t offset); |
88 | | void nl_msg_put_nested(struct ofpbuf *, uint16_t type, |
89 | | const void *data, size_t size); |
90 | | void nl_msg_reset_size(struct ofpbuf *, size_t offset); |
91 | | |
92 | | /* Prepending attributes. */ |
93 | | void *nl_msg_push_unspec_uninit(struct ofpbuf *, uint16_t type, size_t); |
94 | | void nl_msg_push_unspec(struct ofpbuf *, uint16_t type, const void *, size_t); |
95 | | void nl_msg_push_flag(struct ofpbuf *, uint16_t type); |
96 | | void nl_msg_push_u8(struct ofpbuf *, uint16_t type, uint8_t value); |
97 | | void nl_msg_push_u16(struct ofpbuf *, uint16_t type, uint16_t value); |
98 | | void nl_msg_push_u32(struct ofpbuf *, uint16_t type, uint32_t value); |
99 | | void nl_msg_push_u64(struct ofpbuf *, uint16_t type, uint64_t value); |
100 | | void nl_msg_push_u128(struct ofpbuf *, uint16_t type, ovs_u128 value); |
101 | | void nl_msg_push_be16(struct ofpbuf *, uint16_t type, ovs_be16 value); |
102 | | void nl_msg_push_be32(struct ofpbuf *, uint16_t type, ovs_be32 value); |
103 | | void nl_msg_push_be64(struct ofpbuf *, uint16_t type, ovs_be64 value); |
104 | | void nl_msg_push_be128(struct ofpbuf *, uint16_t type, ovs_be128 value); |
105 | | void nl_msg_push_string(struct ofpbuf *, uint16_t type, const char *value); |
106 | | |
107 | | /* Separating buffers into individual messages. */ |
108 | | struct nlmsghdr *nl_msg_next(struct ofpbuf *buffer, struct ofpbuf *msg); |
109 | | |
110 | | /* Sizes of various attribute types, in bytes, including the attribute header |
111 | | * and padding. |
112 | | * |
113 | | * A minimum-size attribute is 4 bytes long: 4 bytes of header, no bytes of |
114 | | * payload, no padding. |
115 | | * |
116 | | * A maximum-size attribute is 65536 bytes long: 4 bytes of header, 65531 bytes |
117 | | * of payload, 1 byte of padding. (Thus, NL_ATTR_SIZE() of a maximum length |
118 | | * attribute payload does not fit in 16 bits.) */ |
119 | 0 | #define NL_ATTR_SIZE(PAYLOAD_SIZE) (NLA_HDRLEN + NLA_ALIGN(PAYLOAD_SIZE)) |
120 | | #define NL_A_U8_SIZE NL_ATTR_SIZE(sizeof(uint8_t)) |
121 | | #define NL_A_U16_SIZE NL_ATTR_SIZE(sizeof(uint16_t)) |
122 | 0 | #define NL_A_U32_SIZE NL_ATTR_SIZE(sizeof(uint32_t)) |
123 | | #define NL_A_U64_SIZE NL_ATTR_SIZE(sizeof(uint64_t)) |
124 | | #define NL_A_U128_SIZE NL_ATTR_SIZE(sizeof(ovs_u128)) |
125 | | #define NL_A_BE16_SIZE NL_ATTR_SIZE(sizeof(ovs_be16)) |
126 | | #define NL_A_BE32_SIZE NL_ATTR_SIZE(sizeof(ovs_be32)) |
127 | | #define NL_A_BE64_SIZE NL_ATTR_SIZE(sizeof(ovs_be64)) |
128 | | #define NL_A_BE128_SIZE NL_ATTR_SIZE(sizeof(ovs_be128)) |
129 | | #define NL_A_FLAG_SIZE NL_ATTR_SIZE(0) |
130 | | #define NL_A_IPV6_SIZE NL_ATTR_SIZE(sizeof(struct in6_addr)) |
131 | | #define NL_A_LL_ADDR_ETH_SIZE NL_ATTR_SIZE(sizeof(struct eth_addr)) |
132 | | #define NL_A_LL_ADDR_IB_SIZE NL_ATTR_SIZE(sizeof(struct ib_addr)) |
133 | | |
134 | | bool nl_attr_oversized(size_t payload_size); |
135 | | |
136 | | /* Netlink attribute types. */ |
137 | | enum nl_attr_type |
138 | | { |
139 | | NL_A_NO_ATTR = 0, |
140 | | NL_A_UNSPEC, |
141 | | NL_A_U8, |
142 | | NL_A_U16, |
143 | | NL_A_BE16 = NL_A_U16, |
144 | | NL_A_U32, |
145 | | NL_A_BE32 = NL_A_U32, |
146 | | NL_A_U64, |
147 | | NL_A_BE64 = NL_A_U64, |
148 | | NL_A_U128, |
149 | | NL_A_BE128 = NL_A_U128, |
150 | | NL_A_STRING, |
151 | | NL_A_FLAG, |
152 | | NL_A_IPV6, |
153 | | NL_A_NESTED, |
154 | | NL_A_LL_ADDR, |
155 | | NL_A_RTA_VIA, |
156 | | N_NL_ATTR_TYPES |
157 | | }; |
158 | | |
159 | | /* Netlink attribute iteration. */ |
160 | | static inline struct nlattr * |
161 | | nl_attr_next(const struct nlattr *nla) |
162 | 0 | { |
163 | 0 | return ALIGNED_CAST(struct nlattr *, |
164 | 0 | ((uint8_t *) nla + NLA_ALIGN(nla->nla_len))); |
165 | 0 | } Unexecuted instantiation: ofp_print_target.c:nl_attr_next Unexecuted instantiation: ofp-print.c:nl_attr_next Unexecuted instantiation: ofp-queue.c:nl_attr_next Unexecuted instantiation: ofp-table.c:nl_attr_next Unexecuted instantiation: ofp-util.c:nl_attr_next Unexecuted instantiation: dp-packet.c:nl_attr_next Unexecuted instantiation: flow.c:nl_attr_next Unexecuted instantiation: match.c:nl_attr_next Unexecuted instantiation: meta-flow.c:nl_attr_next Unexecuted instantiation: netdev.c:nl_attr_next Unexecuted instantiation: nx-match.c:nl_attr_next Unexecuted instantiation: ofp-actions.c:nl_attr_next Unexecuted instantiation: ofp-ct.c:nl_attr_next Unexecuted instantiation: ofp-ed-props.c:nl_attr_next Unexecuted instantiation: ofp-flow.c:nl_attr_next Unexecuted instantiation: ofp-group.c:nl_attr_next Unexecuted instantiation: ofp-match.c:nl_attr_next Unexecuted instantiation: ofp-meter.c:nl_attr_next Unexecuted instantiation: ofp-monitor.c:nl_attr_next Unexecuted instantiation: ofp-packet.c:nl_attr_next Unexecuted instantiation: ofp-parse.c:nl_attr_next Unexecuted instantiation: ofp-port.c:nl_attr_next Unexecuted instantiation: ovs-router.c:nl_attr_next Unexecuted instantiation: packets.c:nl_attr_next Unexecuted instantiation: smap.c:nl_attr_next Unexecuted instantiation: socket-util.c:nl_attr_next Unexecuted instantiation: tnl-ports.c:nl_attr_next Unexecuted instantiation: tun-metadata.c:nl_attr_next Unexecuted instantiation: netdev-linux.c:nl_attr_next Unexecuted instantiation: netdev-offload-tc.c:nl_attr_next Unexecuted instantiation: netlink-socket.c:nl_attr_next Unexecuted instantiation: rtnetlink.c:nl_attr_next Unexecuted instantiation: route-table.c:nl_attr_next Unexecuted instantiation: tc.c:nl_attr_next Unexecuted instantiation: bundle.c:nl_attr_next Unexecuted instantiation: classifier.c:nl_attr_next Unexecuted instantiation: dp-packet-gso.c:nl_attr_next Unexecuted instantiation: dpif.c:nl_attr_next Unexecuted instantiation: learn.c:nl_attr_next Unexecuted instantiation: multipath.c:nl_attr_next Unexecuted instantiation: netdev-offload.c:nl_attr_next Unexecuted instantiation: netdev-vport.c:nl_attr_next Unexecuted instantiation: netlink.c:nl_attr_next Unexecuted instantiation: odp-execute.c:nl_attr_next Unexecuted instantiation: odp-execute-private.c:nl_attr_next Unexecuted instantiation: odp-util.c:nl_attr_next Unexecuted instantiation: stream.c:nl_attr_next Unexecuted instantiation: tnl-neigh-cache.c:nl_attr_next Unexecuted instantiation: netdev-native-tnl.c:nl_attr_next Unexecuted instantiation: stream-unix.c:nl_attr_next Unexecuted instantiation: dpif-netlink.c:nl_attr_next Unexecuted instantiation: dpif-netlink-rtnl.c:nl_attr_next Unexecuted instantiation: netlink-conntrack.c:nl_attr_next Unexecuted instantiation: netlink-notifier.c:nl_attr_next Unexecuted instantiation: stream-ssl.c:nl_attr_next Unexecuted instantiation: conntrack.c:nl_attr_next Unexecuted instantiation: ct-dpif.c:nl_attr_next Unexecuted instantiation: dpctl.c:nl_attr_next Unexecuted instantiation: dpif-netdev.c:nl_attr_next Unexecuted instantiation: dpif-netdev-private-dfc.c:nl_attr_next Unexecuted instantiation: dpif-netdev-private-dpif.c:nl_attr_next Unexecuted instantiation: dpif-netdev-private-extract.c:nl_attr_next Unexecuted instantiation: ipf.c:nl_attr_next Unexecuted instantiation: stream-tcp.c:nl_attr_next Unexecuted instantiation: conntrack-icmp.c:nl_attr_next Unexecuted instantiation: conntrack-tcp.c:nl_attr_next Unexecuted instantiation: conntrack-tp.c:nl_attr_next Unexecuted instantiation: conntrack-other.c:nl_attr_next Unexecuted instantiation: dpif-netdev-extract-study.c:nl_attr_next Unexecuted instantiation: dpif-netdev-lookup.c:nl_attr_next Unexecuted instantiation: dpif-netdev-lookup-autovalidator.c:nl_attr_next Unexecuted instantiation: dpif-netdev-lookup-generic.c:nl_attr_next |
166 | | |
167 | | static inline bool |
168 | | nl_attr_is_valid(const struct nlattr *nla, size_t maxlen) |
169 | 0 | { |
170 | 0 | return (maxlen >= sizeof *nla |
171 | 0 | && nla->nla_len >= sizeof *nla |
172 | 0 | && nla->nla_len <= maxlen); |
173 | 0 | } Unexecuted instantiation: ofp_print_target.c:nl_attr_is_valid Unexecuted instantiation: ofp-print.c:nl_attr_is_valid Unexecuted instantiation: ofp-queue.c:nl_attr_is_valid Unexecuted instantiation: ofp-table.c:nl_attr_is_valid Unexecuted instantiation: ofp-util.c:nl_attr_is_valid Unexecuted instantiation: dp-packet.c:nl_attr_is_valid Unexecuted instantiation: flow.c:nl_attr_is_valid Unexecuted instantiation: match.c:nl_attr_is_valid Unexecuted instantiation: meta-flow.c:nl_attr_is_valid Unexecuted instantiation: netdev.c:nl_attr_is_valid Unexecuted instantiation: nx-match.c:nl_attr_is_valid Unexecuted instantiation: ofp-actions.c:nl_attr_is_valid Unexecuted instantiation: ofp-ct.c:nl_attr_is_valid Unexecuted instantiation: ofp-ed-props.c:nl_attr_is_valid Unexecuted instantiation: ofp-flow.c:nl_attr_is_valid Unexecuted instantiation: ofp-group.c:nl_attr_is_valid Unexecuted instantiation: ofp-match.c:nl_attr_is_valid Unexecuted instantiation: ofp-meter.c:nl_attr_is_valid Unexecuted instantiation: ofp-monitor.c:nl_attr_is_valid Unexecuted instantiation: ofp-packet.c:nl_attr_is_valid Unexecuted instantiation: ofp-parse.c:nl_attr_is_valid Unexecuted instantiation: ofp-port.c:nl_attr_is_valid Unexecuted instantiation: ovs-router.c:nl_attr_is_valid Unexecuted instantiation: packets.c:nl_attr_is_valid Unexecuted instantiation: smap.c:nl_attr_is_valid Unexecuted instantiation: socket-util.c:nl_attr_is_valid Unexecuted instantiation: tnl-ports.c:nl_attr_is_valid Unexecuted instantiation: tun-metadata.c:nl_attr_is_valid Unexecuted instantiation: netdev-linux.c:nl_attr_is_valid Unexecuted instantiation: netdev-offload-tc.c:nl_attr_is_valid Unexecuted instantiation: netlink-socket.c:nl_attr_is_valid Unexecuted instantiation: rtnetlink.c:nl_attr_is_valid Unexecuted instantiation: route-table.c:nl_attr_is_valid Unexecuted instantiation: tc.c:nl_attr_is_valid Unexecuted instantiation: bundle.c:nl_attr_is_valid Unexecuted instantiation: classifier.c:nl_attr_is_valid Unexecuted instantiation: dp-packet-gso.c:nl_attr_is_valid Unexecuted instantiation: dpif.c:nl_attr_is_valid Unexecuted instantiation: learn.c:nl_attr_is_valid Unexecuted instantiation: multipath.c:nl_attr_is_valid Unexecuted instantiation: netdev-offload.c:nl_attr_is_valid Unexecuted instantiation: netdev-vport.c:nl_attr_is_valid Unexecuted instantiation: netlink.c:nl_attr_is_valid Unexecuted instantiation: odp-execute.c:nl_attr_is_valid Unexecuted instantiation: odp-execute-private.c:nl_attr_is_valid Unexecuted instantiation: odp-util.c:nl_attr_is_valid Unexecuted instantiation: stream.c:nl_attr_is_valid Unexecuted instantiation: tnl-neigh-cache.c:nl_attr_is_valid Unexecuted instantiation: netdev-native-tnl.c:nl_attr_is_valid Unexecuted instantiation: stream-unix.c:nl_attr_is_valid Unexecuted instantiation: dpif-netlink.c:nl_attr_is_valid Unexecuted instantiation: dpif-netlink-rtnl.c:nl_attr_is_valid Unexecuted instantiation: netlink-conntrack.c:nl_attr_is_valid Unexecuted instantiation: netlink-notifier.c:nl_attr_is_valid Unexecuted instantiation: stream-ssl.c:nl_attr_is_valid Unexecuted instantiation: conntrack.c:nl_attr_is_valid Unexecuted instantiation: ct-dpif.c:nl_attr_is_valid Unexecuted instantiation: dpctl.c:nl_attr_is_valid Unexecuted instantiation: dpif-netdev.c:nl_attr_is_valid Unexecuted instantiation: dpif-netdev-private-dfc.c:nl_attr_is_valid Unexecuted instantiation: dpif-netdev-private-dpif.c:nl_attr_is_valid Unexecuted instantiation: dpif-netdev-private-extract.c:nl_attr_is_valid Unexecuted instantiation: ipf.c:nl_attr_is_valid Unexecuted instantiation: stream-tcp.c:nl_attr_is_valid Unexecuted instantiation: conntrack-icmp.c:nl_attr_is_valid Unexecuted instantiation: conntrack-tcp.c:nl_attr_is_valid Unexecuted instantiation: conntrack-tp.c:nl_attr_is_valid Unexecuted instantiation: conntrack-other.c:nl_attr_is_valid Unexecuted instantiation: dpif-netdev-extract-study.c:nl_attr_is_valid Unexecuted instantiation: dpif-netdev-lookup.c:nl_attr_is_valid Unexecuted instantiation: dpif-netdev-lookup-autovalidator.c:nl_attr_is_valid Unexecuted instantiation: dpif-netdev-lookup-generic.c:nl_attr_is_valid |
174 | | |
175 | | static inline size_t |
176 | | nl_attr_len_pad(const struct nlattr *nla, size_t maxlen) |
177 | 0 | { |
178 | 0 | size_t len = NLA_ALIGN(nla->nla_len); |
179 | |
|
180 | 0 | return len <= maxlen ? len : nla->nla_len; |
181 | 0 | } Unexecuted instantiation: ofp_print_target.c:nl_attr_len_pad Unexecuted instantiation: ofp-print.c:nl_attr_len_pad Unexecuted instantiation: ofp-queue.c:nl_attr_len_pad Unexecuted instantiation: ofp-table.c:nl_attr_len_pad Unexecuted instantiation: ofp-util.c:nl_attr_len_pad Unexecuted instantiation: dp-packet.c:nl_attr_len_pad Unexecuted instantiation: flow.c:nl_attr_len_pad Unexecuted instantiation: match.c:nl_attr_len_pad Unexecuted instantiation: meta-flow.c:nl_attr_len_pad Unexecuted instantiation: netdev.c:nl_attr_len_pad Unexecuted instantiation: nx-match.c:nl_attr_len_pad Unexecuted instantiation: ofp-actions.c:nl_attr_len_pad Unexecuted instantiation: ofp-ct.c:nl_attr_len_pad Unexecuted instantiation: ofp-ed-props.c:nl_attr_len_pad Unexecuted instantiation: ofp-flow.c:nl_attr_len_pad Unexecuted instantiation: ofp-group.c:nl_attr_len_pad Unexecuted instantiation: ofp-match.c:nl_attr_len_pad Unexecuted instantiation: ofp-meter.c:nl_attr_len_pad Unexecuted instantiation: ofp-monitor.c:nl_attr_len_pad Unexecuted instantiation: ofp-packet.c:nl_attr_len_pad Unexecuted instantiation: ofp-parse.c:nl_attr_len_pad Unexecuted instantiation: ofp-port.c:nl_attr_len_pad Unexecuted instantiation: ovs-router.c:nl_attr_len_pad Unexecuted instantiation: packets.c:nl_attr_len_pad Unexecuted instantiation: smap.c:nl_attr_len_pad Unexecuted instantiation: socket-util.c:nl_attr_len_pad Unexecuted instantiation: tnl-ports.c:nl_attr_len_pad Unexecuted instantiation: tun-metadata.c:nl_attr_len_pad Unexecuted instantiation: netdev-linux.c:nl_attr_len_pad Unexecuted instantiation: netdev-offload-tc.c:nl_attr_len_pad Unexecuted instantiation: netlink-socket.c:nl_attr_len_pad Unexecuted instantiation: rtnetlink.c:nl_attr_len_pad Unexecuted instantiation: route-table.c:nl_attr_len_pad Unexecuted instantiation: tc.c:nl_attr_len_pad Unexecuted instantiation: bundle.c:nl_attr_len_pad Unexecuted instantiation: classifier.c:nl_attr_len_pad Unexecuted instantiation: dp-packet-gso.c:nl_attr_len_pad Unexecuted instantiation: dpif.c:nl_attr_len_pad Unexecuted instantiation: learn.c:nl_attr_len_pad Unexecuted instantiation: multipath.c:nl_attr_len_pad Unexecuted instantiation: netdev-offload.c:nl_attr_len_pad Unexecuted instantiation: netdev-vport.c:nl_attr_len_pad Unexecuted instantiation: netlink.c:nl_attr_len_pad Unexecuted instantiation: odp-execute.c:nl_attr_len_pad Unexecuted instantiation: odp-execute-private.c:nl_attr_len_pad Unexecuted instantiation: odp-util.c:nl_attr_len_pad Unexecuted instantiation: stream.c:nl_attr_len_pad Unexecuted instantiation: tnl-neigh-cache.c:nl_attr_len_pad Unexecuted instantiation: netdev-native-tnl.c:nl_attr_len_pad Unexecuted instantiation: stream-unix.c:nl_attr_len_pad Unexecuted instantiation: dpif-netlink.c:nl_attr_len_pad Unexecuted instantiation: dpif-netlink-rtnl.c:nl_attr_len_pad Unexecuted instantiation: netlink-conntrack.c:nl_attr_len_pad Unexecuted instantiation: netlink-notifier.c:nl_attr_len_pad Unexecuted instantiation: stream-ssl.c:nl_attr_len_pad Unexecuted instantiation: conntrack.c:nl_attr_len_pad Unexecuted instantiation: ct-dpif.c:nl_attr_len_pad Unexecuted instantiation: dpctl.c:nl_attr_len_pad Unexecuted instantiation: dpif-netdev.c:nl_attr_len_pad Unexecuted instantiation: dpif-netdev-private-dfc.c:nl_attr_len_pad Unexecuted instantiation: dpif-netdev-private-dpif.c:nl_attr_len_pad Unexecuted instantiation: dpif-netdev-private-extract.c:nl_attr_len_pad Unexecuted instantiation: ipf.c:nl_attr_len_pad Unexecuted instantiation: stream-tcp.c:nl_attr_len_pad Unexecuted instantiation: conntrack-icmp.c:nl_attr_len_pad Unexecuted instantiation: conntrack-tcp.c:nl_attr_len_pad Unexecuted instantiation: conntrack-tp.c:nl_attr_len_pad Unexecuted instantiation: conntrack-other.c:nl_attr_len_pad Unexecuted instantiation: dpif-netdev-extract-study.c:nl_attr_len_pad Unexecuted instantiation: dpif-netdev-lookup.c:nl_attr_len_pad Unexecuted instantiation: dpif-netdev-lookup-autovalidator.c:nl_attr_len_pad Unexecuted instantiation: dpif-netdev-lookup-generic.c:nl_attr_len_pad |
182 | | |
183 | | /* This macro is careful to check for attributes with bad lengths. */ |
184 | | #define NL_ATTR_FOR_EACH(ITER, LEFT, ATTRS, ATTRS_LEN) \ |
185 | 0 | for ((ITER) = (ATTRS), (LEFT) = (ATTRS_LEN); \ |
186 | 0 | nl_attr_is_valid(ITER, LEFT); \ |
187 | 0 | (LEFT) -= nl_attr_len_pad(ITER, LEFT), (ITER) = nl_attr_next(ITER)) |
188 | | |
189 | | |
190 | | /* This macro does not check for attributes with bad lengths. It should only |
191 | | * be used with messages from trusted sources or with messages that have |
192 | | * already been validated (e.g. with NL_ATTR_FOR_EACH). */ |
193 | | #define NL_ATTR_FOR_EACH_UNSAFE(ITER, LEFT, ATTRS, ATTRS_LEN) \ |
194 | 0 | for ((ITER) = (ATTRS), (LEFT) = (ATTRS_LEN); \ |
195 | 0 | (LEFT) > 0; \ |
196 | 0 | (LEFT) -= nl_attr_len_pad(ITER, LEFT), (ITER) = nl_attr_next(ITER)) |
197 | | |
198 | | /* These variants are convenient for iterating nested attributes. */ |
199 | | #define NL_NESTED_FOR_EACH(ITER, LEFT, A) \ |
200 | 0 | NL_ATTR_FOR_EACH(ITER, LEFT, nl_attr_get(A), nl_attr_get_size(A)) |
201 | | #define NL_NESTED_FOR_EACH_UNSAFE(ITER, LEFT, A) \ |
202 | 0 | NL_ATTR_FOR_EACH_UNSAFE(ITER, LEFT, nl_attr_get(A), nl_attr_get_size(A)) |
203 | | |
204 | | /* Netlink attribute parsing. */ |
205 | | int nl_attr_type(const struct nlattr *); |
206 | | const void *nl_attr_get(const struct nlattr *); |
207 | | size_t nl_attr_get_size(const struct nlattr *); |
208 | | const void *nl_attr_get_unspec(const struct nlattr *, size_t size); |
209 | | bool nl_attr_get_flag(const struct nlattr *); |
210 | | uint8_t nl_attr_get_u8(const struct nlattr *); |
211 | | uint16_t nl_attr_get_u16(const struct nlattr *); |
212 | | uint32_t nl_attr_get_u32(const struct nlattr *); |
213 | | uint64_t nl_attr_get_u64(const struct nlattr *); |
214 | | ovs_u128 nl_attr_get_u128(const struct nlattr *); |
215 | | ovs_be16 nl_attr_get_be16(const struct nlattr *); |
216 | | ovs_be32 nl_attr_get_be32(const struct nlattr *); |
217 | | ovs_be64 nl_attr_get_be64(const struct nlattr *); |
218 | | ovs_be128 nl_attr_get_be128(const struct nlattr *); |
219 | | struct in6_addr nl_attr_get_in6_addr(const struct nlattr *nla); |
220 | | odp_port_t nl_attr_get_odp_port(const struct nlattr *); |
221 | | const char *nl_attr_get_string(const struct nlattr *); |
222 | | void nl_attr_get_nested(const struct nlattr *, struct ofpbuf *); |
223 | | struct eth_addr nl_attr_get_eth_addr(const struct nlattr *nla); |
224 | | struct ib_addr nl_attr_get_ib_addr(const struct nlattr *nla); |
225 | | |
226 | | /* Netlink attribute policy. |
227 | | * |
228 | | * Specifies how to parse a single attribute from a Netlink message payload. |
229 | | */ |
230 | | struct nl_policy |
231 | | { |
232 | | enum nl_attr_type type; |
233 | | size_t min_len, max_len; |
234 | | bool optional; |
235 | | }; |
236 | | |
237 | | #define NL_POLICY_FOR(TYPE) \ |
238 | 0 | .type = NL_A_UNSPEC, .min_len = sizeof(TYPE), .max_len = sizeof(TYPE) |
239 | | |
240 | | bool nl_attr_validate(const struct nlattr *, const struct nl_policy *); |
241 | | |
242 | | bool nl_policy_parse(const struct ofpbuf *, size_t offset, |
243 | | const struct nl_policy[], |
244 | | struct nlattr *[], size_t n_attrs); |
245 | | bool nl_parse_nested(const struct nlattr *, const struct nl_policy[], |
246 | | struct nlattr *[], size_t n_attrs); |
247 | | |
248 | | const struct nlattr *nl_attr_find(const struct ofpbuf *, size_t hdr_len, |
249 | | uint16_t type); |
250 | | const struct nlattr *nl_attr_find_nested(const struct nlattr *, uint16_t type); |
251 | | const struct nlattr *nl_attr_find__(const struct nlattr *attrs, size_t size, |
252 | | uint16_t type); |
253 | | |
254 | | #endif /* netlink.h */ |