1 #include <linux/ieee80211.h>
2 #include <linux/export.h>
3 #include <net/cfg80211.h>
7 /* Default values, timeouts in ms */
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
15 #define MESH_PATH_TIMEOUT 5000
16 #define MESH_RANN_INTERVAL 5000
19 * Minimum interval between two consecutive PREQs originated by the same
22 #define MESH_PREQ_MIN_INT 10
23 #define MESH_PERR_MIN_INT 100
24 #define MESH_DIAM_TRAVERSAL_TIME 50
26 #define MESH_RSSI_THRESHOLD 0
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.
33 #define MESH_PATH_REFRESH_TIME 1000
34 #define MESH_MIN_DISCOVERY_TIMEOUT (2 * MESH_DIAM_TRAVERSAL_TIME)
36 /* Default maximum number of established plinks per interface */
37 #define MESH_MAX_ESTAB_PLINKS 32
39 #define MESH_MAX_PREQ_RETRIES 4
41 #define MESH_SYNC_NEIGHBOR_OFFSET_MAX 50
43 const 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
,
67 const 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
,
76 int __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
)
81 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
84 BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN
!= IEEE80211_MAX_MESH_ID_LEN
);
86 ASSERT_WDEV_LOCK(wdev
);
88 if (dev
->ieee80211_ptr
->iftype
!= NL80211_IFTYPE_MESH_POINT
)
91 if (!(rdev
->wiphy
.flags
& WIPHY_FLAG_MESH_AUTH
) &&
95 if (wdev
->mesh_id_len
)
98 if (!setup
->mesh_id_len
)
101 if (!rdev
->ops
->join_mesh
)
104 err
= rdev
->ops
->join_mesh(&rdev
->wiphy
, dev
, conf
, setup
);
106 memcpy(wdev
->ssid
, setup
->mesh_id
, setup
->mesh_id_len
);
107 wdev
->mesh_id_len
= setup
->mesh_id_len
;
113 int 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
)
118 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
122 err
= __cfg80211_join_mesh(rdev
, dev
, setup
, conf
);
128 void cfg80211_notify_new_peer_candidate(struct net_device
*dev
,
129 const u8
*macaddr
, const u8
* ie
, u8 ie_len
, gfp_t gfp
)
131 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
133 if (WARN_ON(wdev
->iftype
!= NL80211_IFTYPE_MESH_POINT
))
136 nl80211_send_new_peer_candidate(wiphy_to_dev(wdev
->wiphy
), dev
,
137 macaddr
, ie
, ie_len
, gfp
);
139 EXPORT_SYMBOL(cfg80211_notify_new_peer_candidate
);
141 static int __cfg80211_leave_mesh(struct cfg80211_registered_device
*rdev
,
142 struct net_device
*dev
)
144 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
147 ASSERT_WDEV_LOCK(wdev
);
149 if (dev
->ieee80211_ptr
->iftype
!= NL80211_IFTYPE_MESH_POINT
)
152 if (!rdev
->ops
->leave_mesh
)
155 if (!wdev
->mesh_id_len
)
158 err
= rdev
->ops
->leave_mesh(&rdev
->wiphy
, dev
);
160 wdev
->mesh_id_len
= 0;
164 int cfg80211_leave_mesh(struct cfg80211_registered_device
*rdev
,
165 struct net_device
*dev
)
167 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
171 err
= __cfg80211_leave_mesh(rdev
, dev
);