Linux Audio

Check our new training course

Loading...
v3.1
  1#include <linux/ieee80211.h>
 
  2#include <net/cfg80211.h>
  3#include "nl80211.h"
  4#include "core.h"
  5
  6/* Default values, timeouts in ms */
  7#define MESH_TTL 		31
  8#define MESH_DEFAULT_ELEMENT_TTL 31
  9#define MESH_MAX_RETR	 	3
 10#define MESH_RET_T 		100
 11#define MESH_CONF_T 		100
 12#define MESH_HOLD_T 		100
 13
 14#define MESH_PATH_TIMEOUT	5000
 
 15
 16/*
 17 * Minimum interval between two consecutive PREQs originated by the same
 18 * interface
 19 */
 20#define MESH_PREQ_MIN_INT	10
 
 21#define MESH_DIAM_TRAVERSAL_TIME 50
 22
 
 
 23/*
 24 * A path will be refreshed if it is used PATH_REFRESH_TIME milliseconds
 25 * before timing out.  This way it will remain ACTIVE and no data frames
 26 * will be unnecessarily held in the pending queue.
 27 */
 28#define MESH_PATH_REFRESH_TIME			1000
 29#define MESH_MIN_DISCOVERY_TIMEOUT (2 * MESH_DIAM_TRAVERSAL_TIME)
 30
 31/* Default maximum number of established plinks per interface */
 32#define MESH_MAX_ESTAB_PLINKS	32
 33
 34#define MESH_MAX_PREQ_RETRIES	4
 35
 
 36
 37const struct mesh_config default_mesh_config = {
 38	.dot11MeshRetryTimeout = MESH_RET_T,
 39	.dot11MeshConfirmTimeout = MESH_CONF_T,
 40	.dot11MeshHoldingTimeout = MESH_HOLD_T,
 41	.dot11MeshMaxRetries = MESH_MAX_RETR,
 42	.dot11MeshTTL = MESH_TTL,
 43	.element_ttl = MESH_DEFAULT_ELEMENT_TTL,
 44	.auto_open_plinks = true,
 45	.dot11MeshMaxPeerLinks = MESH_MAX_ESTAB_PLINKS,
 
 46	.dot11MeshHWMPactivePathTimeout = MESH_PATH_TIMEOUT,
 47	.dot11MeshHWMPpreqMinInterval = MESH_PREQ_MIN_INT,
 
 48	.dot11MeshHWMPnetDiameterTraversalTime = MESH_DIAM_TRAVERSAL_TIME,
 49	.dot11MeshHWMPmaxPREQretries = MESH_MAX_PREQ_RETRIES,
 50	.path_refresh_time = MESH_PATH_REFRESH_TIME,
 51	.min_discovery_timeout = MESH_MIN_DISCOVERY_TIMEOUT,
 
 
 
 
 
 52};
 53
 54const struct mesh_setup default_mesh_setup = {
 
 55	.path_sel_proto = IEEE80211_PATH_PROTOCOL_HWMP,
 56	.path_metric = IEEE80211_PATH_METRIC_AIRTIME,
 57	.ie = NULL,
 58	.ie_len = 0,
 59	.is_secure = false,
 60};
 61
 62int __cfg80211_join_mesh(struct cfg80211_registered_device *rdev,
 63			 struct net_device *dev,
 64			 const struct mesh_setup *setup,
 65			 const struct mesh_config *conf)
 66{
 67	struct wireless_dev *wdev = dev->ieee80211_ptr;
 68	int err;
 69
 70	BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN != IEEE80211_MAX_MESH_ID_LEN);
 71
 72	ASSERT_WDEV_LOCK(wdev);
 73
 74	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
 75		return -EOPNOTSUPP;
 76
 77	if (!(rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) &&
 78	      setup->is_secure)
 79		return -EOPNOTSUPP;
 80
 81	if (wdev->mesh_id_len)
 82		return -EALREADY;
 83
 84	if (!setup->mesh_id_len)
 85		return -EINVAL;
 86
 87	if (!rdev->ops->join_mesh)
 88		return -EOPNOTSUPP;
 89
 90	err = rdev->ops->join_mesh(&rdev->wiphy, dev, conf, setup);
 91	if (!err) {
 92		memcpy(wdev->ssid, setup->mesh_id, setup->mesh_id_len);
 93		wdev->mesh_id_len = setup->mesh_id_len;
 94	}
 95
 96	return err;
 97}
 98
 99int cfg80211_join_mesh(struct cfg80211_registered_device *rdev,
100		       struct net_device *dev,
101		       const struct mesh_setup *setup,
102		       const struct mesh_config *conf)
103{
104	struct wireless_dev *wdev = dev->ieee80211_ptr;
105	int err;
106
107	wdev_lock(wdev);
108	err = __cfg80211_join_mesh(rdev, dev, setup, conf);
109	wdev_unlock(wdev);
110
111	return err;
112}
113
114void cfg80211_notify_new_peer_candidate(struct net_device *dev,
115		const u8 *macaddr, const u8* ie, u8 ie_len, gfp_t gfp)
116{
117	struct wireless_dev *wdev = dev->ieee80211_ptr;
118
119	if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT))
120		return;
121
122	nl80211_send_new_peer_candidate(wiphy_to_dev(wdev->wiphy), dev,
123			macaddr, ie, ie_len, gfp);
124}
125EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate);
126
127static int __cfg80211_leave_mesh(struct cfg80211_registered_device *rdev,
128				 struct net_device *dev)
129{
130	struct wireless_dev *wdev = dev->ieee80211_ptr;
131	int err;
132
133	ASSERT_WDEV_LOCK(wdev);
134
135	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
136		return -EOPNOTSUPP;
137
138	if (!rdev->ops->leave_mesh)
139		return -EOPNOTSUPP;
140
141	if (!wdev->mesh_id_len)
142		return -ENOTCONN;
143
144	err = rdev->ops->leave_mesh(&rdev->wiphy, dev);
145	if (!err)
146		wdev->mesh_id_len = 0;
147	return err;
148}
149
150int cfg80211_leave_mesh(struct cfg80211_registered_device *rdev,
151			struct net_device *dev)
152{
153	struct wireless_dev *wdev = dev->ieee80211_ptr;
154	int err;
155
156	wdev_lock(wdev);
157	err = __cfg80211_leave_mesh(rdev, dev);
158	wdev_unlock(wdev);
159
160	return err;
161}
v3.5.6
  1#include <linux/ieee80211.h>
  2#include <linux/export.h>
  3#include <net/cfg80211.h>
  4#include "nl80211.h"
  5#include "core.h"
  6
  7/* Default values, timeouts in ms */
  8#define MESH_TTL 		31
  9#define MESH_DEFAULT_ELEMENT_TTL 31
 10#define MESH_MAX_RETR	 	3
 11#define MESH_RET_T 		100
 12#define MESH_CONF_T 		100
 13#define MESH_HOLD_T 		100
 14
 15#define MESH_PATH_TIMEOUT	5000
 16#define MESH_RANN_INTERVAL      5000
 17
 18/*
 19 * Minimum interval between two consecutive PREQs originated by the same
 20 * interface
 21 */
 22#define MESH_PREQ_MIN_INT	10
 23#define MESH_PERR_MIN_INT	100
 24#define MESH_DIAM_TRAVERSAL_TIME 50
 25
 26#define MESH_RSSI_THRESHOLD	0
 27
 28/*
 29 * A path will be refreshed if it is used PATH_REFRESH_TIME milliseconds
 30 * before timing out.  This way it will remain ACTIVE and no data frames
 31 * will be unnecessarily held in the pending queue.
 32 */
 33#define MESH_PATH_REFRESH_TIME			1000
 34#define MESH_MIN_DISCOVERY_TIMEOUT (2 * MESH_DIAM_TRAVERSAL_TIME)
 35
 36/* Default maximum number of established plinks per interface */
 37#define MESH_MAX_ESTAB_PLINKS	32
 38
 39#define MESH_MAX_PREQ_RETRIES	4
 40
 41#define MESH_SYNC_NEIGHBOR_OFFSET_MAX 50
 42
 43const struct mesh_config default_mesh_config = {
 44	.dot11MeshRetryTimeout = MESH_RET_T,
 45	.dot11MeshConfirmTimeout = MESH_CONF_T,
 46	.dot11MeshHoldingTimeout = MESH_HOLD_T,
 47	.dot11MeshMaxRetries = MESH_MAX_RETR,
 48	.dot11MeshTTL = MESH_TTL,
 49	.element_ttl = MESH_DEFAULT_ELEMENT_TTL,
 50	.auto_open_plinks = true,
 51	.dot11MeshMaxPeerLinks = MESH_MAX_ESTAB_PLINKS,
 52	.dot11MeshNbrOffsetMaxNeighbor = MESH_SYNC_NEIGHBOR_OFFSET_MAX,
 53	.dot11MeshHWMPactivePathTimeout = MESH_PATH_TIMEOUT,
 54	.dot11MeshHWMPpreqMinInterval = MESH_PREQ_MIN_INT,
 55	.dot11MeshHWMPperrMinInterval = MESH_PERR_MIN_INT,
 56	.dot11MeshHWMPnetDiameterTraversalTime = MESH_DIAM_TRAVERSAL_TIME,
 57	.dot11MeshHWMPmaxPREQretries = MESH_MAX_PREQ_RETRIES,
 58	.path_refresh_time = MESH_PATH_REFRESH_TIME,
 59	.min_discovery_timeout = MESH_MIN_DISCOVERY_TIMEOUT,
 60	.dot11MeshHWMPRannInterval = MESH_RANN_INTERVAL,
 61	.dot11MeshGateAnnouncementProtocol = false,
 62	.dot11MeshForwarding = true,
 63	.rssi_threshold = MESH_RSSI_THRESHOLD,
 64	.ht_opmode = IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED,
 65};
 66
 67const struct mesh_setup default_mesh_setup = {
 68	.sync_method = IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET,
 69	.path_sel_proto = IEEE80211_PATH_PROTOCOL_HWMP,
 70	.path_metric = IEEE80211_PATH_METRIC_AIRTIME,
 71	.ie = NULL,
 72	.ie_len = 0,
 73	.is_secure = false,
 74};
 75
 76int __cfg80211_join_mesh(struct cfg80211_registered_device *rdev,
 77			 struct net_device *dev,
 78			 const struct mesh_setup *setup,
 79			 const struct mesh_config *conf)
 80{
 81	struct wireless_dev *wdev = dev->ieee80211_ptr;
 82	int err;
 83
 84	BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN != IEEE80211_MAX_MESH_ID_LEN);
 85
 86	ASSERT_WDEV_LOCK(wdev);
 87
 88	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
 89		return -EOPNOTSUPP;
 90
 91	if (!(rdev->wiphy.flags & WIPHY_FLAG_MESH_AUTH) &&
 92	      setup->is_secure)
 93		return -EOPNOTSUPP;
 94
 95	if (wdev->mesh_id_len)
 96		return -EALREADY;
 97
 98	if (!setup->mesh_id_len)
 99		return -EINVAL;
