ieee80211_mesh.c (232625) | ieee80211_mesh.c (234874) |
---|---|
1/*- 2 * Copyright (c) 2009 The FreeBSD Foundation 3 * All rights reserved. 4 * 5 * This software was developed by Rui Paulo under sponsorship from the 6 * FreeBSD Foundation. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 14 unchanged lines hidden (view full) --- 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29#include <sys/cdefs.h> 30#ifdef __FreeBSD__ | 1/*- 2 * Copyright (c) 2009 The FreeBSD Foundation 3 * All rights reserved. 4 * 5 * This software was developed by Rui Paulo under sponsorship from the 6 * FreeBSD Foundation. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 14 unchanged lines hidden (view full) --- 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29#include <sys/cdefs.h> 30#ifdef __FreeBSD__ |
31__FBSDID("$FreeBSD: head/sys/net80211/ieee80211_mesh.c 232625 2012-03-06 21:20:16Z adrian $"); | 31__FBSDID("$FreeBSD: head/sys/net80211/ieee80211_mesh.c 234874 2012-05-01 15:35:10Z monthadar $"); |
32#endif 33 34/* 35 * IEEE 802.11s Mesh Point (MBSS) support. 36 * 37 * Based on March 2009, D3.0 802.11s draft spec. 38 */ 39#include "opt_inet.h" --- 385 unchanged lines hidden (view full) --- 425 */ 426 ieee80211_mesh_retrytimeout = msecs_to_ticks(40); 427 ieee80211_mesh_holdingtimeout = msecs_to_ticks(40); 428 ieee80211_mesh_confirmtimeout = msecs_to_ticks(40); 429 430 /* 431 * Register action frame handlers. 432 */ | 32#endif 33 34/* 35 * IEEE 802.11s Mesh Point (MBSS) support. 36 * 37 * Based on March 2009, D3.0 802.11s draft spec. 38 */ 39#include "opt_inet.h" --- 385 unchanged lines hidden (view full) --- 425 */ 426 ieee80211_mesh_retrytimeout = msecs_to_ticks(40); 427 ieee80211_mesh_holdingtimeout = msecs_to_ticks(40); 428 ieee80211_mesh_confirmtimeout = msecs_to_ticks(40); 429 430 /* 431 * Register action frame handlers. 432 */ |
433 ieee80211_recv_action_register(IEEE80211_ACTION_CAT_MESHPEERING, | 433 ieee80211_recv_action_register(IEEE80211_ACTION_CAT_SELF_PROT, |
434 IEEE80211_ACTION_MESHPEERING_OPEN, 435 mesh_recv_action_meshpeering_open); | 434 IEEE80211_ACTION_MESHPEERING_OPEN, 435 mesh_recv_action_meshpeering_open); |
436 ieee80211_recv_action_register(IEEE80211_ACTION_CAT_MESHPEERING, | 436 ieee80211_recv_action_register(IEEE80211_ACTION_CAT_SELF_PROT, |
437 IEEE80211_ACTION_MESHPEERING_CONFIRM, 438 mesh_recv_action_meshpeering_confirm); | 437 IEEE80211_ACTION_MESHPEERING_CONFIRM, 438 mesh_recv_action_meshpeering_confirm); |
439 ieee80211_recv_action_register(IEEE80211_ACTION_CAT_MESHPEERING, | 439 ieee80211_recv_action_register(IEEE80211_ACTION_CAT_SELF_PROT, |
440 IEEE80211_ACTION_MESHPEERING_CLOSE, 441 mesh_recv_action_meshpeering_close); 442 ieee80211_recv_action_register(IEEE80211_ACTION_CAT_MESH, 443 IEEE80211_ACTION_MESH_LMETRIC, mesh_recv_action_meshlmetric); 444 | 440 IEEE80211_ACTION_MESHPEERING_CLOSE, 441 mesh_recv_action_meshpeering_close); 442 ieee80211_recv_action_register(IEEE80211_ACTION_CAT_MESH, 443 IEEE80211_ACTION_MESH_LMETRIC, mesh_recv_action_meshlmetric); 444 |
445 ieee80211_send_action_register(IEEE80211_ACTION_CAT_MESHPEERING, | 445 ieee80211_send_action_register(IEEE80211_ACTION_CAT_SELF_PROT, |
446 IEEE80211_ACTION_MESHPEERING_OPEN, 447 mesh_send_action_meshpeering_open); | 446 IEEE80211_ACTION_MESHPEERING_OPEN, 447 mesh_send_action_meshpeering_open); |
448 ieee80211_send_action_register(IEEE80211_ACTION_CAT_MESHPEERING, | 448 ieee80211_send_action_register(IEEE80211_ACTION_CAT_SELF_PROT, |
449 IEEE80211_ACTION_MESHPEERING_CONFIRM, 450 mesh_send_action_meshpeering_confirm); | 449 IEEE80211_ACTION_MESHPEERING_CONFIRM, 450 mesh_send_action_meshpeering_confirm); |
451 ieee80211_send_action_register(IEEE80211_ACTION_CAT_MESHPEERING, | 451 ieee80211_send_action_register(IEEE80211_ACTION_CAT_SELF_PROT, |
452 IEEE80211_ACTION_MESHPEERING_CLOSE, 453 mesh_send_action_meshpeering_close); 454 ieee80211_send_action_register(IEEE80211_ACTION_CAT_MESH, 455 IEEE80211_ACTION_MESH_LMETRIC, 456 mesh_send_action_meshlmetric); 457 458 /* 459 * Register Airtime Link Metric. --- 20 unchanged lines hidden (view full) --- 480 struct ieee80211com *ic = ni->ni_ic; 481 uint16_t args[3]; 482 483 if (ni->ni_mlstate == IEEE80211_NODE_MESH_ESTABLISHED) { 484 args[0] = ni->ni_mlpid; 485 args[1] = ni->ni_mllid; 486 args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; 487 ieee80211_send_action(ni, | 452 IEEE80211_ACTION_MESHPEERING_CLOSE, 453 mesh_send_action_meshpeering_close); 454 ieee80211_send_action_register(IEEE80211_ACTION_CAT_MESH, 455 IEEE80211_ACTION_MESH_LMETRIC, 456 mesh_send_action_meshlmetric); 457 458 /* 459 * Register Airtime Link Metric. --- 20 unchanged lines hidden (view full) --- 480 struct ieee80211com *ic = ni->ni_ic; 481 uint16_t args[3]; 482 483 if (ni->ni_mlstate == IEEE80211_NODE_MESH_ESTABLISHED) { 484 args[0] = ni->ni_mlpid; 485 args[1] = ni->ni_mllid; 486 args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; 487 ieee80211_send_action(ni, |
488 IEEE80211_ACTION_CAT_MESHPEERING, | 488 IEEE80211_ACTION_CAT_SELF_PROT, |
489 IEEE80211_ACTION_MESHPEERING_CLOSE, 490 args); 491 } 492 callout_drain(&ni->ni_mltimer); 493 /* XXX belongs in hwmp */ 494 ieee80211_ageq_drain_node(&ic->ic_stageq, 495 (void *)(uintptr_t) ieee80211_mac_hash(ic, ni->ni_macaddr)); 496} --- 938 unchanged lines hidden (view full) --- 1435 uint16_t args[1]; 1436 1437 ni->ni_mlpid = mesh_generateid(vap); 1438 if (ni->ni_mlpid == 0) 1439 return; 1440 mesh_linkchange(ni, IEEE80211_NODE_MESH_OPENSNT); 1441 args[0] = ni->ni_mlpid; 1442 ieee80211_send_action(ni, | 489 IEEE80211_ACTION_MESHPEERING_CLOSE, 490 args); 491 } 492 callout_drain(&ni->ni_mltimer); 493 /* XXX belongs in hwmp */ 494 ieee80211_ageq_drain_node(&ic->ic_stageq, 495 (void *)(uintptr_t) ieee80211_mac_hash(ic, ni->ni_macaddr)); 496} --- 938 unchanged lines hidden (view full) --- 1435 uint16_t args[1]; 1436 1437 ni->ni_mlpid = mesh_generateid(vap); 1438 if (ni->ni_mlpid == 0) 1439 return; 1440 mesh_linkchange(ni, IEEE80211_NODE_MESH_OPENSNT); 1441 args[0] = ni->ni_mlpid; 1442 ieee80211_send_action(ni, |
1443 IEEE80211_ACTION_CAT_MESHPEERING, | 1443 IEEE80211_ACTION_CAT_SELF_PROT, |
1444 IEEE80211_ACTION_MESHPEERING_OPEN, args); 1445 ni->ni_mlrcnt = 0; 1446 mesh_peer_timeout_setup(ni); 1447 } 1448 break; 1449 } 1450 case IEEE80211_FC0_SUBTYPE_PROBE_REQ: 1451 { --- 145 unchanged lines hidden (view full) --- 1597 meshconf = frm; 1598 break; 1599 case IEEE80211_ELEMID_MESHPEER: 1600 meshpeer = frm; 1601 mpie = (const struct ieee80211_meshpeer_ie *) frm; 1602 memset(mp, 0, sizeof(*mp)); 1603 mp->peer_llinkid = LE_READ_2(&mpie->peer_llinkid); 1604 /* NB: peer link ID is optional on these frames */ | 1444 IEEE80211_ACTION_MESHPEERING_OPEN, args); 1445 ni->ni_mlrcnt = 0; 1446 mesh_peer_timeout_setup(ni); 1447 } 1448 break; 1449 } 1450 case IEEE80211_FC0_SUBTYPE_PROBE_REQ: 1451 { --- 145 unchanged lines hidden (view full) --- 1597 meshconf = frm; 1598 break; 1599 case IEEE80211_ELEMID_MESHPEER: 1600 meshpeer = frm; 1601 mpie = (const struct ieee80211_meshpeer_ie *) frm; 1602 memset(mp, 0, sizeof(*mp)); 1603 mp->peer_llinkid = LE_READ_2(&mpie->peer_llinkid); 1604 /* NB: peer link ID is optional on these frames */ |
1605 if (subtype == IEEE80211_MESH_PEER_LINK_CLOSE && | 1605 if (subtype == IEEE80211_ACTION_MESHPEERING_CLOSE && |
1606 mpie->peer_len == 8) { 1607 mp->peer_linkid = 0; 1608 mp->peer_rcode = LE_READ_2(&mpie->peer_linkid); 1609 } else { 1610 mp->peer_linkid = LE_READ_2(&mpie->peer_linkid); 1611 mp->peer_rcode = LE_READ_2(&mpie->peer_rcode); 1612 } 1613 break; --- 27 unchanged lines hidden (view full) --- 1641 break; 1642 case IEEE80211_NODE_MESH_OPENSNT: 1643 case IEEE80211_NODE_MESH_OPENRCV: 1644 case IEEE80211_NODE_MESH_CONFIRMRCV: 1645 args[0] = ni->ni_mlpid; 1646 args[1] = ni->ni_mllid; 1647 args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; 1648 ieee80211_send_action(ni, | 1606 mpie->peer_len == 8) { 1607 mp->peer_linkid = 0; 1608 mp->peer_rcode = LE_READ_2(&mpie->peer_linkid); 1609 } else { 1610 mp->peer_linkid = LE_READ_2(&mpie->peer_linkid); 1611 mp->peer_rcode = LE_READ_2(&mpie->peer_rcode); 1612 } 1613 break; --- 27 unchanged lines hidden (view full) --- 1641 break; 1642 case IEEE80211_NODE_MESH_OPENSNT: 1643 case IEEE80211_NODE_MESH_OPENRCV: 1644 case IEEE80211_NODE_MESH_CONFIRMRCV: 1645 args[0] = ni->ni_mlpid; 1646 args[1] = ni->ni_mllid; 1647 args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; 1648 ieee80211_send_action(ni, |
1649 IEEE80211_ACTION_CAT_MESHPEERING, | 1649 IEEE80211_ACTION_CAT_SELF_PROT, |
1650 IEEE80211_ACTION_MESHPEERING_CLOSE, 1651 args); 1652 mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); 1653 mesh_peer_timeout_setup(ni); 1654 break; 1655 } 1656 return NULL; 1657 } --- 26 unchanged lines hidden (view full) --- 1684 mesh_linkchange(ni, IEEE80211_NODE_MESH_OPENRCV); 1685 ni->ni_mllid = meshpeer->peer_llinkid; 1686 ni->ni_mlpid = mesh_generateid(vap); 1687 if (ni->ni_mlpid == 0) 1688 return 0; /* XXX */ 1689 args[0] = ni->ni_mlpid; 1690 /* Announce we're open too... */ 1691 ieee80211_send_action(ni, | 1650 IEEE80211_ACTION_MESHPEERING_CLOSE, 1651 args); 1652 mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); 1653 mesh_peer_timeout_setup(ni); 1654 break; 1655 } 1656 return NULL; 1657 } --- 26 unchanged lines hidden (view full) --- 1684 mesh_linkchange(ni, IEEE80211_NODE_MESH_OPENRCV); 1685 ni->ni_mllid = meshpeer->peer_llinkid; 1686 ni->ni_mlpid = mesh_generateid(vap); 1687 if (ni->ni_mlpid == 0) 1688 return 0; /* XXX */ 1689 args[0] = ni->ni_mlpid; 1690 /* Announce we're open too... */ 1691 ieee80211_send_action(ni, |
1692 IEEE80211_ACTION_CAT_MESHPEERING, | 1692 IEEE80211_ACTION_CAT_SELF_PROT, |
1693 IEEE80211_ACTION_MESHPEERING_OPEN, args); 1694 /* ...and confirm the link. */ 1695 args[0] = ni->ni_mlpid; 1696 args[1] = ni->ni_mllid; 1697 ieee80211_send_action(ni, | 1693 IEEE80211_ACTION_MESHPEERING_OPEN, args); 1694 /* ...and confirm the link. */ 1695 args[0] = ni->ni_mlpid; 1696 args[1] = ni->ni_mllid; 1697 ieee80211_send_action(ni, |
1698 IEEE80211_ACTION_CAT_MESHPEERING, | 1698 IEEE80211_ACTION_CAT_SELF_PROT, |
1699 IEEE80211_ACTION_MESHPEERING_CONFIRM, 1700 args); 1701 mesh_peer_timeout_setup(ni); 1702 break; 1703 case IEEE80211_NODE_MESH_OPENRCV: 1704 /* Wrong Link ID */ 1705 if (ni->ni_mllid != meshpeer->peer_llinkid) { 1706 args[0] = ni->ni_mllid; 1707 args[1] = ni->ni_mlpid; 1708 args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; 1709 ieee80211_send_action(ni, | 1699 IEEE80211_ACTION_MESHPEERING_CONFIRM, 1700 args); 1701 mesh_peer_timeout_setup(ni); 1702 break; 1703 case IEEE80211_NODE_MESH_OPENRCV: 1704 /* Wrong Link ID */ 1705 if (ni->ni_mllid != meshpeer->peer_llinkid) { 1706 args[0] = ni->ni_mllid; 1707 args[1] = ni->ni_mlpid; 1708 args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; 1709 ieee80211_send_action(ni, |
1710 IEEE80211_ACTION_CAT_MESHPEERING, | 1710 IEEE80211_ACTION_CAT_SELF_PROT, |
1711 IEEE80211_ACTION_MESHPEERING_CLOSE, 1712 args); 1713 mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); 1714 mesh_peer_timeout_setup(ni); 1715 break; 1716 } 1717 /* Duplicate open, confirm again. */ 1718 args[0] = ni->ni_mlpid; 1719 args[1] = ni->ni_mllid; 1720 ieee80211_send_action(ni, | 1711 IEEE80211_ACTION_MESHPEERING_CLOSE, 1712 args); 1713 mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); 1714 mesh_peer_timeout_setup(ni); 1715 break; 1716 } 1717 /* Duplicate open, confirm again. */ 1718 args[0] = ni->ni_mlpid; 1719 args[1] = ni->ni_mllid; 1720 ieee80211_send_action(ni, |
1721 IEEE80211_ACTION_CAT_MESHPEERING, | 1721 IEEE80211_ACTION_CAT_SELF_PROT, |
1722 IEEE80211_ACTION_MESHPEERING_CONFIRM, 1723 args); 1724 break; 1725 case IEEE80211_NODE_MESH_OPENSNT: 1726 ni->ni_mllid = meshpeer->peer_llinkid; 1727 mesh_linkchange(ni, IEEE80211_NODE_MESH_OPENRCV); 1728 args[0] = ni->ni_mlpid; 1729 args[1] = ni->ni_mllid; 1730 ieee80211_send_action(ni, | 1722 IEEE80211_ACTION_MESHPEERING_CONFIRM, 1723 args); 1724 break; 1725 case IEEE80211_NODE_MESH_OPENSNT: 1726 ni->ni_mllid = meshpeer->peer_llinkid; 1727 mesh_linkchange(ni, IEEE80211_NODE_MESH_OPENRCV); 1728 args[0] = ni->ni_mlpid; 1729 args[1] = ni->ni_mllid; 1730 ieee80211_send_action(ni, |
1731 IEEE80211_ACTION_CAT_MESHPEERING, | 1731 IEEE80211_ACTION_CAT_SELF_PROT, |
1732 IEEE80211_ACTION_MESHPEERING_CONFIRM, 1733 args); 1734 /* NB: don't setup/clear any timeout */ 1735 break; 1736 case IEEE80211_NODE_MESH_CONFIRMRCV: 1737 if (ni->ni_mlpid != meshpeer->peer_linkid || 1738 ni->ni_mllid != meshpeer->peer_llinkid) { 1739 args[0] = ni->ni_mlpid; 1740 args[1] = ni->ni_mllid; 1741 args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; 1742 ieee80211_send_action(ni, | 1732 IEEE80211_ACTION_MESHPEERING_CONFIRM, 1733 args); 1734 /* NB: don't setup/clear any timeout */ 1735 break; 1736 case IEEE80211_NODE_MESH_CONFIRMRCV: 1737 if (ni->ni_mlpid != meshpeer->peer_linkid || 1738 ni->ni_mllid != meshpeer->peer_llinkid) { 1739 args[0] = ni->ni_mlpid; 1740 args[1] = ni->ni_mllid; 1741 args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; 1742 ieee80211_send_action(ni, |
1743 IEEE80211_ACTION_CAT_MESHPEERING, | 1743 IEEE80211_ACTION_CAT_SELF_PROT, |
1744 IEEE80211_ACTION_MESHPEERING_CLOSE, 1745 args); 1746 mesh_linkchange(ni, 1747 IEEE80211_NODE_MESH_HOLDING); 1748 mesh_peer_timeout_setup(ni); 1749 break; 1750 } 1751 mesh_linkchange(ni, IEEE80211_NODE_MESH_ESTABLISHED); 1752 ni->ni_mllid = meshpeer->peer_llinkid; 1753 args[0] = ni->ni_mlpid; 1754 args[1] = ni->ni_mllid; 1755 ieee80211_send_action(ni, | 1744 IEEE80211_ACTION_MESHPEERING_CLOSE, 1745 args); 1746 mesh_linkchange(ni, 1747 IEEE80211_NODE_MESH_HOLDING); 1748 mesh_peer_timeout_setup(ni); 1749 break; 1750 } 1751 mesh_linkchange(ni, IEEE80211_NODE_MESH_ESTABLISHED); 1752 ni->ni_mllid = meshpeer->peer_llinkid; 1753 args[0] = ni->ni_mlpid; 1754 args[1] = ni->ni_mllid; 1755 ieee80211_send_action(ni, |
1756 IEEE80211_ACTION_CAT_MESHPEERING, | 1756 IEEE80211_ACTION_CAT_SELF_PROT, |
1757 IEEE80211_ACTION_MESHPEERING_CONFIRM, 1758 args); 1759 mesh_peer_timeout_stop(ni); 1760 break; 1761 case IEEE80211_NODE_MESH_ESTABLISHED: 1762 if (ni->ni_mllid != meshpeer->peer_llinkid) { 1763 args[0] = ni->ni_mllid; 1764 args[1] = ni->ni_mlpid; 1765 args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; 1766 ieee80211_send_action(ni, | 1757 IEEE80211_ACTION_MESHPEERING_CONFIRM, 1758 args); 1759 mesh_peer_timeout_stop(ni); 1760 break; 1761 case IEEE80211_NODE_MESH_ESTABLISHED: 1762 if (ni->ni_mllid != meshpeer->peer_llinkid) { 1763 args[0] = ni->ni_mllid; 1764 args[1] = ni->ni_mlpid; 1765 args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; 1766 ieee80211_send_action(ni, |
1767 IEEE80211_ACTION_CAT_MESHPEERING, | 1767 IEEE80211_ACTION_CAT_SELF_PROT, |
1768 IEEE80211_ACTION_MESHPEERING_CLOSE, 1769 args); 1770 mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); 1771 mesh_peer_timeout_setup(ni); 1772 break; 1773 } 1774 args[0] = ni->ni_mlpid; 1775 args[1] = ni->ni_mllid; 1776 ieee80211_send_action(ni, | 1768 IEEE80211_ACTION_MESHPEERING_CLOSE, 1769 args); 1770 mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); 1771 mesh_peer_timeout_setup(ni); 1772 break; 1773 } 1774 args[0] = ni->ni_mlpid; 1775 args[1] = ni->ni_mllid; 1776 ieee80211_send_action(ni, |
1777 IEEE80211_ACTION_CAT_MESHPEERING, | 1777 IEEE80211_ACTION_CAT_SELF_PROT, |
1778 IEEE80211_ACTION_MESHPEERING_CONFIRM, 1779 args); 1780 break; 1781 case IEEE80211_NODE_MESH_HOLDING: 1782 args[0] = ni->ni_mlpid; 1783 args[1] = meshpeer->peer_llinkid; 1784 args[2] = IEEE80211_REASON_MESH_MAX_RETRIES; 1785 ieee80211_send_action(ni, | 1778 IEEE80211_ACTION_MESHPEERING_CONFIRM, 1779 args); 1780 break; 1781 case IEEE80211_NODE_MESH_HOLDING: 1782 args[0] = ni->ni_mlpid; 1783 args[1] = meshpeer->peer_llinkid; 1784 args[2] = IEEE80211_REASON_MESH_MAX_RETRIES; 1785 ieee80211_send_action(ni, |
1786 IEEE80211_ACTION_CAT_MESHPEERING, | 1786 IEEE80211_ACTION_CAT_SELF_PROT, |
1787 IEEE80211_ACTION_MESHPEERING_CLOSE, 1788 args); 1789 break; 1790 } 1791 return 0; 1792} 1793 1794static int --- 25 unchanged lines hidden (view full) --- 1820 case IEEE80211_NODE_MESH_OPENSNT: 1821 mesh_linkchange(ni, IEEE80211_NODE_MESH_CONFIRMRCV); 1822 break; 1823 case IEEE80211_NODE_MESH_HOLDING: 1824 args[0] = ni->ni_mlpid; 1825 args[1] = meshpeer->peer_llinkid; 1826 args[2] = IEEE80211_REASON_MESH_MAX_RETRIES; 1827 ieee80211_send_action(ni, | 1787 IEEE80211_ACTION_MESHPEERING_CLOSE, 1788 args); 1789 break; 1790 } 1791 return 0; 1792} 1793 1794static int --- 25 unchanged lines hidden (view full) --- 1820 case IEEE80211_NODE_MESH_OPENSNT: 1821 mesh_linkchange(ni, IEEE80211_NODE_MESH_CONFIRMRCV); 1822 break; 1823 case IEEE80211_NODE_MESH_HOLDING: 1824 args[0] = ni->ni_mlpid; 1825 args[1] = meshpeer->peer_llinkid; 1826 args[2] = IEEE80211_REASON_MESH_MAX_RETRIES; 1827 ieee80211_send_action(ni, |
1828 IEEE80211_ACTION_CAT_MESHPEERING, | 1828 IEEE80211_ACTION_CAT_SELF_PROT, |
1829 IEEE80211_ACTION_MESHPEERING_CLOSE, 1830 args); 1831 break; 1832 case IEEE80211_NODE_MESH_CONFIRMRCV: 1833 if (ni->ni_mllid != meshpeer->peer_llinkid) { 1834 args[0] = ni->ni_mlpid; 1835 args[1] = ni->ni_mllid; 1836 args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; 1837 ieee80211_send_action(ni, | 1829 IEEE80211_ACTION_MESHPEERING_CLOSE, 1830 args); 1831 break; 1832 case IEEE80211_NODE_MESH_CONFIRMRCV: 1833 if (ni->ni_mllid != meshpeer->peer_llinkid) { 1834 args[0] = ni->ni_mlpid; 1835 args[1] = ni->ni_mllid; 1836 args[2] = IEEE80211_REASON_PEER_LINK_CANCELED; 1837 ieee80211_send_action(ni, |
1838 IEEE80211_ACTION_CAT_MESHPEERING, | 1838 IEEE80211_ACTION_CAT_SELF_PROT, |
1839 IEEE80211_ACTION_MESHPEERING_CLOSE, 1840 args); 1841 mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); 1842 mesh_peer_timeout_setup(ni); 1843 } 1844 break; 1845 default: 1846 IEEE80211_DISCARD(vap, --- 23 unchanged lines hidden (view full) --- 1870 case IEEE80211_NODE_MESH_OPENRCV: 1871 case IEEE80211_NODE_MESH_OPENSNT: 1872 case IEEE80211_NODE_MESH_CONFIRMRCV: 1873 case IEEE80211_NODE_MESH_ESTABLISHED: 1874 args[0] = ni->ni_mlpid; 1875 args[1] = ni->ni_mllid; 1876 args[2] = IEEE80211_REASON_MESH_CLOSE_RCVD; 1877 ieee80211_send_action(ni, | 1839 IEEE80211_ACTION_MESHPEERING_CLOSE, 1840 args); 1841 mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); 1842 mesh_peer_timeout_setup(ni); 1843 } 1844 break; 1845 default: 1846 IEEE80211_DISCARD(vap, --- 23 unchanged lines hidden (view full) --- 1870 case IEEE80211_NODE_MESH_OPENRCV: 1871 case IEEE80211_NODE_MESH_OPENSNT: 1872 case IEEE80211_NODE_MESH_CONFIRMRCV: 1873 case IEEE80211_NODE_MESH_ESTABLISHED: 1874 args[0] = ni->ni_mlpid; 1875 args[1] = ni->ni_mllid; 1876 args[2] = IEEE80211_REASON_MESH_CLOSE_RCVD; 1877 ieee80211_send_action(ni, |
1878 IEEE80211_ACTION_CAT_MESHPEERING, | 1878 IEEE80211_ACTION_CAT_SELF_PROT, |
1879 IEEE80211_ACTION_MESHPEERING_CLOSE, 1880 args); 1881 mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); 1882 mesh_peer_timeout_setup(ni); 1883 break; 1884 case IEEE80211_NODE_MESH_HOLDING: 1885 mesh_linkchange(ni, IEEE80211_NODE_MESH_IDLE); 1886 mesh_peer_timeout_setup(ni); --- 99 unchanged lines hidden (view full) --- 1986 *frm++ = category; 1987 *frm++ = action; 1988 ADDSHORT(frm, ieee80211_getcapinfo(vap, ni->ni_chan)); 1989 rs = ieee80211_get_suprates(ic, ic->ic_curchan); 1990 frm = ieee80211_add_rates(frm, rs); 1991 frm = ieee80211_add_xrates(frm, rs); 1992 frm = ieee80211_add_meshid(frm, vap); 1993 frm = ieee80211_add_meshconf(frm, vap); | 1879 IEEE80211_ACTION_MESHPEERING_CLOSE, 1880 args); 1881 mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); 1882 mesh_peer_timeout_setup(ni); 1883 break; 1884 case IEEE80211_NODE_MESH_HOLDING: 1885 mesh_linkchange(ni, IEEE80211_NODE_MESH_IDLE); 1886 mesh_peer_timeout_setup(ni); --- 99 unchanged lines hidden (view full) --- 1986 *frm++ = category; 1987 *frm++ = action; 1988 ADDSHORT(frm, ieee80211_getcapinfo(vap, ni->ni_chan)); 1989 rs = ieee80211_get_suprates(ic, ic->ic_curchan); 1990 frm = ieee80211_add_rates(frm, rs); 1991 frm = ieee80211_add_xrates(frm, rs); 1992 frm = ieee80211_add_meshid(frm, vap); 1993 frm = ieee80211_add_meshconf(frm, vap); |
1994 frm = ieee80211_add_meshpeer(frm, IEEE80211_MESH_PEER_LINK_OPEN, | 1994 frm = ieee80211_add_meshpeer(frm, IEEE80211_ACTION_MESHPEERING_OPEN, |
1995 args[0], 0, 0); 1996 m->m_pkthdr.len = m->m_len = frm - mtod(m, uint8_t *); 1997 return mesh_send_action(ni, m); 1998 } else { 1999 vap->iv_stats.is_tx_nobuf++; 2000 ieee80211_free_node(ni); 2001 return ENOMEM; 2002 } --- 51 unchanged lines hidden (view full) --- 2054 ADDSHORT(frm, 0); /* status code */ 2055 ADDSHORT(frm, args[1]); /* AID */ 2056 rs = ieee80211_get_suprates(ic, ic->ic_curchan); 2057 frm = ieee80211_add_rates(frm, rs); 2058 frm = ieee80211_add_xrates(frm, rs); 2059 frm = ieee80211_add_meshid(frm, vap); 2060 frm = ieee80211_add_meshconf(frm, vap); 2061 frm = ieee80211_add_meshpeer(frm, | 1995 args[0], 0, 0); 1996 m->m_pkthdr.len = m->m_len = frm - mtod(m, uint8_t *); 1997 return mesh_send_action(ni, m); 1998 } else { 1999 vap->iv_stats.is_tx_nobuf++; 2000 ieee80211_free_node(ni); 2001 return ENOMEM; 2002 } --- 51 unchanged lines hidden (view full) --- 2054 ADDSHORT(frm, 0); /* status code */ 2055 ADDSHORT(frm, args[1]); /* AID */ 2056 rs = ieee80211_get_suprates(ic, ic->ic_curchan); 2057 frm = ieee80211_add_rates(frm, rs); 2058 frm = ieee80211_add_xrates(frm, rs); 2059 frm = ieee80211_add_meshid(frm, vap); 2060 frm = ieee80211_add_meshconf(frm, vap); 2061 frm = ieee80211_add_meshpeer(frm, |
2062 IEEE80211_MESH_PEER_LINK_CONFIRM, | 2062 IEEE80211_ACTION_MESHPEERING_CONFIRM, |
2063 args[0], args[1], 0); 2064 m->m_pkthdr.len = m->m_len = frm - mtod(m, uint8_t *); 2065 return mesh_send_action(ni, m); 2066 } else { 2067 vap->iv_stats.is_tx_nobuf++; 2068 ieee80211_free_node(ni); 2069 return ENOMEM; 2070 } --- 34 unchanged lines hidden (view full) --- 2105 * [tlv] mesh id 2106 * [tlv] mesh peer link mgmt 2107 */ 2108 *frm++ = category; 2109 *frm++ = action; 2110 ADDSHORT(frm, args[2]); /* reason code */ 2111 frm = ieee80211_add_meshid(frm, vap); 2112 frm = ieee80211_add_meshpeer(frm, | 2063 args[0], args[1], 0); 2064 m->m_pkthdr.len = m->m_len = frm - mtod(m, uint8_t *); 2065 return mesh_send_action(ni, m); 2066 } else { 2067 vap->iv_stats.is_tx_nobuf++; 2068 ieee80211_free_node(ni); 2069 return ENOMEM; 2070 } --- 34 unchanged lines hidden (view full) --- 2105 * [tlv] mesh id 2106 * [tlv] mesh peer link mgmt 2107 */ 2108 *frm++ = category; 2109 *frm++ = action; 2110 ADDSHORT(frm, args[2]); /* reason code */ 2111 frm = ieee80211_add_meshid(frm, vap); 2112 frm = ieee80211_add_meshpeer(frm, |
2113 IEEE80211_MESH_PEER_LINK_CLOSE, | 2113 IEEE80211_ACTION_MESHPEERING_CLOSE, |
2114 args[0], args[1], args[2]); 2115 m->m_pkthdr.len = m->m_len = frm - mtod(m, uint8_t *); 2116 return mesh_send_action(ni, m); 2117 } else { 2118 vap->iv_stats.is_tx_nobuf++; 2119 ieee80211_free_node(ni); 2120 return ENOMEM; 2121 } --- 107 unchanged lines hidden (view full) --- 2229 case IEEE80211_NODE_MESH_ESTABLISHED: 2230 break; 2231 case IEEE80211_NODE_MESH_OPENSNT: 2232 case IEEE80211_NODE_MESH_OPENRCV: 2233 if (ni->ni_mlrcnt == ieee80211_mesh_maxretries) { 2234 args[0] = ni->ni_mlpid; 2235 args[2] = IEEE80211_REASON_MESH_MAX_RETRIES; 2236 ieee80211_send_action(ni, | 2114 args[0], args[1], args[2]); 2115 m->m_pkthdr.len = m->m_len = frm - mtod(m, uint8_t *); 2116 return mesh_send_action(ni, m); 2117 } else { 2118 vap->iv_stats.is_tx_nobuf++; 2119 ieee80211_free_node(ni); 2120 return ENOMEM; 2121 } --- 107 unchanged lines hidden (view full) --- 2229 case IEEE80211_NODE_MESH_ESTABLISHED: 2230 break; 2231 case IEEE80211_NODE_MESH_OPENSNT: 2232 case IEEE80211_NODE_MESH_OPENRCV: 2233 if (ni->ni_mlrcnt == ieee80211_mesh_maxretries) { 2234 args[0] = ni->ni_mlpid; 2235 args[2] = IEEE80211_REASON_MESH_MAX_RETRIES; 2236 ieee80211_send_action(ni, |
2237 IEEE80211_ACTION_CAT_MESHPEERING, | 2237 IEEE80211_ACTION_CAT_SELF_PROT, |
2238 IEEE80211_ACTION_MESHPEERING_CLOSE, args); 2239 ni->ni_mlrcnt = 0; 2240 mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); 2241 mesh_peer_timeout_setup(ni); 2242 } else { 2243 args[0] = ni->ni_mlpid; 2244 ieee80211_send_action(ni, | 2238 IEEE80211_ACTION_MESHPEERING_CLOSE, args); 2239 ni->ni_mlrcnt = 0; 2240 mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); 2241 mesh_peer_timeout_setup(ni); 2242 } else { 2243 args[0] = ni->ni_mlpid; 2244 ieee80211_send_action(ni, |
2245 IEEE80211_ACTION_CAT_MESHPEERING, | 2245 IEEE80211_ACTION_CAT_SELF_PROT, |
2246 IEEE80211_ACTION_MESHPEERING_OPEN, args); 2247 ni->ni_mlrcnt++; 2248 mesh_peer_timeout_backoff(ni); 2249 } 2250 break; 2251 case IEEE80211_NODE_MESH_CONFIRMRCV: 2252 if (ni->ni_mlrcnt == ieee80211_mesh_maxretries) { 2253 args[0] = ni->ni_mlpid; 2254 args[2] = IEEE80211_REASON_MESH_CONFIRM_TIMEOUT; 2255 ieee80211_send_action(ni, | 2246 IEEE80211_ACTION_MESHPEERING_OPEN, args); 2247 ni->ni_mlrcnt++; 2248 mesh_peer_timeout_backoff(ni); 2249 } 2250 break; 2251 case IEEE80211_NODE_MESH_CONFIRMRCV: 2252 if (ni->ni_mlrcnt == ieee80211_mesh_maxretries) { 2253 args[0] = ni->ni_mlpid; 2254 args[2] = IEEE80211_REASON_MESH_CONFIRM_TIMEOUT; 2255 ieee80211_send_action(ni, |
2256 IEEE80211_ACTION_CAT_MESHPEERING, | 2256 IEEE80211_ACTION_CAT_SELF_PROT, |
2257 IEEE80211_ACTION_MESHPEERING_CLOSE, args); 2258 ni->ni_mlrcnt = 0; 2259 mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); 2260 mesh_peer_timeout_setup(ni); 2261 } else { 2262 ni->ni_mlrcnt++; 2263 mesh_peer_timeout_setup(ni); 2264 } --- 71 unchanged lines hidden (view full) --- 2336{ 2337 const struct ieee80211_meshpeer_ie *meshpeer = 2338 (const struct ieee80211_meshpeer_ie *) ie; 2339 2340 if (meshpeer == NULL || meshpeer->peer_len < 6 || 2341 meshpeer->peer_len > 10) 2342 return 1; 2343 switch (subtype) { | 2257 IEEE80211_ACTION_MESHPEERING_CLOSE, args); 2258 ni->ni_mlrcnt = 0; 2259 mesh_linkchange(ni, IEEE80211_NODE_MESH_HOLDING); 2260 mesh_peer_timeout_setup(ni); 2261 } else { 2262 ni->ni_mlrcnt++; 2263 mesh_peer_timeout_setup(ni); 2264 } --- 71 unchanged lines hidden (view full) --- 2336{ 2337 const struct ieee80211_meshpeer_ie *meshpeer = 2338 (const struct ieee80211_meshpeer_ie *) ie; 2339 2340 if (meshpeer == NULL || meshpeer->peer_len < 6 || 2341 meshpeer->peer_len > 10) 2342 return 1; 2343 switch (subtype) { |
2344 case IEEE80211_MESH_PEER_LINK_OPEN: | 2344 case IEEE80211_ACTION_MESHPEERING_OPEN: |
2345 if (meshpeer->peer_len != 6) 2346 return 1; 2347 break; | 2345 if (meshpeer->peer_len != 6) 2346 return 1; 2347 break; |
2348 case IEEE80211_MESH_PEER_LINK_CONFIRM: | 2348 case IEEE80211_ACTION_MESHPEERING_CONFIRM: |
2349 if (meshpeer->peer_len != 8) 2350 return 1; 2351 break; | 2349 if (meshpeer->peer_len != 8) 2350 return 1; 2351 break; |
2352 case IEEE80211_MESH_PEER_LINK_CLOSE: | 2352 case IEEE80211_ACTION_MESHPEERING_CLOSE: |
2353 if (meshpeer->peer_len < 8) 2354 return 1; 2355 if (meshpeer->peer_len == 8 && meshpeer->peer_linkid != 0) 2356 return 1; 2357 if (meshpeer->peer_rcode == 0) 2358 return 1; 2359 break; 2360 } --- 59 unchanged lines hidden (view full) --- 2420{ 2421 /* XXX change for AH */ 2422 static const uint8_t meshpeerproto[4] = IEEE80211_MESH_PEER_PROTO; 2423 2424 KASSERT(localid != 0, ("localid == 0")); 2425 2426 *frm++ = IEEE80211_ELEMID_MESHPEER; 2427 switch (subtype) { | 2353 if (meshpeer->peer_len < 8) 2354 return 1; 2355 if (meshpeer->peer_len == 8 && meshpeer->peer_linkid != 0) 2356 return 1; 2357 if (meshpeer->peer_rcode == 0) 2358 return 1; 2359 break; 2360 } --- 59 unchanged lines hidden (view full) --- 2420{ 2421 /* XXX change for AH */ 2422 static const uint8_t meshpeerproto[4] = IEEE80211_MESH_PEER_PROTO; 2423 2424 KASSERT(localid != 0, ("localid == 0")); 2425 2426 *frm++ = IEEE80211_ELEMID_MESHPEER; 2427 switch (subtype) { |
2428 case IEEE80211_MESH_PEER_LINK_OPEN: | 2428 case IEEE80211_ACTION_MESHPEERING_OPEN: |
2429 *frm++ = 6; /* length */ 2430 memcpy(frm, meshpeerproto, 4); 2431 frm += 4; 2432 ADDSHORT(frm, localid); /* local ID */ 2433 break; | 2429 *frm++ = 6; /* length */ 2430 memcpy(frm, meshpeerproto, 4); 2431 frm += 4; 2432 ADDSHORT(frm, localid); /* local ID */ 2433 break; |
2434 case IEEE80211_MESH_PEER_LINK_CONFIRM: | 2434 case IEEE80211_ACTION_MESHPEERING_CONFIRM: |
2435 KASSERT(peerid != 0, ("sending peer confirm without peer id")); 2436 *frm++ = 8; /* length */ 2437 memcpy(frm, meshpeerproto, 4); 2438 frm += 4; 2439 ADDSHORT(frm, localid); /* local ID */ 2440 ADDSHORT(frm, peerid); /* peer ID */ 2441 break; | 2435 KASSERT(peerid != 0, ("sending peer confirm without peer id")); 2436 *frm++ = 8; /* length */ 2437 memcpy(frm, meshpeerproto, 4); 2438 frm += 4; 2439 ADDSHORT(frm, localid); /* local ID */ 2440 ADDSHORT(frm, peerid); /* peer ID */ 2441 break; |
2442 case IEEE80211_MESH_PEER_LINK_CLOSE: | 2442 case IEEE80211_ACTION_MESHPEERING_CLOSE: |
2443 if (peerid) 2444 *frm++ = 10; /* length */ 2445 else 2446 *frm++ = 8; /* length */ 2447 memcpy(frm, meshpeerproto, 4); 2448 frm += 4; 2449 ADDSHORT(frm, localid); /* local ID */ 2450 if (peerid) --- 311 unchanged lines hidden --- | 2443 if (peerid) 2444 *frm++ = 10; /* length */ 2445 else 2446 *frm++ = 8; /* length */ 2447 memcpy(frm, meshpeerproto, 4); 2448 frm += 4; 2449 ADDSHORT(frm, localid); /* local ID */ 2450 if (peerid) --- 311 unchanged lines hidden --- |