add_tail(&bfd_proto_list, &p->bfd_node);
birdloop_enter(p->loop);
- p->rx_1 = bfd_open_rx_sk(p, 0);
- p->rx_m = bfd_open_rx_sk(p, 1);
+ p->rx4_1 = bfd_open_rx_sk(p, 0, 4);
+ p->rx4_m = bfd_open_rx_sk(p, 1, 4);
+ p->rx6_1 = bfd_open_rx_sk(p, 0, 6);
+ p->rx6_m = bfd_open_rx_sk(p, 1, 6);
birdloop_leave(p->loop);
bfd_take_requests(p);
sock *notify_ws;
list notify_list;
- sock *rx_1;
- sock *rx_m;
+ sock *rx4_1;
+ sock *rx6_1;
+ sock *rx4_m;
+ sock *rx6_m;
list iface_list;
};
/* packets.c */
void bfd_send_ctl(struct bfd_proto *p, struct bfd_session *s, int final);
-sock * bfd_open_rx_sk(struct bfd_proto *p, int multihop);
+sock * bfd_open_rx_sk(struct bfd_proto *p, int multihop, int inet_version);
sock * bfd_open_tx_sk(struct bfd_proto *p, ip_addr local, struct iface *ifa);
}
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;
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;
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;