100
101	if (!rdev->ops->join_mesh)
102		return -EOPNOTSUPP;
103
104	err = rdev->ops->join_mesh(&rdev->wiphy, dev, conf, setup);
105	if (!err) {
106		memcpy(wdev->ssid, setup->mesh_id, setup->mesh_id_len);
107		wdev->mesh_id_len = setup->mesh_id_len;
108	}
109
110	return err;
111}
112
113int cfg80211_join_mesh(struct cfg80211_registered_device *rdev,
114		       struct net_device *dev,
115		       const struct mesh_setup *setup,
116		       const struct mesh_config *conf)
117{
118	struct wireless_dev *wdev = dev->ieee80211_ptr;
119	int err;
120
121	wdev_lock(wdev);
122	err = __cfg80211_join_mesh(rdev, dev, setup, conf);
123	wdev_unlock(wdev);
124
125	return err;
126}
127
128void cfg80211_notify_new_peer_candidate(struct net_device *dev,
129		const u8 *macaddr, const u8* ie, u8 ie_len, gfp_t gfp)
130{
131	struct wireless_dev *wdev = dev->ieee80211_ptr;
132
133	if (WARN_ON(wdev->iftype != NL80211_IFTYPE_MESH_POINT))
134		return;
135
136	nl80211_send_new_peer_candidate(wiphy_to_dev(wdev->wiphy), dev,
137			macaddr, ie, ie_len, gfp);
138}
139EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate);
140
141static int __cfg80211_leave_mesh(struct cfg80211_registered_device *rdev,
142				 struct net_device *dev)
143{
144	struct wireless_dev *wdev = dev->ieee80211_ptr;
145	int err;
146
147	ASSERT_WDEV_LOCK(wdev);
148
149	if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_MESH_POINT)
150		return -EOPNOTSUPP;
151
152	if (!rdev->ops->leave_mesh)
153		return -EOPNOTSUPP;
154
155	if (!wdev->mesh_id_len)
156		return -ENOTCONN;
157
158	err = rdev->ops->leave_mesh(&rdev->wiphy, dev);
159	if (!err)
160		wdev->mesh_id_len = 0;
161	return err;
162}
163
164int cfg80211_leave_mesh(struct cfg80211_registered_device *rdev,
165			struct net_device *dev)
166{
167	struct wireless_dev *wdev = dev->ieee80211_ptr;
168	int err;
169
170	wdev_lock(wdev);
171	err = __cfg80211_leave_mesh(rdev, dev);
172	wdev_unlock(wdev);
173
174	return err;
175}