Skip to content

Commit

Permalink
Merge following fixes from 'master' into sle15-sp4
Browse files Browse the repository at this point in the history
- ifreload: VLAN changes require device deletion (bsc#1218927)
- ifcheck: fix config changed check (bsc#1218926)
- client: fix exit code for no-carrier status (bsc#1219265)
- dhcp6: omit the SO_REUSEPORT option (bsc#1215692)
- duid: fix comment for v6time
- rtnl: fix peer address parsing for non ptp-interfaces
- system-updater: Parse updater format from XML configuration to
  ensure install calls can run.
  • Loading branch information
cfconrad committed Feb 1, 2024
2 parents 286008b + 820f237 commit 8e98099
Show file tree
Hide file tree
Showing 11 changed files with 70 additions and 52 deletions.
23 changes: 12 additions & 11 deletions client/ifcheck.c
Expand Up @@ -305,6 +305,18 @@ ni_do_ifcheck(int argc, char **argv)
goto usage;
}

if (!ni_fsm_create_client(fsm)) {
/* Severe error we always explicitly return */
status = NI_WICKED_RC_ERROR;
goto cleanup;
}

if (!ni_fsm_refresh_state(fsm)) {
/* Severe error we always explicitly return */
status = NI_WICKED_RC_ERROR;
goto cleanup;
}

if (opt_ifconfig.count == 0) {
const ni_string_array_t *sources = ni_config_sources("ifconfig");

Expand All @@ -323,17 +335,6 @@ ni_do_ifcheck(int argc, char **argv)
goto cleanup;
}

if (!ni_fsm_create_client(fsm)) {
/* Severe error we always explicitly return */
status = NI_WICKED_RC_ERROR;
goto cleanup;
}

if (!ni_fsm_refresh_state(fsm)) {
/* Severe error we always explicitly return */
status = NI_WICKED_RC_ERROR;
goto cleanup;
}

status = NI_WICKED_ST_OK;

Expand Down
6 changes: 4 additions & 2 deletions client/ifreload.c
Expand Up @@ -109,8 +109,10 @@ ifreload_mark_down(const ni_fsm_t *fsm, ni_ifworker_array_t *marked, ni_ifworker
w->target_range.max = NI_FSM_STATE_DEVICE_READY;

/* the config has been modified, but some changes require deletion */
if (w->iftype == NI_IFTYPE_TEAM) {
/* e.g. the team runner (mode) changes require teamd restart */
if (w->iftype == NI_IFTYPE_TEAM || w->iftype == NI_IFTYPE_VLAN) {
/* examples:
* - the team runner (mode) changes require teamd restart
* - VlanID changed, the interface need to be recreated */
w->target_range.max = NI_FSM_STATE_DEVICE_DOWN;
} else
if (w->iftype != NI_IFTYPE_UNKNOWN) {
Expand Down
2 changes: 2 additions & 0 deletions client/ifstatus.c
Expand Up @@ -884,6 +884,7 @@ ni_do_ifstatus(int argc, char **argv)
case NI_WICKED_ST_UNCONFIGURED:
case NI_WICKED_ST_NOT_RUNNING:
case NI_WICKED_ST_IN_PROGRESS:
case NI_WICKED_ST_NO_CARRIER:
break;
default:
status = NI_WICKED_ST_OK;
Expand Down Expand Up @@ -1000,6 +1001,7 @@ ni_ifstatus_display_result(ni_fsm_t *fsm, ni_string_array_t *names, ni_ifworker_
case NI_WICKED_ST_UNCONFIGURED:
case NI_WICKED_ST_NOT_RUNNING:
case NI_WICKED_ST_IN_PROGRESS:
case NI_WICKED_ST_NO_CARRIER:
break;
default:
status = NI_WICKED_ST_OK;
Expand Down
3 changes: 3 additions & 0 deletions client/suse/scripts/ifup.in
Expand Up @@ -226,6 +226,9 @@ rc_map_status()
166) # NI_WICKED_ST_PERSISTENT_ON
return $R_NOTALLOWED
;;
168) # NI_WICKED_ST_NO_CARRIER
return $R_DHCP_BG
;;
*) # any other
return ${1:-1}
;;
Expand Down
12 changes: 12 additions & 0 deletions src/appconfig.c
Expand Up @@ -2040,6 +2040,7 @@ ni_config_parse_system_updater(ni_extension_t **list, xml_node_t *node)
{
ni_extension_t *ex, *old;
const char *name;
const char *format;

ni_assert(list && node);

Expand All @@ -2062,6 +2063,17 @@ ni_config_parse_system_updater(ni_extension_t **list, xml_node_t *node)
return FALSE;
}

format = xml_node_get_attr(node, "format");
if (format) {
ex->format = strdup(format);

if (!ex->format) {
ni_warn("[%s] failed to allocate memory for format-string", node->name);
ni_extension_free(ex);
return FALSE;
}
}

if (ex->c_bindings) {
ni_warn("[%s] builtin actions not supported in %s extensions",
xml_node_location(node), node->name);
Expand Down
9 changes: 3 additions & 6 deletions src/dhcp6/protocol.c
Expand Up @@ -89,7 +89,7 @@ static int ni_dhcp6_option_get_duid(ni_buffer_t *bp, ni_opaque_t *duid);
*
*/
static int
__ni_dhcp6_mcast_socket_open(const struct ni_dhcp6_link *link, const char *ifname)
ni_dhcp6_link_mcast_socket_open(const struct ni_dhcp6_link *link, const char *ifname)
{
ni_sockaddr_t saddr;
int fd, on;
Expand Down Expand Up @@ -119,10 +119,7 @@ __ni_dhcp6_mcast_socket_open(const struct ni_dhcp6_link *link, const char *ifnam
on = 1;
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1)
ni_error("%s: Cannot set setsockopt(SO_REUSEADDR): %m", ifname);
#if defined(SO_REUSEPORT)
if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on)) == -1)
ni_error("%s: Cannot set setsockopt(SO_REUSEPORT): %m", ifname);
#endif

if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &on, sizeof(on)) == -1)
ni_error("%s: Cannot set setsockopt(SO_RCVBUF): %m", ifname);

Expand Down Expand Up @@ -199,7 +196,7 @@ ni_dhcp6_mcast_socket_open(ni_dhcp6_device_t *dev)
dev->mcast.dest.six.sin6_scope_id = dev->link.ifindex;

/* open the socket an bind to the link-local address */
if ((fd = __ni_dhcp6_mcast_socket_open(&dev->link, dev->ifname)) == -1)
if ((fd = ni_dhcp6_link_mcast_socket_open(&dev->link, dev->ifname)) == -1)
return -1;

/* finally wrap it and allocate receive buffer */
Expand Down
2 changes: 1 addition & 1 deletion src/duid.h
Expand Up @@ -75,7 +75,7 @@
typedef struct ni_duid_llt {
uint16_t type; /* type 1 */
uint16_t hwtype; /* link layer address type */
uint32_t v6time; /* second since 2001 % 2^32 */
uint32_t v6time; /* second since 2000 % 2^32 */
unsigned char hwaddr[]; /* link layer address */
} NI_PACKED ni_duid_llt_t;

Expand Down
1 change: 1 addition & 0 deletions src/extension.c
Expand Up @@ -199,6 +199,7 @@ ni_extension_free(ni_extension_t *ex)
if (ex) {
ni_string_free(&ex->name);
ni_string_free(&ex->interface);
ni_string_free(&ex->format);

ni_script_action_list_destroy(&ex->actions);
ni_c_binding_list_destroy(&ex->c_bindings);
Expand Down
2 changes: 1 addition & 1 deletion src/ifevent.c
Expand Up @@ -512,7 +512,7 @@ __ni_rtevent_deladdr(ni_netconfig_t *nc, const struct sockaddr_nl *nladdr, struc
if (dev == NULL)
return 0;

if (__ni_rtnl_parse_newaddr(dev->link.ifflags, h, ifa, &tmp) < 0) {
if (__ni_rtnl_parse_newaddr(dev->name, dev->link.ifflags, h, ifa, &tmp) < 0) {
ni_error("Problem parsing %s message for %s", dev->name,
ni_rtnl_msg_type_to_name(h->nlmsg_type, NULL));
return -1;
Expand Down
59 changes: 29 additions & 30 deletions src/iflist.c
Expand Up @@ -2810,30 +2810,31 @@ __ni_rtnl_parse_newprefix(const char *ifname, struct nlmsghdr *h, struct prefixm
}

static inline void
__newaddr_trace(unsigned int family, const char *name, struct nlattr *attr)
__newaddr_trace(const char *ifname, unsigned int family, const char *name, struct nlattr *attr)
{
ni_sockaddr_t temp;
if (attr && name) {
if (__ni_nla_get_addr(family, &temp, attr))
ni_trace("newaddr[%s]: ---", name);
ni_trace("%s: newaddr[%s]: ---", ifname, name);
else
ni_trace("newaddr[%s]: %s", name, ni_sockaddr_print(&temp));
ni_trace("%s: newaddr[%s]: %s", ifname, name, ni_sockaddr_print(&temp));
} else if(name) {
ni_trace("newaddr[%s]: NULL", name);
ni_trace("%s: newaddr[%s]: NULL", ifname, name);
}
}

/*
* Update interface address list given a RTM_NEWADDR message
*/
int
__ni_rtnl_parse_newaddr(unsigned ifflags, struct nlmsghdr *h, struct ifaddrmsg *ifa, ni_address_t *ap)
__ni_rtnl_parse_newaddr(const char *ifname, unsigned int ifflags, struct nlmsghdr *h,
struct ifaddrmsg *ifa, ni_address_t *ap)
{
struct nlattr *tb[IFA_MAX+1];

memset(tb, 0, sizeof(tb));
if (nlmsg_parse(h, sizeof(*ifa), tb, IFA_MAX, NULL) < 0) {
ni_error("unable to parse rtnl ADDR message");
ni_error("%s: unable to parse rtnl ADDR message", ifname);
return -1;
}

Expand All @@ -2847,13 +2848,13 @@ __ni_rtnl_parse_newaddr(unsigned ifflags, struct nlmsghdr *h, struct ifaddrmsg *
ap->flags = ifa->ifa_flags;

if (ni_log_level_at(NI_LOG_DEBUG3) && (ni_log_facility(NI_TRACE_EVENTS))) {
ni_trace("newaddr(%s): family %d, prefixlen %u, scope %u, flags %u",
(ifflags & NI_IFF_POINT_TO_POINT) ? "ptp" : "brd",
ni_trace("%s: newaddr(%s): family %d, prefixlen %u, scope %u, flags %u",
ifname, (ifflags & NI_IFF_POINT_TO_POINT) ? "ptp" : "brd",
ap->family, ap->prefixlen, ap->scope, ap->flags);
__newaddr_trace(ifa->ifa_family, __ni_string(IFA_LOCAL), tb[IFA_LOCAL]);
__newaddr_trace(ifa->ifa_family, __ni_string(IFA_ADDRESS), tb[IFA_ADDRESS]);
__newaddr_trace(ifa->ifa_family, __ni_string(IFA_BROADCAST), tb[IFA_BROADCAST]);
__newaddr_trace(ifa->ifa_family, __ni_string(IFA_ANYCAST), tb[IFA_ANYCAST]);
__newaddr_trace(ifname, ifa->ifa_family, __ni_string(IFA_LOCAL), tb[IFA_LOCAL]);
__newaddr_trace(ifname, ifa->ifa_family, __ni_string(IFA_ADDRESS), tb[IFA_ADDRESS]);
__newaddr_trace(ifname, ifa->ifa_family, __ni_string(IFA_BROADCAST), tb[IFA_BROADCAST]);
__newaddr_trace(ifname, ifa->ifa_family, __ni_string(IFA_ANYCAST), tb[IFA_ANYCAST]);
}

/*
Expand All @@ -2862,27 +2863,25 @@ __ni_rtnl_parse_newaddr(unsigned ifflags, struct nlmsghdr *h, struct ifaddrmsg *
* It makes no difference for normally configured broadcast interfaces,
* but for point-to-point IFA_ADDRESS is DESTINATION address,
* local address is supplied in IFA_LOCAL attribute.
*
* In a peer setup (regardless if ptp interface or brd):
* - local is IFA_LOCAL, peer is IFA_ADDRESS (IFA_BROADCAST is NULL).
* Otherwise (without peer):
* - in IPv6: IFA_LOCAL is NULL and address in IFA_ADDRESS
* - in IPv4: address in IFA_LOCAL and in IFA_ADDRESS (equal),
* IFA_BROADCAST is NULL unless it was explicitly specified
* ("ip addr add 192.168.0.1/24 dev eth0" doesn't set it).
*/
if (ifflags & NI_IFF_POINT_TO_POINT) {
if (tb[IFA_LOCAL]) {
/* local peer remote */
__ni_nla_get_addr(ifa->ifa_family, &ap->local_addr, tb[IFA_LOCAL]);
__ni_nla_get_addr(ifa->ifa_family, &ap->peer_addr, tb[IFA_ADDRESS]);
} else
if (tb[IFA_ADDRESS]) {
/* local only, e.g. tunnel ipv6 link layer address */
__ni_nla_get_addr(ifa->ifa_family, &ap->local_addr, tb[IFA_ADDRESS]);
}
/* Note iproute2 code obtains peer_addr from IFA_BROADCAST */
/* When I read and remember it correctly, iproute2 is using:
* !tb[IFA_BROADCAST] && tb[IFA_LOCAL] && tb[IFA_ADDRESS]
* instead of the p-t-p flag ...
*/
if (tb[IFA_LOCAL]) {
__ni_nla_get_addr(ifa->ifa_family, &ap->local_addr, tb[IFA_LOCAL]);
__ni_nla_get_addr(ifa->ifa_family, &ap->peer_addr, tb[IFA_ADDRESS]);
if (ni_sockaddr_equal(&ap->local_addr, &ap->peer_addr))
memset(&ap->peer_addr, 0, sizeof(ap->peer_addr));
} else {
__ni_nla_get_addr(ifa->ifa_family, &ap->local_addr, tb[IFA_ADDRESS]);
if (tb[IFA_BROADCAST])
__ni_nla_get_addr(ifa->ifa_family, &ap->bcast_addr, tb[IFA_BROADCAST]);
}

__ni_nla_get_addr(ifa->ifa_family, &ap->bcast_addr, tb[IFA_BROADCAST]);
__ni_nla_get_addr(ifa->ifa_family, &ap->anycast_addr, tb[IFA_ANYCAST]);

if (tb[IFA_CACHEINFO]) {
Expand All @@ -2907,7 +2906,7 @@ __ni_netdev_process_newaddr_event(ni_netdev_t *dev, struct nlmsghdr *h, struct i
{
ni_address_t tmp, *ap;

if (__ni_rtnl_parse_newaddr(dev->link.ifflags, h, ifa, &tmp) < 0)
if (__ni_rtnl_parse_newaddr(dev->name, dev->link.ifflags, h, ifa, &tmp) < 0)
return -1;

ap = ni_address_list_find(dev->addrs, &tmp.local_addr);
Expand Down
3 changes: 2 additions & 1 deletion src/kernel.h
Expand Up @@ -120,7 +120,8 @@ extern ni_bool_t ni_rtnl_route_filter_msg(struct rtmsg *);
extern int ni_rtnl_route_parse_msg(struct nlmsghdr *, struct rtmsg *, ni_route_t *);
extern int ni_rtnl_rule_parse_msg(struct nlmsghdr *, struct fib_rule_hdr *, ni_rule_t *);

extern int __ni_rtnl_parse_newaddr(unsigned, struct nlmsghdr *, struct ifaddrmsg *, ni_address_t *);
extern int __ni_rtnl_parse_newaddr(const char *, unsigned int, struct nlmsghdr *,
struct ifaddrmsg *, ni_address_t *);
extern int __ni_rtnl_parse_newprefix(const char *, struct nlmsghdr *, struct prefixmsg *, ni_ipv6_ra_pinfo_t *);

extern int __ni_netdev_process_newlink(ni_netdev_t *, struct nlmsghdr *, struct ifinfomsg *, ni_netconfig_t *);
Expand Down

0 comments on commit 8e98099

Please sign in to comment.