in6.c (09a52a5532c1b2c0c21e383f06fea52ccd9080b7) in6.c (1272577e22d8f1c1c5b5e88f2624836e93aecb17)
1/* $FreeBSD$ */
2/* $KAME: in6.c,v 1.259 2002/01/21 11:37:50 keiichi Exp $ */
3
4/*-
5 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 263 unchanged lines hidden (view full) ---

272 in6_ifloop_request(RTM_DELETE, ifa);
273 } else
274 RT_UNLOCK(rt);
275 }
276 }
277}
278
279int
1/* $FreeBSD$ */
2/* $KAME: in6.c,v 1.259 2002/01/21 11:37:50 keiichi Exp $ */
3
4/*-
5 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 263 unchanged lines hidden (view full) ---

272 in6_ifloop_request(RTM_DELETE, ifa);
273 } else
274 RT_UNLOCK(rt);
275 }
276 }
277}
278
279int
280in6_mask2len(mask, lim0)
281 struct in6_addr *mask;
282 u_char *lim0;
280in6_mask2len(struct in6_addr *mask, u_char *lim0)
283{
284 int x = 0, y;
285 u_char *lim = lim0, *p;
286
287 /* ignore the scope_id part */
288 if (lim0 == NULL || lim0 - (u_char *)mask > sizeof(*mask))
289 lim = (u_char *)mask + sizeof(*mask);
290 for (p = (u_char *)mask; p < lim; x++, p++) {

--- 22 unchanged lines hidden (view full) ---

313
314 return x * 8 + y;
315}
316
317#define ifa2ia6(ifa) ((struct in6_ifaddr *)(ifa))
318#define ia62ifa(ia6) (&((ia6)->ia_ifa))
319
320int
281{
282 int x = 0, y;
283 u_char *lim = lim0, *p;
284
285 /* ignore the scope_id part */
286 if (lim0 == NULL || lim0 - (u_char *)mask > sizeof(*mask))
287 lim = (u_char *)mask + sizeof(*mask);
288 for (p = (u_char *)mask; p < lim; x++, p++) {

--- 22 unchanged lines hidden (view full) ---

311
312 return x * 8 + y;
313}
314
315#define ifa2ia6(ifa) ((struct in6_ifaddr *)(ifa))
316#define ia62ifa(ia6) (&((ia6)->ia_ifa))
317
318int
321in6_control(so, cmd, data, ifp, td)
322 struct socket *so;
323 u_long cmd;
324 caddr_t data;
325 struct ifnet *ifp;
326 struct thread *td;
319in6_control(struct socket *so, u_long cmd, caddr_t data,
320 struct ifnet *ifp, struct thread *td)
327{
328 struct in6_ifreq *ifr = (struct in6_ifreq *)data;
329 struct in6_ifaddr *ia = NULL;
330 struct in6_aliasreq *ifra = (struct in6_aliasreq *)data;
331 struct sockaddr_in6 *sa6;
332 int error;
333
334 switch (cmd) {

--- 455 unchanged lines hidden (view full) ---

790
791/*
792 * Update parameters of an IPv6 interface address.
793 * If necessary, a new entry is created and linked into address chains.
794 * This function is separated from in6_control().
795 * XXX: should this be performed under splnet()?
796 */
797int
321{
322 struct in6_ifreq *ifr = (struct in6_ifreq *)data;
323 struct in6_ifaddr *ia = NULL;
324 struct in6_aliasreq *ifra = (struct in6_aliasreq *)data;
325 struct sockaddr_in6 *sa6;
326 int error;
327
328 switch (cmd) {

--- 455 unchanged lines hidden (view full) ---

784
785/*
786 * Update parameters of an IPv6 interface address.
787 * If necessary, a new entry is created and linked into address chains.
788 * This function is separated from in6_control().
789 * XXX: should this be performed under splnet()?
790 */
791int
798in6_update_ifa(ifp, ifra, ia, flags)
799 struct ifnet *ifp;
800 struct in6_aliasreq *ifra;
801 struct in6_ifaddr *ia;
802 int flags;
792in6_update_ifa(struct ifnet *ifp, struct in6_aliasreq *ifra,
793 struct in6_ifaddr *ia, int flags)
803{
804 int error = 0, hostIsNew = 0, plen = -1;
805 struct in6_ifaddr *oia;
806 struct sockaddr_in6 dst6;
807 struct in6_addrlifetime *lt;
808 struct in6_multi_mship *imm;
809 struct in6_multi *in6m_sol;
810 struct rtentry *rt;

--- 510 unchanged lines hidden (view full) ---

1321 return (error);
1322
1323 cleanup:
1324 in6_purgeaddr(&ia->ia_ifa);
1325 return error;
1326}
1327
1328void
794{
795 int error = 0, hostIsNew = 0, plen = -1;
796 struct in6_ifaddr *oia;
797 struct sockaddr_in6 dst6;
798 struct in6_addrlifetime *lt;
799 struct in6_multi_mship *imm;
800 struct in6_multi *in6m_sol;
801 struct rtentry *rt;

--- 510 unchanged lines hidden (view full) ---

1312 return (error);
1313
1314 cleanup:
1315 in6_purgeaddr(&ia->ia_ifa);
1316 return error;
1317}
1318
1319void
1329in6_purgeaddr(ifa)
1330 struct ifaddr *ifa;
1320in6_purgeaddr(struct ifaddr *ifa)
1331{
1332 struct ifnet *ifp = ifa->ifa_ifp;
1333 struct in6_ifaddr *ia = (struct in6_ifaddr *) ifa;
1334 char ip6buf[INET6_ADDRSTRLEN];
1335 struct in6_multi_mship *imm;
1336
1337 /* stop DAD processing */
1338 nd6_dad_stop(ifa);

--- 27 unchanged lines hidden (view full) ---

1366 LIST_REMOVE(imm, i6mm_chain);
1367 in6_leavegroup(imm);
1368 }
1369
1370 in6_unlink_ifa(ia, ifp);
1371}
1372
1373static void
1321{
1322 struct ifnet *ifp = ifa->ifa_ifp;
1323 struct in6_ifaddr *ia = (struct in6_ifaddr *) ifa;
1324 char ip6buf[INET6_ADDRSTRLEN];
1325 struct in6_multi_mship *imm;
1326
1327 /* stop DAD processing */
1328 nd6_dad_stop(ifa);

--- 27 unchanged lines hidden (view full) ---

1356 LIST_REMOVE(imm, i6mm_chain);
1357 in6_leavegroup(imm);
1358 }
1359
1360 in6_unlink_ifa(ia, ifp);
1361}
1362
1363static void
1374in6_unlink_ifa(ia, ifp)
1375 struct in6_ifaddr *ia;
1376 struct ifnet *ifp;
1364in6_unlink_ifa(struct in6_ifaddr *ia, struct ifnet *ifp)
1377{
1378 struct in6_ifaddr *oia;
1379 int s = splnet();
1380
1381 TAILQ_REMOVE(&ifp->if_addrlist, &ia->ia_ifa, ifa_list);
1382
1383 oia = ia;
1384 if (oia == (ia = in6_ifaddr))

--- 36 unchanged lines hidden (view full) ---

1421 * Note that we should decrement the refcnt at least once for all *BSD.
1422 */
1423 IFAFREE(&oia->ia_ifa);
1424
1425 splx(s);
1426}
1427
1428void
1365{
1366 struct in6_ifaddr *oia;
1367 int s = splnet();
1368
1369 TAILQ_REMOVE(&ifp->if_addrlist, &ia->ia_ifa, ifa_list);
1370
1371 oia = ia;
1372 if (oia == (ia = in6_ifaddr))

--- 36 unchanged lines hidden (view full) ---

1409 * Note that we should decrement the refcnt at least once for all *BSD.
1410 */
1411 IFAFREE(&oia->ia_ifa);
1412
1413 splx(s);
1414}
1415
1416void
1429in6_purgeif(ifp)
1430 struct ifnet *ifp;
1417in6_purgeif(struct ifnet *ifp)
1431{
1432 struct ifaddr *ifa, *nifa;
1433
1434 for (ifa = TAILQ_FIRST(&ifp->if_addrlist); ifa != NULL; ifa = nifa) {
1435 nifa = TAILQ_NEXT(ifa, ifa_list);
1436 if (ifa->ifa_addr->sa_family != AF_INET6)
1437 continue;
1438 in6_purgeaddr(ifa);

--- 21 unchanged lines hidden (view full) ---

1460 *
1461 * NOTE: SIOCALIFADDR(with IFLR_PREFIX set) allows prefixlen less than 64.
1462 * this is to accomodate address naming scheme other than RFC2374,
1463 * in the future.
1464 * RFC2373 defines interface id to be 64bit, but it allows non-RFC2374
1465 * address encoding scheme. (see figure on page 8)
1466 */
1467static int
1418{
1419 struct ifaddr *ifa, *nifa;
1420
1421 for (ifa = TAILQ_FIRST(&ifp->if_addrlist); ifa != NULL; ifa = nifa) {
1422 nifa = TAILQ_NEXT(ifa, ifa_list);
1423 if (ifa->ifa_addr->sa_family != AF_INET6)
1424 continue;
1425 in6_purgeaddr(ifa);

--- 21 unchanged lines hidden (view full) ---

1447 *
1448 * NOTE: SIOCALIFADDR(with IFLR_PREFIX set) allows prefixlen less than 64.
1449 * this is to accomodate address naming scheme other than RFC2374,
1450 * in the future.
1451 * RFC2373 defines interface id to be 64bit, but it allows non-RFC2374
1452 * address encoding scheme. (see figure on page 8)
1453 */
1454static int
1468in6_lifaddr_ioctl(so, cmd, data, ifp, td)
1469 struct socket *so;
1470 u_long cmd;
1471 caddr_t data;
1472 struct ifnet *ifp;
1473 struct thread *td;
1455in6_lifaddr_ioctl(struct socket *so, u_long cmd, caddr_t data,
1456 struct ifnet *ifp, struct thread *td)
1474{
1475 struct if_laddrreq *iflr = (struct if_laddrreq *)data;
1476 struct ifaddr *ifa;
1477 struct sockaddr *sa;
1478
1479 /* sanity checks */
1480 if (!data || !ifp) {
1481 panic("invalid argument to in6_lifaddr_ioctl");

--- 216 unchanged lines hidden (view full) ---

1698 return EOPNOTSUPP; /* just for safety */
1699}
1700
1701/*
1702 * Initialize an interface's intetnet6 address
1703 * and routing table entry.
1704 */
1705static int
1457{
1458 struct if_laddrreq *iflr = (struct if_laddrreq *)data;
1459 struct ifaddr *ifa;
1460 struct sockaddr *sa;
1461
1462 /* sanity checks */
1463 if (!data || !ifp) {
1464 panic("invalid argument to in6_lifaddr_ioctl");

--- 216 unchanged lines hidden (view full) ---

1681 return EOPNOTSUPP; /* just for safety */
1682}
1683
1684/*
1685 * Initialize an interface's intetnet6 address
1686 * and routing table entry.
1687 */
1688static int
1706in6_ifinit(ifp, ia, sin6, newhost)
1707 struct ifnet *ifp;
1708 struct in6_ifaddr *ia;
1709 struct sockaddr_in6 *sin6;
1710 int newhost;
1689in6_ifinit(struct ifnet *ifp, struct in6_ifaddr *ia,
1690 struct sockaddr_in6 *sin6, int newhost)
1711{
1712 int error = 0, plen, ifacount = 0;
1713 int s = splimp();
1714 struct ifaddr *ifa;
1715
1716 /*
1717 * Give the interface a chance to initialize
1718 * if this is its first address,

--- 87 unchanged lines hidden (view full) ---

1806 /* Add ownaddr as loopback rtentry, if necessary (ex. on p2p link). */
1807 if (newhost)
1808 in6_ifaddloop(&(ia->ia_ifa));
1809
1810 return (error);
1811}
1812
1813struct in6_multi_mship *
1691{
1692 int error = 0, plen, ifacount = 0;
1693 int s = splimp();
1694 struct ifaddr *ifa;
1695
1696 /*
1697 * Give the interface a chance to initialize
1698 * if this is its first address,

--- 87 unchanged lines hidden (view full) ---

1786 /* Add ownaddr as loopback rtentry, if necessary (ex. on p2p link). */
1787 if (newhost)
1788 in6_ifaddloop(&(ia->ia_ifa));
1789
1790 return (error);
1791}
1792
1793struct in6_multi_mship *
1814in6_joingroup(ifp, addr, errorp, delay)
1815 struct ifnet *ifp;
1816 struct in6_addr *addr;
1817 int *errorp;
1818 int delay;
1794in6_joingroup(struct ifnet *ifp, struct in6_addr *addr,
1795 int *errorp, int delay)
1819{
1820 struct in6_multi_mship *imm;
1821
1822 imm = malloc(sizeof(*imm), M_IP6MADDR, M_NOWAIT);
1823 if (!imm) {
1824 *errorp = ENOBUFS;
1825 return NULL;
1826 }
1827 imm->i6mm_maddr = in6_addmulti(addr, ifp, errorp, delay);
1828 if (!imm->i6mm_maddr) {
1829 /* *errorp is alrady set */
1830 free(imm, M_IP6MADDR);
1831 return NULL;
1832 }
1833 return imm;
1834}
1835
1836int
1796{
1797 struct in6_multi_mship *imm;
1798
1799 imm = malloc(sizeof(*imm), M_IP6MADDR, M_NOWAIT);
1800 if (!imm) {
1801 *errorp = ENOBUFS;
1802 return NULL;
1803 }
1804 imm->i6mm_maddr = in6_addmulti(addr, ifp, errorp, delay);
1805 if (!imm->i6mm_maddr) {
1806 /* *errorp is alrady set */
1807 free(imm, M_IP6MADDR);
1808 return NULL;
1809 }
1810 return imm;
1811}
1812
1813int
1837in6_leavegroup(imm)
1838 struct in6_multi_mship *imm;
1814in6_leavegroup(struct in6_multi_mship *imm)
1839{
1840
1841 if (imm->i6mm_maddr)
1842 in6_delmulti(imm->i6mm_maddr);
1843 free(imm, M_IP6MADDR);
1844 return 0;
1845}
1846
1847/*
1848 * Find an IPv6 interface link-local address specific to an interface.
1849 */
1850struct in6_ifaddr *
1815{
1816
1817 if (imm->i6mm_maddr)
1818 in6_delmulti(imm->i6mm_maddr);
1819 free(imm, M_IP6MADDR);
1820 return 0;
1821}
1822
1823/*
1824 * Find an IPv6 interface link-local address specific to an interface.
1825 */
1826struct in6_ifaddr *
1851in6ifa_ifpforlinklocal(ifp, ignoreflags)
1852 struct ifnet *ifp;
1853 int ignoreflags;
1827in6ifa_ifpforlinklocal(struct ifnet *ifp, int ignoreflags)
1854{
1855 struct ifaddr *ifa;
1856
1857 TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
1858 if (ifa->ifa_addr->sa_family != AF_INET6)
1859 continue;
1860 if (IN6_IS_ADDR_LINKLOCAL(IFA_IN6(ifa))) {
1861 if ((((struct in6_ifaddr *)ifa)->ia6_flags &

--- 6 unchanged lines hidden (view full) ---

1868 return ((struct in6_ifaddr *)ifa);
1869}
1870
1871
1872/*
1873 * find the internet address corresponding to a given interface and address.
1874 */
1875struct in6_ifaddr *
1828{
1829 struct ifaddr *ifa;
1830
1831 TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
1832 if (ifa->ifa_addr->sa_family != AF_INET6)
1833 continue;
1834 if (IN6_IS_ADDR_LINKLOCAL(IFA_IN6(ifa))) {
1835 if ((((struct in6_ifaddr *)ifa)->ia6_flags &

--- 6 unchanged lines hidden (view full) ---

1842 return ((struct in6_ifaddr *)ifa);
1843}
1844
1845
1846/*
1847 * find the internet address corresponding to a given interface and address.
1848 */
1849struct in6_ifaddr *
1876in6ifa_ifpwithaddr(ifp, addr)
1877 struct ifnet *ifp;
1878 struct in6_addr *addr;
1850in6ifa_ifpwithaddr(struct ifnet *ifp, struct in6_addr *addr)
1879{
1880 struct ifaddr *ifa;
1881
1882 TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
1883 if (ifa->ifa_addr->sa_family != AF_INET6)
1884 continue;
1885 if (IN6_ARE_ADDR_EQUAL(addr, IFA_IN6(ifa)))
1886 break;

--- 63 unchanged lines hidden (view full) ---

1950 *cp++ = ':';
1951 a++;
1952 }
1953 *--cp = '\0';
1954 return (ip6buf);
1955}
1956
1957int
1851{
1852 struct ifaddr *ifa;
1853
1854 TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
1855 if (ifa->ifa_addr->sa_family != AF_INET6)
1856 continue;
1857 if (IN6_ARE_ADDR_EQUAL(addr, IFA_IN6(ifa)))
1858 break;

--- 63 unchanged lines hidden (view full) ---

1922 *cp++ = ':';
1923 a++;
1924 }
1925 *--cp = '\0';
1926 return (ip6buf);
1927}
1928
1929int
1958in6_localaddr(in6)
1959 struct in6_addr *in6;
1930in6_localaddr(struct in6_addr *in6)
1960{
1961 struct in6_ifaddr *ia;
1962
1963 if (IN6_IS_ADDR_LOOPBACK(in6) || IN6_IS_ADDR_LINKLOCAL(in6))
1964 return 1;
1965
1966 for (ia = in6_ifaddr; ia; ia = ia->ia_next) {
1967 if (IN6_ARE_MASKED_ADDR_EQUAL(in6, &ia->ia_addr.sin6_addr,
1968 &ia->ia_prefixmask.sin6_addr)) {
1969 return 1;
1970 }
1971 }
1972
1973 return (0);
1974}
1975
1976int
1931{
1932 struct in6_ifaddr *ia;
1933
1934 if (IN6_IS_ADDR_LOOPBACK(in6) || IN6_IS_ADDR_LINKLOCAL(in6))
1935 return 1;
1936
1937 for (ia = in6_ifaddr; ia; ia = ia->ia_next) {
1938 if (IN6_ARE_MASKED_ADDR_EQUAL(in6, &ia->ia_addr.sin6_addr,
1939 &ia->ia_prefixmask.sin6_addr)) {
1940 return 1;
1941 }
1942 }
1943
1944 return (0);
1945}
1946
1947int
1977in6_is_addr_deprecated(sa6)
1978 struct sockaddr_in6 *sa6;
1948in6_is_addr_deprecated(struct sockaddr_in6 *sa6)
1979{
1980 struct in6_ifaddr *ia;
1981
1982 for (ia = in6_ifaddr; ia; ia = ia->ia_next) {
1983 if (IN6_ARE_ADDR_EQUAL(&ia->ia_addr.sin6_addr,
1984 &sa6->sin6_addr) &&
1985 (ia->ia6_flags & IN6_IFF_DEPRECATED) != 0)
1986 return (1); /* true */

--- 4 unchanged lines hidden (view full) ---

1991 return (0); /* false */
1992}
1993
1994/*
1995 * return length of part which dst and src are equal
1996 * hard coding...
1997 */
1998int
1949{
1950 struct in6_ifaddr *ia;
1951
1952 for (ia = in6_ifaddr; ia; ia = ia->ia_next) {
1953 if (IN6_ARE_ADDR_EQUAL(&ia->ia_addr.sin6_addr,
1954 &sa6->sin6_addr) &&
1955 (ia->ia6_flags & IN6_IFF_DEPRECATED) != 0)
1956 return (1); /* true */

--- 4 unchanged lines hidden (view full) ---

1961 return (0); /* false */
1962}
1963
1964/*
1965 * return length of part which dst and src are equal
1966 * hard coding...
1967 */
1968int
1999in6_matchlen(src, dst)
2000struct in6_addr *src, *dst;
1969in6_matchlen(struct in6_addr *src, struct in6_addr *dst)
2001{
2002 int match = 0;
2003 u_char *s = (u_char *)src, *d = (u_char *)dst;
2004 u_char *lim = s + 16, r;
2005
2006 while (s < lim)
2007 if ((r = (*d++ ^ *s++)) != 0) {
2008 while (r < 128) {
2009 match++;
2010 r <<= 1;
2011 }
2012 break;
2013 } else
2014 match += 8;
2015 return match;
2016}
2017
2018/* XXX: to be scope conscious */
2019int
1970{
1971 int match = 0;
1972 u_char *s = (u_char *)src, *d = (u_char *)dst;
1973 u_char *lim = s + 16, r;
1974
1975 while (s < lim)
1976 if ((r = (*d++ ^ *s++)) != 0) {
1977 while (r < 128) {
1978 match++;
1979 r <<= 1;
1980 }
1981 break;
1982 } else
1983 match += 8;
1984 return match;
1985}
1986
1987/* XXX: to be scope conscious */
1988int
2020in6_are_prefix_equal(p1, p2, len)
2021 struct in6_addr *p1, *p2;
2022 int len;
1989in6_are_prefix_equal(struct in6_addr *p1, struct in6_addr *p2, int len)
2023{
2024 int bytelen, bitlen;
2025
2026 /* sanity check */
2027 if (0 > len || len > 128) {
2028 log(LOG_ERR, "in6_are_prefix_equal: invalid prefix length(%d)\n",
2029 len);
2030 return (0);

--- 8 unchanged lines hidden (view full) ---

2039 p1->s6_addr[bytelen] >> (8 - bitlen) !=
2040 p2->s6_addr[bytelen] >> (8 - bitlen))
2041 return (0);
2042
2043 return (1);
2044}
2045
2046void
1990{
1991 int bytelen, bitlen;
1992
1993 /* sanity check */
1994 if (0 > len || len > 128) {
1995 log(LOG_ERR, "in6_are_prefix_equal: invalid prefix length(%d)\n",
1996 len);
1997 return (0);

--- 8 unchanged lines hidden (view full) ---

2006 p1->s6_addr[bytelen] >> (8 - bitlen) !=
2007 p2->s6_addr[bytelen] >> (8 - bitlen))
2008 return (0);
2009
2010 return (1);
2011}
2012
2013void
2047in6_prefixlen2mask(maskp, len)
2048 struct in6_addr *maskp;
2049 int len;
2014in6_prefixlen2mask(struct in6_addr *maskp, int len)
2050{
2051 u_char maskarray[8] = {0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff};
2052 int bytelen, bitlen, i;
2053
2054 /* sanity check */
2055 if (0 > len || len > 128) {
2056 log(LOG_ERR, "in6_prefixlen2mask: invalid prefix length(%d)\n",
2057 len);

--- 9 unchanged lines hidden (view full) ---

2067 maskp->s6_addr[bytelen] = maskarray[bitlen - 1];
2068}
2069
2070/*
2071 * return the best address out of the same scope. if no address was
2072 * found, return the first valid address from designated IF.
2073 */
2074struct in6_ifaddr *
2015{
2016 u_char maskarray[8] = {0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff};
2017 int bytelen, bitlen, i;
2018
2019 /* sanity check */
2020 if (0 > len || len > 128) {
2021 log(LOG_ERR, "in6_prefixlen2mask: invalid prefix length(%d)\n",
2022 len);

--- 9 unchanged lines hidden (view full) ---

2032 maskp->s6_addr[bytelen] = maskarray[bitlen - 1];
2033}
2034
2035/*
2036 * return the best address out of the same scope. if no address was
2037 * found, return the first valid address from designated IF.
2038 */
2039struct in6_ifaddr *
2075in6_ifawithifp(ifp, dst)
2076 struct ifnet *ifp;
2077 struct in6_addr *dst;
2040in6_ifawithifp(struct ifnet *ifp, struct in6_addr *dst)
2078{
2079 int dst_scope = in6_addrscope(dst), blen = -1, tlen;
2080 struct ifaddr *ifa;
2081 struct in6_ifaddr *besta = 0;
2082 struct in6_ifaddr *dep[2]; /* last-resort: deprecated */
2083
2084 dep[0] = dep[1] = NULL;
2085

--- 63 unchanged lines hidden (view full) ---

2149
2150 return NULL;
2151}
2152
2153/*
2154 * perform DAD when interface becomes IFF_UP.
2155 */
2156void
2041{
2042 int dst_scope = in6_addrscope(dst), blen = -1, tlen;
2043 struct ifaddr *ifa;
2044 struct in6_ifaddr *besta = 0;
2045 struct in6_ifaddr *dep[2]; /* last-resort: deprecated */
2046
2047 dep[0] = dep[1] = NULL;
2048

--- 63 unchanged lines hidden (view full) ---

2112
2113 return NULL;
2114}
2115
2116/*
2117 * perform DAD when interface becomes IFF_UP.
2118 */
2119void
2157in6_if_up(ifp)
2158 struct ifnet *ifp;
2120in6_if_up(struct ifnet *ifp)
2159{
2160 struct ifaddr *ifa;
2161 struct in6_ifaddr *ia;
2162
2163 TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
2164 if (ifa->ifa_addr->sa_family != AF_INET6)
2165 continue;
2166 ia = (struct in6_ifaddr *)ifa;

--- 11 unchanged lines hidden (view full) ---

2178
2179 /*
2180 * special cases, like 6to4, are handled in in6_ifattach
2181 */
2182 in6_ifattach(ifp, NULL);
2183}
2184
2185int
2121{
2122 struct ifaddr *ifa;
2123 struct in6_ifaddr *ia;
2124
2125 TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
2126 if (ifa->ifa_addr->sa_family != AF_INET6)
2127 continue;
2128 ia = (struct in6_ifaddr *)ifa;

--- 11 unchanged lines hidden (view full) ---

2140
2141 /*
2142 * special cases, like 6to4, are handled in in6_ifattach
2143 */
2144 in6_ifattach(ifp, NULL);
2145}
2146
2147int
2186in6if_do_dad(ifp)
2187 struct ifnet *ifp;
2148in6if_do_dad(struct ifnet *ifp)
2188{
2189 if ((ifp->if_flags & IFF_LOOPBACK) != 0)
2190 return (0);
2191
2192 switch (ifp->if_type) {
2193#ifdef IFT_DUMMY
2194 case IFT_DUMMY:
2195#endif

--- 23 unchanged lines hidden (view full) ---

2219 }
2220}
2221
2222/*
2223 * Calculate max IPv6 MTU through all the interfaces and store it
2224 * to in6_maxmtu.
2225 */
2226void
2149{
2150 if ((ifp->if_flags & IFF_LOOPBACK) != 0)
2151 return (0);
2152
2153 switch (ifp->if_type) {
2154#ifdef IFT_DUMMY
2155 case IFT_DUMMY:
2156#endif

--- 23 unchanged lines hidden (view full) ---

2180 }
2181}
2182
2183/*
2184 * Calculate max IPv6 MTU through all the interfaces and store it
2185 * to in6_maxmtu.
2186 */
2187void
2227in6_setmaxmtu()
2188in6_setmaxmtu(void)
2228{
2229 unsigned long maxmtu = 0;
2230 struct ifnet *ifp;
2231
2232 IFNET_RLOCK();
2233 for (ifp = TAILQ_FIRST(&ifnet); ifp; ifp = TAILQ_NEXT(ifp, if_list)) {
2234 /* this function can be called during ifnet initialization */
2235 if (!ifp->if_afdata[AF_INET6])

--- 11 unchanged lines hidden (view full) ---

2247 * Provide the length of interface identifiers to be used for the link attached
2248 * to the given interface. The length should be defined in "IPv6 over
2249 * xxx-link" document. Note that address architecture might also define
2250 * the length for a particular set of address prefixes, regardless of the
2251 * link type. As clarified in rfc2462bis, those two definitions should be
2252 * consistent, and those really are as of August 2004.
2253 */
2254int
2189{
2190 unsigned long maxmtu = 0;
2191 struct ifnet *ifp;
2192
2193 IFNET_RLOCK();
2194 for (ifp = TAILQ_FIRST(&ifnet); ifp; ifp = TAILQ_NEXT(ifp, if_list)) {
2195 /* this function can be called during ifnet initialization */
2196 if (!ifp->if_afdata[AF_INET6])

--- 11 unchanged lines hidden (view full) ---

2208 * Provide the length of interface identifiers to be used for the link attached
2209 * to the given interface. The length should be defined in "IPv6 over
2210 * xxx-link" document. Note that address architecture might also define
2211 * the length for a particular set of address prefixes, regardless of the
2212 * link type. As clarified in rfc2462bis, those two definitions should be
2213 * consistent, and those really are as of August 2004.
2214 */
2215int
2255in6_if2idlen(ifp)
2256 struct ifnet *ifp;
2216in6_if2idlen(struct ifnet *ifp)
2257{
2258 switch (ifp->if_type) {
2259 case IFT_ETHER: /* RFC2464 */
2260#ifdef IFT_PROPVIRTUAL
2261 case IFT_PROPVIRTUAL: /* XXX: no RFC. treat it as ether */
2262#endif
2263#ifdef IFT_L2VLAN
2264 case IFT_L2VLAN: /* ditto */

--- 34 unchanged lines hidden (view full) ---

2299 * indicating the "unknown" case.
2300 */
2301 printf("in6_if2idlen: unknown link type (%d)\n", ifp->if_type);
2302 return (64);
2303 }
2304}
2305
2306void *
2217{
2218 switch (ifp->if_type) {
2219 case IFT_ETHER: /* RFC2464 */
2220#ifdef IFT_PROPVIRTUAL
2221 case IFT_PROPVIRTUAL: /* XXX: no RFC. treat it as ether */
2222#endif
2223#ifdef IFT_L2VLAN
2224 case IFT_L2VLAN: /* ditto */

--- 34 unchanged lines hidden (view full) ---

2259 * indicating the "unknown" case.
2260 */
2261 printf("in6_if2idlen: unknown link type (%d)\n", ifp->if_type);
2262 return (64);
2263 }
2264}
2265
2266void *
2307in6_domifattach(ifp)
2308 struct ifnet *ifp;
2267in6_domifattach(struct ifnet *ifp)
2309{
2310 struct in6_ifextra *ext;
2311
2312 ext = (struct in6_ifextra *)malloc(sizeof(*ext), M_IFADDR, M_WAITOK);
2313 bzero(ext, sizeof(*ext));
2314
2315 ext->in6_ifstat = (struct in6_ifstat *)malloc(sizeof(struct in6_ifstat),
2316 M_IFADDR, M_WAITOK);

--- 5 unchanged lines hidden (view full) ---

2322 bzero(ext->icmp6_ifstat, sizeof(*ext->icmp6_ifstat));
2323
2324 ext->nd_ifinfo = nd6_ifattach(ifp);
2325 ext->scope6_id = scope6_ifattach(ifp);
2326 return ext;
2327}
2328
2329void
2268{
2269 struct in6_ifextra *ext;
2270
2271 ext = (struct in6_ifextra *)malloc(sizeof(*ext), M_IFADDR, M_WAITOK);
2272 bzero(ext, sizeof(*ext));
2273
2274 ext->in6_ifstat = (struct in6_ifstat *)malloc(sizeof(struct in6_ifstat),
2275 M_IFADDR, M_WAITOK);

--- 5 unchanged lines hidden (view full) ---

2281 bzero(ext->icmp6_ifstat, sizeof(*ext->icmp6_ifstat));
2282
2283 ext->nd_ifinfo = nd6_ifattach(ifp);
2284 ext->scope6_id = scope6_ifattach(ifp);
2285 return ext;
2286}
2287
2288void
2330in6_domifdetach(ifp, aux)
2331 struct ifnet *ifp;
2332 void *aux;
2289in6_domifdetach(struct ifnet *ifp, void *aux)
2333{
2334 struct in6_ifextra *ext = (struct in6_ifextra *)aux;
2335
2336 scope6_ifdetach(ext->scope6_id);
2337 nd6_ifdetach(ext->nd_ifinfo);
2338 free(ext->in6_ifstat, M_IFADDR);
2339 free(ext->icmp6_ifstat, M_IFADDR);
2340 free(ext, M_IFADDR);
2341}
2342
2343/*
2344 * Convert sockaddr_in6 to sockaddr_in. Original sockaddr_in6 must be
2345 * v4 mapped addr or v4 compat addr
2346 */
2347void
2348in6_sin6_2_sin(struct sockaddr_in *sin, struct sockaddr_in6 *sin6)
2349{
2290{
2291 struct in6_ifextra *ext = (struct in6_ifextra *)aux;
2292
2293 scope6_ifdetach(ext->scope6_id);
2294 nd6_ifdetach(ext->nd_ifinfo);
2295 free(ext->in6_ifstat, M_IFADDR);
2296 free(ext->icmp6_ifstat, M_IFADDR);
2297 free(ext, M_IFADDR);
2298}
2299
2300/*
2301 * Convert sockaddr_in6 to sockaddr_in. Original sockaddr_in6 must be
2302 * v4 mapped addr or v4 compat addr
2303 */
2304void
2305in6_sin6_2_sin(struct sockaddr_in *sin, struct sockaddr_in6 *sin6)
2306{
2307
2350 bzero(sin, sizeof(*sin));
2351 sin->sin_len = sizeof(struct sockaddr_in);
2352 sin->sin_family = AF_INET;
2353 sin->sin_port = sin6->sin6_port;
2354 sin->sin_addr.s_addr = sin6->sin6_addr.s6_addr32[3];
2355}
2356
2357/* Convert sockaddr_in to sockaddr_in6 in v4 mapped addr format. */

--- 43 unchanged lines hidden ---
2308 bzero(sin, sizeof(*sin));
2309 sin->sin_len = sizeof(struct sockaddr_in);
2310 sin->sin_family = AF_INET;
2311 sin->sin_port = sin6->sin6_port;
2312 sin->sin_addr.s_addr = sin6->sin6_addr.s6_addr32[3];
2313}
2314
2315/* Convert sockaddr_in to sockaddr_in6 in v4 mapped addr format. */

--- 43 unchanged lines hidden ---