Deleted Added
full compact
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 ---