diff options
Diffstat (limited to 'proto/bfd')
-rw-r--r-- | proto/bfd/bfd.c | 11 | ||||
-rw-r--r-- | proto/bfd/bfd.h | 8 | ||||
-rw-r--r-- | proto/bfd/packets.c | 27 |
3 files changed, 32 insertions, 14 deletions
diff --git a/proto/bfd/bfd.c b/proto/bfd/bfd.c index 5de2f556..f966161c 100644 --- a/proto/bfd/bfd.c +++ b/proto/bfd/bfd.c @@ -112,7 +112,7 @@ #define HASH_IP_KEY(n) n->addr #define HASH_IP_NEXT(n) n->next_ip #define HASH_IP_EQ(a,b) ipa_equal(a,b) -#define HASH_IP_FN(k) ipa_hash32(k) +#define HASH_IP_FN(k) ipa_hash(k) static list bfd_proto_list; static list bfd_wait_list; @@ -952,7 +952,7 @@ bfd_init_all(void) static struct proto * bfd_init(struct proto_config *c) { - struct proto *p = proto_new(c, sizeof(struct bfd_proto)); + struct proto *p = proto_new(c); p->neigh_notify = bfd_neigh_notify; @@ -981,8 +981,10 @@ bfd_start(struct proto *P) 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); @@ -1116,6 +1118,7 @@ bfd_show_sessions(struct proto *P) struct protocol proto_bfd = { .name = "BFD", .template = "bfd%d", + .proto_size = sizeof(struct bfd_proto), .config_size = sizeof(struct bfd_config), .init = bfd_init, .start = bfd_start, diff --git a/proto/bfd/bfd.h b/proto/bfd/bfd.h index 9b61be64..ce7d665b 100644 --- a/proto/bfd/bfd.h +++ b/proto/bfd/bfd.h @@ -84,8 +84,10 @@ struct bfd_proto 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; }; @@ -184,7 +186,7 @@ void bfd_show_sessions(struct proto *P); /* 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); diff --git a/proto/bfd/packets.c b/proto/bfd/packets.c index cb40bcda..b7a057f1 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,9 +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); -#ifdef IPV6 - sk->flags |= SKF_V6ONLY; -#endif + switch (inet_version) { + case 4: + sk->fam = SK_FAM_IPV4; + sk->flags |= SKF_V4ONLY; + break; + case 6: + sk->fam = SK_FAM_IPV6; + sk->flags |= SKF_V6ONLY; + break; + default: + ASSERT(0); + } if (sk_open(sk) < 0) goto err; @@ -237,9 +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; -#ifdef IPV6 - sk->flags |= SKF_V6ONLY; -#endif + if (ipa_is_ip4(local)) { + sk->fam = SK_FAM_IPV4; + sk->flags |= SKF_V4ONLY; + } else { + sk->fam = SK_FAM_IPV6; + sk->flags |= SKF_V6ONLY; + } if (sk_open(sk) < 0) goto err; |