int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback) { _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL; int r; assert(link); assert(link->manager); assert(link->manager->rtnl); assert(link->ifindex > 0); assert(route->family == AF_INET || route->family == AF_INET6); r = sd_rtnl_message_new_route(link->manager->rtnl, RTM_NEWROUTE, route->family, &req); if (r < 0) { log_error("Could not create RTM_NEWROUTE message: %s", strerror(-r)); return r; } if (route->family == AF_INET) r = sd_rtnl_message_append_in_addr(req, RTA_GATEWAY, &route->in_addr.in); else if (route->family == AF_INET6) r = sd_rtnl_message_append_in6_addr(req, RTA_GATEWAY, &route->in_addr.in6); if (r < 0) { log_error("Could not append RTA_GATEWAY attribute: %s", strerror(-r)); return r; } if (route->dst_prefixlen) { if (route->family == AF_INET) r = sd_rtnl_message_append_in_addr(req, RTA_DST, &route->dst_addr.in); else if (route->family == AF_INET6) r = sd_rtnl_message_append_in6_addr(req, RTA_DST, &route->dst_addr.in6); if (r < 0) { log_error("Could not append RTA_DST attribute: %s", strerror(-r)); return r; } r = sd_rtnl_message_route_set_dst_prefixlen(req, route->dst_prefixlen); if (r < 0) { log_error("Could not set destination prefix length: %s", strerror(-r)); return r; } } r = sd_rtnl_message_append_u32(req, RTA_OIF, link->ifindex); if (r < 0) { log_error("Could not append RTA_OIF attribute: %s", strerror(-r)); return r; } r = sd_rtnl_call_async(link->manager->rtnl, req, callback, link, 0, NULL); if (r < 0) { log_error("Could not send rtnetlink message: %s", strerror(-r)); return r; } return 0; }
static int netdev_ip6gre_fill_message_create(NetDev *netdev, Link *link, sd_rtnl_message *m) { Tunnel *t; int r; assert(netdev); if (netdev->kind == NETDEV_KIND_IP6GRE) t = IP6GRE(netdev); else t = IP6GRETAP(netdev); assert(t); assert(t->family == AF_INET6); assert(link); assert(m); r = sd_rtnl_message_append_u32(m, IFLA_GRE_LINK, link->ifindex); if (r < 0) { log_netdev_error(netdev, "Could not append IFLA_GRE_LINK attribute: %s", strerror(-r)); return r; } r = sd_rtnl_message_append_in6_addr(m, IFLA_GRE_LOCAL, &t->local.in6); if (r < 0) { log_netdev_error(netdev, "Could not append IFLA_GRE_LOCAL attribute: %s", strerror(-r)); return r; } r = sd_rtnl_message_append_in6_addr(m, IFLA_GRE_REMOTE, &t->remote.in6); if (r < 0) { log_netdev_error(netdev, "Could not append IFLA_GRE_REMOTE attribute: %s", strerror(-r)); return r; } r = sd_rtnl_message_append_u8(m, IFLA_GRE_TTL, t->ttl); if (r < 0) { log_netdev_error(netdev, "Could not append IFLA_GRE_TTL attribute: %s", strerror(-r)); return r; } return r; }
int address_update(Address *address, Link *link, sd_rtnl_message_handler_t callback) { _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL; int r; assert(address); assert(address->family == AF_INET || address->family == AF_INET6); assert(link->ifindex > 0); assert(link->manager); assert(link->manager->rtnl); r = sd_rtnl_message_new_addr_update(link->manager->rtnl, &req, link->ifindex, address->family); if (r < 0) return log_error_errno(r, "Could not allocate RTM_NEWADDR message: %m"); r = sd_rtnl_message_addr_set_prefixlen(req, address->prefixlen); if (r < 0) return log_error_errno(r, "Could not set prefixlen: %m"); r = sd_rtnl_message_addr_set_flags(req, IFA_F_PERMANENT); if (r < 0) return log_error_errno(r, "Could not set flags: %m"); r = sd_rtnl_message_addr_set_scope(req, address->scope); if (r < 0) return log_error_errno(r, "Could not set scope: %m"); if (address->family == AF_INET) r = sd_rtnl_message_append_in_addr(req, IFA_LOCAL, &address->in_addr.in); else if (address->family == AF_INET6) r = sd_rtnl_message_append_in6_addr(req, IFA_LOCAL, &address->in_addr.in6); if (r < 0) return log_error_errno(r, "Could not append IFA_LOCAL attribute: %m"); if (address->family == AF_INET) { r = sd_rtnl_message_append_in_addr(req, IFA_BROADCAST, &address->broadcast); if (r < 0) return log_error_errno(r, "Could not append IFA_BROADCAST attribute: %m"); } if (address->label) { r = sd_rtnl_message_append_string(req, IFA_LABEL, address->label); if (r < 0) return log_error_errno(r, "Could not append IFA_LABEL attribute: %m"); } r = sd_rtnl_message_append_cache_info(req, IFA_CACHEINFO, &address->cinfo); if (r < 0) return log_error_errno(r, "Could not append IFA_CACHEINFO attribute: %m"); r = sd_rtnl_call_async(link->manager->rtnl, req, callback, link, 0, NULL); if (r < 0) return log_error_errno(r, "Could not send rtnetlink message: %m"); link_ref(link); return 0; }
int address_drop(Address *address, Link *link, sd_rtnl_message_handler_t callback) { _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL; int r; assert(address); assert(address->family == AF_INET || address->family == AF_INET6); assert(link); assert(link->ifindex > 0); assert(link->manager); assert(link->manager->rtnl); r = sd_rtnl_message_new_addr(link->manager->rtnl, &req, RTM_DELADDR, link->ifindex, address->family); if (r < 0) { log_error("Could not allocate RTM_DELADDR message: %s", strerror(-r)); return r; } r = sd_rtnl_message_addr_set_prefixlen(req, address->prefixlen); if (r < 0) { log_error("Could not set prefixlen: %s", strerror(-r)); return r; } if (address->family == AF_INET) r = sd_rtnl_message_append_in_addr(req, IFA_LOCAL, &address->in_addr.in); else if (address->family == AF_INET6) r = sd_rtnl_message_append_in6_addr(req, IFA_LOCAL, &address->in_addr.in6); if (r < 0) { log_error("Could not append IFA_LOCAL attribute: %s", strerror(-r)); return r; } r = sd_rtnl_call_async(link->manager->rtnl, req, callback, link, 0, NULL); if (r < 0) { log_error("Could not send rtnetlink message: %s", strerror(-r)); return r; } return 0; }
int address_configure(Address *address, Link *link, sd_rtnl_message_handler_t callback) { _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL; int r; assert(address); assert(address->family == AF_INET || address->family == AF_INET6); assert(link); assert(link->ifindex > 0); assert(link->manager); assert(link->manager->rtnl); r = sd_rtnl_message_new_addr(RTM_NEWADDR, link->ifindex, address->family, &req); if (r < 0) { log_error("Could not allocate RTM_NEWADDR message: %s", strerror(-r)); return r; } r = sd_rtnl_message_addr_set_prefixlen(req, address->prefixlen); if (r < 0) { log_error("Could not set prefixlen: %s", strerror(-r)); return r; } r = sd_rtnl_message_addr_set_flags(req, IFA_F_PERMANENT); if (r < 0) { log_error("Could not set flags: %s", strerror(-r)); return r; } r = sd_rtnl_message_addr_set_scope(req, RT_SCOPE_UNIVERSE); if (r < 0) { log_error("Could not set scope: %s", strerror(-r)); return r; } if (address->family == AF_INET) r = sd_rtnl_message_append_in_addr(req, IFA_LOCAL, &address->in_addr.in); else if (address->family == AF_INET6) r = sd_rtnl_message_append_in6_addr(req, IFA_LOCAL, &address->in_addr.in6); if (r < 0) { log_error("Could not append IFA_LOCAL attribute: %s", strerror(-r)); return r; } if (address->family == AF_INET) { r = sd_rtnl_message_append_in_addr(req, IFA_BROADCAST, &address->broadcast); if (r < 0) { log_error("Could not append IFA_BROADCAST attribute: %s", strerror(-r)); return r; } } if (address->label) { r = sd_rtnl_message_append_string(req, IFA_LABEL, address->label); if (r < 0) { log_error("Could not append IFA_LABEL attribute: %s", strerror(-r)); return r; } } r = sd_rtnl_call_async(link->manager->rtnl, req, callback, link, 0, NULL); if (r < 0) { log_error("Could not send rtnetlink message: %s", strerror(-r)); return r; } return 0; }
static int netdev_ip6tnl_fill_message_create(NetDev *netdev, Link *link, sd_rtnl_message *m) { Tunnel *t = IP6TNL(netdev); uint8_t proto; int r; assert(netdev); assert(link); assert(m); assert(t); assert(t->family == AF_INET6); r = sd_rtnl_message_append_u32(m, IFLA_IPTUN_LINK, link->ifindex); if (r < 0) { log_netdev_error(netdev, "Could not append IFLA_IPTUN_LINK attribute: %s", strerror(-r)); return r; } r = sd_rtnl_message_append_in6_addr(m, IFLA_IPTUN_LOCAL, &t->local.in6); if (r < 0) { log_netdev_error(netdev, "Could not append IFLA_IPTUN_LOCAL attribute: %s", strerror(-r)); return r; } r = sd_rtnl_message_append_in6_addr(m, IFLA_IPTUN_REMOTE, &t->remote.in6); if (r < 0) { log_netdev_error(netdev, "Could not append IFLA_IPTUN_REMOTE attribute: %s", strerror(-r)); return r; } r = sd_rtnl_message_append_u8(m, IFLA_IPTUN_TTL, t->ttl); if (r < 0) { log_netdev_error(netdev, "Could not append IFLA_IPTUN_TTL attribute: %s", strerror(-r)); return r; } switch (t->ip6tnl_mode) { case NETDEV_IP6_TNL_MODE_IP6IP6: proto = IPPROTO_IPV6; break; case NETDEV_IP6_TNL_MODE_IPIP6: proto = IPPROTO_IPIP; break; case NETDEV_IP6_TNL_MODE_ANYIP6: default: proto = 0; break; } r = sd_rtnl_message_append_u8(m, IFLA_IPTUN_PROTO, proto); if (r < 0) { log_netdev_error(netdev, "Could not append IFLA_IPTUN_MODE attribute: %s", strerror(-r)); return r; } return r; }