Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support to bind socket to FIB on a FreeBSD #271

Merged
merged 4 commits into from Nov 1, 2021

Conversation

wladwm
Copy link

@wladwm wladwm commented Oct 21, 2021

Hi.

This patch simply add support SO_SETFIB option to socket on a FreeBSD+ OS.
It allow to build VRF-aware applications on FreeBSD and partially solve problem with missing Bind-To-Device option on BSD.

src/sys/unix.rs Outdated Show resolved Hide resolved
src/sys/unix.rs Show resolved Hide resolved
src/sys/unix.rs Outdated Show resolved Hide resolved
any(target_os = "freebsd", target_os = "dragonfly", target_os = "openbsd")
)))
)]
pub fn set_fib(&self, fib: u32) -> io::Result<()> {
Copy link
Collaborator

@Thomasdezeeuw Thomasdezeeuw Oct 23, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Author

@wladwm wladwm Oct 25, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

setfib - it's another syscall, that set FIB for current process, so all sockets will have specified fib by default.
setsockopt set fib only for exact socket.
In freebsd sources SO_SETFIB using with int.

Copy link
Collaborator

@Thomasdezeeuw Thomasdezeeuw Nov 1, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

setfib - it's another syscall, that set FIB for current process, so all sockets will have specified fib by default. setsockopt set fib only for exact socket.

Right, but it's the same option right? That system call just does it process wide.

In freebsd sources SO_SETFIB using with int.

But in C 80% of the input is an int, which b.t.w only has to be 16 bits. However we should try to provide a type that matches the expected input better. For example you're already using an unsigned integer, not a signed one.

P.S. please don't resolve conversations that aren't resolved.

Copy link
Collaborator

@Thomasdezeeuw Thomasdezeeuw Nov 1, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've check with the FreeBSD discord and they recommend u32 as well so going with that.

Copy link
Author

@wladwm wladwm Nov 1, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we will take a look on freebsd sources:
user side
https://github.com/freebsd/freebsd-src/blob/main/sbin/route/route.c
it uses exactly int
at kernel side (https://github.com/freebsd/freebsd-src/blob/main/sys/sys/socketvar.h) field so_fibnum also has type int.
FreeBSD has only up to 16 FIBs and FIB should not be negative. So I think it for possible future extensions.

Copy link
Collaborator

@Thomasdezeeuw Thomasdezeeuw left a comment

LGTM, since our FreeBSD build is somewhat broken I'll test it locally this weekend.

@Thomasdezeeuw Thomasdezeeuw merged commit 5c7b03f into rust-lang:master Nov 1, 2021
18 of 19 checks passed
@Thomasdezeeuw
Copy link
Collaborator

@Thomasdezeeuw Thomasdezeeuw commented Nov 1, 2021

Thanks @wladwm.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants