1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
3 #include <linux/if_arp.h>
4 #include <linux/if_link.h>
7 #include "networkd-network.h"
8 #include "parse-util.h"
9 #include "string-table.h"
11 assert_cc((int) IP_OVER_INFINIBAND_MODE_DATAGRAM
== (int) IPOIB_MODE_DATAGRAM
);
12 assert_cc((int) IP_OVER_INFINIBAND_MODE_CONNECTED
== (int) IPOIB_MODE_CONNECTED
);
14 static void netdev_ipoib_init(NetDev
*netdev
) {
19 ipoib
= IPOIB(netdev
);
23 ipoib
->mode
= _IP_OVER_INFINIBAND_MODE_INVALID
;
27 static int netdev_ipoib_fill_message_create(NetDev
*netdev
, Link
*link
, sd_netlink_message
*m
) {
35 ipoib
= IPOIB(netdev
);
39 if (ipoib
->pkey
> 0) {
40 r
= sd_netlink_message_append_u16(m
, IFLA_IPOIB_PKEY
, ipoib
->pkey
);
45 if (ipoib
->mode
>= 0) {
46 r
= sd_netlink_message_append_u16(m
, IFLA_IPOIB_MODE
, ipoib
->mode
);
51 if (ipoib
->umcast
>= 0) {
52 r
= sd_netlink_message_append_u16(m
, IFLA_IPOIB_UMCAST
, ipoib
->umcast
);
60 int ipoib_set_netlink_message(Link
*link
, sd_netlink_message
*m
) {
64 assert(link
->network
);
67 r
= sd_netlink_message_set_flags(m
, NLM_F_REQUEST
| NLM_F_ACK
);
71 r
= sd_netlink_message_open_container(m
, IFLA_LINKINFO
);
75 r
= sd_netlink_message_open_container_union(m
, IFLA_INFO_DATA
, link
->kind
);
79 if (link
->network
->ipoib_mode
>= 0) {
80 r
= sd_netlink_message_append_u16(m
, IFLA_IPOIB_MODE
, link
->network
->ipoib_mode
);
85 if (link
->network
->ipoib_umcast
>= 0) {
86 r
= sd_netlink_message_append_u16(m
, IFLA_IPOIB_UMCAST
, link
->network
->ipoib_umcast
);
91 r
= sd_netlink_message_close_container(m
);
95 r
= sd_netlink_message_close_container(m
);
102 static const char * const ipoib_mode_table
[_IP_OVER_INFINIBAND_MODE_MAX
] = {
103 [IP_OVER_INFINIBAND_MODE_DATAGRAM
] = "datagram",
104 [IP_OVER_INFINIBAND_MODE_CONNECTED
] = "connected",
107 DEFINE_PRIVATE_STRING_TABLE_LOOKUP_FROM_STRING(ipoib_mode
, IPoIBMode
);
108 DEFINE_CONFIG_PARSE_ENUM(config_parse_ipoib_mode
, ipoib_mode
, IPoIBMode
, "Failed to parse IPoIB mode");
110 int config_parse_ipoib_pkey(
112 const char *filename
,
115 unsigned section_line
,
122 uint16_t u
, *pkey
= ASSERT_PTR(data
);
129 if (isempty(rvalue
)) {
130 *pkey
= 0; /* 0 means unset. */
134 r
= safe_atou16(rvalue
, &u
);
136 log_syntax(unit
, LOG_WARNING
, filename
, line
, r
,
137 "Failed to parse IPoIB pkey '%s', ignoring assignment: %m",
141 if (IN_SET(u
, 0, 0x8000)) {
142 log_syntax(unit
, LOG_WARNING
, filename
, line
, 0,
143 "IPoIB pkey cannot be 0 nor 0x8000, ignoring assignment: %s",
153 const NetDevVTable ipoib_vtable
= {
154 .object_size
= sizeof(IPoIB
),
155 .sections
= NETDEV_COMMON_SECTIONS
"IPoIB\0",
156 .init
= netdev_ipoib_init
,
157 .fill_message_create
= netdev_ipoib_fill_message_create
,
158 .create_type
= NETDEV_CREATE_STACKED
,
159 .iftype
= ARPHRD_INFINIBAND
,
160 .generate_mac
= true,