| 705 | |
| 706 | #ifdef INET6 |
| 707 | static int |
| 708 | ff_veth_setaddr6(struct ff_veth_softc *sc, const char *if_name) |
| 709 | { |
| 710 | struct in6_aliasreq ifr6; |
| 711 | bzero(&ifr6, sizeof(ifr6)); |
| 712 | |
| 713 | if (if_name) { |
| 714 | strcpy(ifr6.ifra_name, if_name); |
| 715 | } else { |
| 716 | strcpy(ifr6.ifra_name, sc->ifp->if_dname); |
| 717 | } |
| 718 | |
| 719 | ifr6.ifra_addr.sin6_len = sizeof ifr6.ifra_addr; |
| 720 | ifr6.ifra_addr.sin6_family = AF_INET6; |
| 721 | ifr6.ifra_addr.sin6_addr = sc->ip6; |
| 722 | |
| 723 | ifr6.ifra_prefixmask.sin6_len = sizeof ifr6.ifra_prefixmask; |
| 724 | memset(&ifr6.ifra_prefixmask.sin6_addr, 0xff, sc->prefix_length / 8); |
| 725 | uint8_t mask_size_mod = sc->prefix_length % 8; |
| 726 | if (mask_size_mod) |
| 727 | { |
| 728 | ifr6.ifra_prefixmask.sin6_addr.__u6_addr.__u6_addr8[sc->prefix_length / 8] = \ |
| 729 | ((1 << mask_size_mod) - 1) << (8 - mask_size_mod); |
| 730 | } |
| 731 | |
| 732 | ifr6.ifra_lifetime.ia6t_pltime = ifr6.ifra_lifetime.ia6t_vltime = ND6_INFINITE_LIFETIME; |
| 733 | |
| 734 | ifr6.ifra_flags |= IN6_IFF_AUTOCONF; |
| 735 | |
| 736 | struct socket *so = NULL; |
| 737 | socreate(AF_INET6, &so, SOCK_DGRAM, 0, curthread->td_ucred, curthread); |
| 738 | int ret = ifioctl(so, SIOCAIFADDR_IN6, (caddr_t)&ifr6, curthread); |
| 739 | |
| 740 | soclose(so); |
| 741 | |
| 742 | return ret; |
| 743 | } |
| 744 | |
| 745 | static int |
| 746 | ff_veth_set_gateway6(struct ff_veth_softc *sc, uint32_t fib_num) |