@@ -24,6 +24,7 @@ static const char *const set_link_operation_table[_SET_LINK_OPERATION_MAX] = {
2424 [SET_LINK_CAN ] = "CAN interface configurations" ,
2525 [SET_LINK_FLAGS ] = "link flags" ,
2626 [SET_LINK_GROUP ] = "interface group" ,
27+ [SET_LINK_IPOIB ] = "IPoIB configurations" ,
2728 [SET_LINK_MAC ] = "MAC address" ,
2829 [SET_LINK_MASTER ] = "master interface" ,
2930 [SET_LINK_MTU ] = "MTU" ,
@@ -153,6 +154,10 @@ static int link_set_group_handler(sd_netlink *rtnl, sd_netlink_message *m, Link
153154 return set_link_handler_internal (rtnl , m , link , SET_LINK_GROUP , /* ignore = */ false, NULL );
154155}
155156
157+ static int link_set_ipoib_handler (sd_netlink * rtnl , sd_netlink_message * m , Link * link ) {
158+ return set_link_handler_internal (rtnl , m , link , SET_LINK_IPOIB , /* ignore = */ true, NULL );
159+ }
160+
156161static int link_set_mac_handler (sd_netlink * rtnl , sd_netlink_message * m , Link * link ) {
157162 return set_link_handler_internal (rtnl , m , link , SET_LINK_MAC , /* ignore = */ true, get_link_default_handler );
158163}
@@ -236,7 +241,7 @@ static int link_configure(
236241 r = sd_rtnl_message_new_link (link -> manager -> rtnl , & req , RTM_NEWLINK , link -> master_ifindex );
237242 if (r < 0 )
238243 return log_link_debug_errno (link , r , "Could not allocate RTM_NEWLINK message: %m" );
239- } else if (op == SET_LINK_CAN ) {
244+ } else if (IN_SET ( op , SET_LINK_CAN , SET_LINK_IPOIB ) ) {
240245 r = sd_rtnl_message_new_link (link -> manager -> rtnl , & req , RTM_NEWLINK , link -> ifindex );
241246 if (r < 0 )
242247 return log_link_debug_errno (link , r , "Could not allocate RTM_NEWLINK message: %m" );
@@ -468,6 +473,11 @@ static int link_configure(
468473 if (r < 0 )
469474 return log_link_debug_errno (link , r , "Could not append IFLA_ADDRESS attribute: %m" );
470475 break ;
476+ case SET_LINK_IPOIB :
477+ r = ipoib_set_netlink_message (link , req );
478+ if (r < 0 )
479+ return r ;
480+ break ;
471481 case SET_LINK_MASTER :
472482 r = sd_netlink_message_append_u32 (req , IFLA_MASTER , PTR_TO_UINT32 (userdata ));
473483 if (r < 0 )
@@ -800,6 +810,20 @@ int link_request_to_set_mac(Link *link, bool allow_retry) {
800810 NULL );
801811}
802812
813+ int link_request_to_set_ipoib (Link * link ) {
814+ assert (link );
815+ assert (link -> network );
816+
817+ if (link -> iftype != ARPHRD_INFINIBAND )
818+ return 0 ;
819+
820+ if (link -> network -> ipoib_mode < 0 &&
821+ link -> network -> ipoib_umcast < 0 )
822+ return 0 ;
823+
824+ return link_request_set_link (link , SET_LINK_IPOIB , link_set_ipoib_handler , NULL );
825+ }
826+
803827int link_request_to_set_master (Link * link ) {
804828 assert (link );
805829 assert (link -> network );
0 commit comments