Linux - Failure to assign ipv6 address to virtual interface without error
I'm working on NixOS, creating some functions in C to programmatically manipulate veth pairs and assign IPv6 addresses in order to create a program for setting up a network for containers on a single host.
To do so, I'm using libnftnl and libmnl to handle the fine details of constructing rtnetlink packets and setns()
to set the network namespace of the calling thread to the correct network namespace before performing actions such as bringing an interface up.
The general flow of the program goes like:
- create veth pairs in the host network namespace
- move one end of each veth pair to the corresponding network namespace
- set all the veth endpoints in the host network namespace to UP
- call `setns()` into each other network namespace to set
the loopback interface and vethpair end to UP
- add an IPv6 address to each of the veth ends in the host network namespace
- call `setns()` into each other network namespace to set the IPv6 address
of the other veth endpoints
The Problem
When I run the program, IPv6 addresses in the host network namespace aren't always assigned to the interfaces. All the previous steps occur and exist and even the IPv6 addresses are assigned to all interfaces in other network namespaces but not always in the host network namespace.
This happens when I run the program, delete all the interfaces and rerun the program within about a minute of each other.
Some solutions that I've come up with are that if I make the program sleep for, say 5 seconds, before assigning addresses to interfaces in the host namespace, I can run the program, delete the interfaces and rerun the program nonstop and the addresses are all assigned. I can also wait a while after deleting the interfaces before rerunning the program and this will also cause all IPv6 addresses to be assigned correctly.
Other weird stuff
When running the program, there are times when some IPv6 addresses in the host network namespace are added and some aren't. The netlink ACK message returned for the packets also indicate that no error occurred so I can't tell that an address has failed to be assigned until I run ip address
after the program exits.
Since this program is eventually going to be part of a larger container orchestration system, I'm looking to see if there's a way to either detect or prevent this kind of error.
I've thought about it potentially being duplicate address detection or the IP address being still stored somewhere in the kernel for a while after being delete but I receive no error from the netlink module.
linux networking kernel network-interface
New contributor
add a comment |
I'm working on NixOS, creating some functions in C to programmatically manipulate veth pairs and assign IPv6 addresses in order to create a program for setting up a network for containers on a single host.
To do so, I'm using libnftnl and libmnl to handle the fine details of constructing rtnetlink packets and setns()
to set the network namespace of the calling thread to the correct network namespace before performing actions such as bringing an interface up.
The general flow of the program goes like:
- create veth pairs in the host network namespace
- move one end of each veth pair to the corresponding network namespace
- set all the veth endpoints in the host network namespace to UP
- call `setns()` into each other network namespace to set
the loopback interface and vethpair end to UP
- add an IPv6 address to each of the veth ends in the host network namespace
- call `setns()` into each other network namespace to set the IPv6 address
of the other veth endpoints
The Problem
When I run the program, IPv6 addresses in the host network namespace aren't always assigned to the interfaces. All the previous steps occur and exist and even the IPv6 addresses are assigned to all interfaces in other network namespaces but not always in the host network namespace.
This happens when I run the program, delete all the interfaces and rerun the program within about a minute of each other.
Some solutions that I've come up with are that if I make the program sleep for, say 5 seconds, before assigning addresses to interfaces in the host namespace, I can run the program, delete the interfaces and rerun the program nonstop and the addresses are all assigned. I can also wait a while after deleting the interfaces before rerunning the program and this will also cause all IPv6 addresses to be assigned correctly.
Other weird stuff
When running the program, there are times when some IPv6 addresses in the host network namespace are added and some aren't. The netlink ACK message returned for the packets also indicate that no error occurred so I can't tell that an address has failed to be assigned until I run ip address
after the program exits.
Since this program is eventually going to be part of a larger container orchestration system, I'm looking to see if there's a way to either detect or prevent this kind of error.
I've thought about it potentially being duplicate address detection or the IP address being still stored somewhere in the kernel for a while after being delete but I receive no error from the netlink module.
linux networking kernel network-interface
New contributor
add a comment |
I'm working on NixOS, creating some functions in C to programmatically manipulate veth pairs and assign IPv6 addresses in order to create a program for setting up a network for containers on a single host.
To do so, I'm using libnftnl and libmnl to handle the fine details of constructing rtnetlink packets and setns()
to set the network namespace of the calling thread to the correct network namespace before performing actions such as bringing an interface up.
The general flow of the program goes like:
- create veth pairs in the host network namespace
- move one end of each veth pair to the corresponding network namespace
- set all the veth endpoints in the host network namespace to UP
- call `setns()` into each other network namespace to set
the loopback interface and vethpair end to UP
- add an IPv6 address to each of the veth ends in the host network namespace
- call `setns()` into each other network namespace to set the IPv6 address
of the other veth endpoints
The Problem
When I run the program, IPv6 addresses in the host network namespace aren't always assigned to the interfaces. All the previous steps occur and exist and even the IPv6 addresses are assigned to all interfaces in other network namespaces but not always in the host network namespace.
This happens when I run the program, delete all the interfaces and rerun the program within about a minute of each other.
Some solutions that I've come up with are that if I make the program sleep for, say 5 seconds, before assigning addresses to interfaces in the host namespace, I can run the program, delete the interfaces and rerun the program nonstop and the addresses are all assigned. I can also wait a while after deleting the interfaces before rerunning the program and this will also cause all IPv6 addresses to be assigned correctly.
Other weird stuff
When running the program, there are times when some IPv6 addresses in the host network namespace are added and some aren't. The netlink ACK message returned for the packets also indicate that no error occurred so I can't tell that an address has failed to be assigned until I run ip address
after the program exits.
Since this program is eventually going to be part of a larger container orchestration system, I'm looking to see if there's a way to either detect or prevent this kind of error.
I've thought about it potentially being duplicate address detection or the IP address being still stored somewhere in the kernel for a while after being delete but I receive no error from the netlink module.
linux networking kernel network-interface
New contributor
I'm working on NixOS, creating some functions in C to programmatically manipulate veth pairs and assign IPv6 addresses in order to create a program for setting up a network for containers on a single host.
To do so, I'm using libnftnl and libmnl to handle the fine details of constructing rtnetlink packets and setns()
to set the network namespace of the calling thread to the correct network namespace before performing actions such as bringing an interface up.
The general flow of the program goes like:
- create veth pairs in the host network namespace
- move one end of each veth pair to the corresponding network namespace
- set all the veth endpoints in the host network namespace to UP
- call `setns()` into each other network namespace to set
the loopback interface and vethpair end to UP
- add an IPv6 address to each of the veth ends in the host network namespace
- call `setns()` into each other network namespace to set the IPv6 address
of the other veth endpoints
The Problem
When I run the program, IPv6 addresses in the host network namespace aren't always assigned to the interfaces. All the previous steps occur and exist and even the IPv6 addresses are assigned to all interfaces in other network namespaces but not always in the host network namespace.
This happens when I run the program, delete all the interfaces and rerun the program within about a minute of each other.
Some solutions that I've come up with are that if I make the program sleep for, say 5 seconds, before assigning addresses to interfaces in the host namespace, I can run the program, delete the interfaces and rerun the program nonstop and the addresses are all assigned. I can also wait a while after deleting the interfaces before rerunning the program and this will also cause all IPv6 addresses to be assigned correctly.
Other weird stuff
When running the program, there are times when some IPv6 addresses in the host network namespace are added and some aren't. The netlink ACK message returned for the packets also indicate that no error occurred so I can't tell that an address has failed to be assigned until I run ip address
after the program exits.
Since this program is eventually going to be part of a larger container orchestration system, I'm looking to see if there's a way to either detect or prevent this kind of error.
I've thought about it potentially being duplicate address detection or the IP address being still stored somewhere in the kernel for a while after being delete but I receive no error from the netlink module.
linux networking kernel network-interface
linux networking kernel network-interface
New contributor
New contributor
New contributor
asked 12 mins ago
RayRay
61
61
New contributor
New contributor
add a comment |
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "106"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Ray is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f503923%2flinux-failure-to-assign-ipv6-address-to-virtual-interface-without-error%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Ray is a new contributor. Be nice, and check out our Code of Conduct.
Ray is a new contributor. Be nice, and check out our Code of Conduct.
Ray is a new contributor. Be nice, and check out our Code of Conduct.
Ray is a new contributor. Be nice, and check out our Code of Conduct.
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f503923%2flinux-failure-to-assign-ipv6-address-to-virtual-interface-without-error%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown