mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-05-05 09:58:07 +02:00
merge: branch 'lr/nl-retry'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1501
This commit is contained in:
commit
38d3834e2c
1 changed files with 34 additions and 25 deletions
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue