Lubomir Rintel 2023-01-17 19:20:39 +01:00
commit 38d3834e2c

View file

@ -721,6 +721,9 @@ wait_for_nl_response_to_string(WaitForNlResponseResult seq_result,
case WAIT_FOR_NL_RESPONSE_RESULT_RESPONSE_UNKNOWN: case WAIT_FOR_NL_RESPONSE_RESULT_RESPONSE_UNKNOWN:
nm_strbuf_append_str(&buf, &buf_size, "failure"); nm_strbuf_append_str(&buf, &buf_size, "failure");
break; break;
case WAIT_FOR_NL_RESPONSE_RESULT_FAILED_RESYNC:
nm_strbuf_append_str(&buf, &buf_size, "failed-resync");
break;
default: default:
if (seq_result < 0) { if (seq_result < 0) {
nm_strbuf_append(&buf, nm_strbuf_append(&buf,
@ -8158,20 +8161,25 @@ do_change_link(NMPlatform *platform,
WaitForNlResponseResult seq_result = WAIT_FOR_NL_RESPONSE_RESULT_UNKNOWN; WaitForNlResponseResult seq_result = WAIT_FOR_NL_RESPONSE_RESULT_UNKNOWN;
gs_free char *errmsg = NULL; gs_free char *errmsg = NULL;
char s_buf[256]; char s_buf[256];
int result = 0; int result;
NMLogLevel log_level = LOGL_DEBUG; NMLogLevel log_level;
const char *log_result = "failure"; const char *log_detail;
const char *log_detail = "";
gs_free char *log_detail_free = NULL; gs_free char *log_detail_free = NULL;
const NMPObject *obj_cache; const NMPObject *obj_cache;
if (!nm_platform_netns_push(platform, &netns)) { if (!nm_platform_netns_push(platform, &netns)) {
log_level = LOGL_ERR; log_level = LOGL_ERR;
log_detail = ", failure to change network namespace"; log_detail = ", failure to change network namespace";
result = -NME_UNSPEC;
goto out; goto out;
} }
retry: retry:
result = -NME_UNSPEC;
log_level = LOGL_WARN;
log_detail = "";
nm_clear_g_free(&log_detail_free);
nle = _netlink_send_nlmsg_rtnl(platform, nlmsg, &seq_result, &errmsg); nle = _netlink_send_nlmsg_rtnl(platform, nlmsg, &seq_result, &errmsg);
if (nle < 0) { if (nle < 0) {
log_level = LOGL_ERR; log_level = LOGL_ERR;
@ -8189,53 +8197,54 @@ retry:
nm_assert(seq_result); nm_assert(seq_result);
if (NM_IN_SET(-((int) seq_result), EOPNOTSUPP) && nlmsg_hdr(nlmsg)->nlmsg_type == RTM_NEWLINK) { if (NM_IN_SET(seq_result, WAIT_FOR_NL_RESPONSE_RESULT_RESPONSE_OK, -EEXIST, -EADDRINUSE)) {
log_level = LOGL_DEBUG;
result = 0;
} else if (NM_IN_SET(seq_result, -EOPNOTSUPP) && nlmsg_hdr(nlmsg)->nlmsg_type == RTM_NEWLINK) {
nlmsg_hdr(nlmsg)->nlmsg_type = RTM_SETLINK; nlmsg_hdr(nlmsg)->nlmsg_type = RTM_SETLINK;
goto retry;
}
if (seq_result == WAIT_FOR_NL_RESPONSE_RESULT_RESPONSE_OK) { log_level = LOGL_INFO;
log_result = "success"; log_detail = ", will try SETLINK instead of NEWLINK";
} else if (NM_IN_SET(-((int) seq_result), EEXIST, EADDRINUSE)) { result = -EAGAIN;
/* */ } else if (seq_result == WAIT_FOR_NL_RESPONSE_RESULT_FAILED_RESYNC) {
} else if (NM_IN_SET(-((int) seq_result), ESRCH, ENOENT)) { log_level = LOGL_INFO;
log_detail = ", due to lost synchronization";
result = -EAGAIN;
} else if (NM_IN_SET(seq_result, -ESRCH, -ENOENT)) {
log_detail = ", firmware not found"; log_detail = ", firmware not found";
result = -NME_PL_NO_FIRMWARE; result = -NME_PL_NO_FIRMWARE;
} else if (NM_IN_SET(-((int) seq_result), ERANGE) } else if (NM_IN_SET(seq_result, -ERANGE) && change_link_type == CHANGE_LINK_TYPE_SET_MTU) {
&& change_link_type == CHANGE_LINK_TYPE_SET_MTU) {
log_detail = ", setting MTU to requested size is not possible"; log_detail = ", setting MTU to requested size is not possible";
result = -NME_PL_CANT_SET_MTU; result = -NME_PL_CANT_SET_MTU;
} else if (NM_IN_SET(-((int) seq_result), ENFILE) } else if (NM_IN_SET(seq_result, -ENFILE) && change_link_type == CHANGE_LINK_TYPE_SET_ADDRESS
&& change_link_type == CHANGE_LINK_TYPE_SET_ADDRESS
&& (obj_cache = nmp_cache_lookup_link(nm_platform_get_cache(platform), ifindex)) && (obj_cache = nmp_cache_lookup_link(nm_platform_get_cache(platform), ifindex))
&& obj_cache->link.l_address.len == data->set_address.length && obj_cache->link.l_address.len == data->set_address.length
&& memcmp(obj_cache->link.l_address.data, && memcmp(obj_cache->link.l_address.data,
data->set_address.address, data->set_address.address,
data->set_address.length) data->set_address.length)
== 0) { == 0) {
/* workaround ENFILE which may be wrongly returned (bgo #770456). /* work around ENFILE which may be wrongly returned (bgo #770456).
* If the MAC address is as expected, assume success? */ * If the MAC address is as expected, assume success? */
log_result = "success";
log_detail = " (assume success changing address)"; log_detail = " (assume success changing address)";
result = 0; result = 0;
} else if (NM_IN_SET(-((int) seq_result), ENODEV)) { } else if (NM_IN_SET(seq_result, -ENODEV)) {
log_level = LOGL_DEBUG; log_level = LOGL_DEBUG;
result = -NME_PL_NOT_FOUND; result = -NME_PL_NOT_FOUND;
} else if (-((int) seq_result) == EAFNOSUPPORT) { } else if (seq_result == -EAFNOSUPPORT) {
log_level = LOGL_DEBUG; log_level = LOGL_DEBUG;
result = -NME_PL_OPNOTSUPP; result = -NME_PL_OPNOTSUPP;
} else {
log_level = LOGL_WARN;
result = -NME_UNSPEC;
} }
out: out:
_NMLOG(log_level, _NMLOG(log_level,
"do-change-link[%d]: %s changing link: %s%s", "do-change-link[%d]: %s%s",
ifindex, ifindex,
log_result,
wait_for_nl_response_to_string(seq_result, errmsg, s_buf, sizeof(s_buf)), wait_for_nl_response_to_string(seq_result, errmsg, s_buf, sizeof(s_buf)),
log_detail); log_detail);
if (result == -EAGAIN)
goto retry;
return result; return result;
} }