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 --- |