diff options
author | Jan Moskyto Matejka <mq@ucw.cz> | 2016-01-07 11:29:05 +0100 |
---|---|---|
committer | Jan Moskyto Matejka <mq@ucw.cz> | 2016-01-11 09:29:51 +0100 |
commit | 5b218c3d9bf9357aed0acf535bdfc6684cc5cda4 (patch) | |
tree | dcd9dcbd1faa343e0fc603ff7ebec6740a359f8b /proto/bfd/packets.c | |
parent | b9f56921865dfe816091266e990e94db3e2fdbdf (diff) |
BFD: split of v4/v6 sockets
Diffstat (limited to 'proto/bfd/packets.c')
-rw-r--r-- | proto/bfd/packets.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/proto/bfd/packets.c b/proto/bfd/packets.c index 2200acfa..a28e4c50 100644 --- a/proto/bfd/packets.c +++ b/proto/bfd/packets.c @@ -186,7 +186,7 @@ bfd_err_hook(sock *sk, int err) } sock * -bfd_open_rx_sk(struct bfd_proto *p, int multihop) +bfd_open_rx_sk(struct bfd_proto *p, int multihop, int inet_version) { sock *sk = sk_new(p->tpool); sk->type = SK_UDP; @@ -202,7 +202,18 @@ bfd_open_rx_sk(struct bfd_proto *p, int multihop) sk->priority = sk_priority_control; sk->flags = SKF_THREAD | SKF_LADDR_RX | (!multihop ? SKF_TTL_RX : 0); - sk->af = AF_INET6; + switch (inet_version) { + case 4: + sk->af = AF_INET; + sk->flags |= SKF_V4ONLY; + break; + case 6: + sk->af = AF_INET6; + sk->flags |= SKF_V6ONLY; + break; + default: + ASSERT(0); + } if (sk_open(sk) < 0) goto err; @@ -235,7 +246,13 @@ bfd_open_tx_sk(struct bfd_proto *p, ip_addr local, struct iface *ifa) sk->ttl = ifa ? 255 : -1; sk->flags = SKF_THREAD | SKF_BIND | SKF_HIGH_PORT; - sk->af = AF_INET6; + if (ipa_is_ip4(local)) { + sk->af = AF_INET; + sk->flags |= SKF_V4ONLY; + } else { + sk->af = AF_INET6; + sk->flags |= SKF_V6ONLY; + } if (sk_open(sk) < 0) goto err; |