1 #include <linux/ieee80211.h>
2 #include <net/cfg80211.h>
5 /* Default values, timeouts in ms */
7 #define MESH_DEFAULT_ELEMENT_TTL 31
8 #define MESH_MAX_RETR 3
10 #define MESH_CONF_T 100
11 #define MESH_HOLD_T 100
13 #define MESH_PATH_TIMEOUT 5000
16 * Minimum interval between two consecutive PREQs originated by the same
19 #define MESH_PREQ_MIN_INT 10
20 #define MESH_DIAM_TRAVERSAL_TIME 50
23 * A path will be refreshed if it is used PATH_REFRESH_TIME milliseconds
24 * before timing out. This way it will remain ACTIVE and no data frames
25 * will be unnecessarily held in the pending queue.
27 #define MESH_PATH_REFRESH_TIME 1000
28 #define MESH_MIN_DISCOVERY_TIMEOUT (2 * MESH_DIAM_TRAVERSAL_TIME)
30 /* Default maximum number of established plinks per interface */
31 #define MESH_MAX_ESTAB_PLINKS 32
33 #define MESH_MAX_PREQ_RETRIES 4
36 const struct mesh_config default_mesh_config
= {
37 .dot11MeshRetryTimeout
= MESH_RET_T
,
38 .dot11MeshConfirmTimeout
= MESH_CONF_T
,
39 .dot11MeshHoldingTimeout
= MESH_HOLD_T
,
40 .dot11MeshMaxRetries
= MESH_MAX_RETR
,
41 .dot11MeshTTL
= MESH_TTL
,
42 .element_ttl
= MESH_DEFAULT_ELEMENT_TTL
,
43 .auto_open_plinks
= true,
44 .dot11MeshMaxPeerLinks
= MESH_MAX_ESTAB_PLINKS
,
45 .dot11MeshHWMPactivePathTimeout
= MESH_PATH_TIMEOUT
,
46 .dot11MeshHWMPpreqMinInterval
= MESH_PREQ_MIN_INT
,
47 .dot11MeshHWMPnetDiameterTraversalTime
= MESH_DIAM_TRAVERSAL_TIME
,
48 .dot11MeshHWMPmaxPREQretries
= MESH_MAX_PREQ_RETRIES
,
49 .path_refresh_time
= MESH_PATH_REFRESH_TIME
,
50 .min_discovery_timeout
= MESH_MIN_DISCOVERY_TIMEOUT
,
53 const struct mesh_setup default_mesh_setup
= {
54 .path_sel_proto
= IEEE80211_PATH_PROTOCOL_HWMP
,
55 .path_metric
= IEEE80211_PATH_METRIC_AIRTIME
,
60 int __cfg80211_join_mesh(struct cfg80211_registered_device
*rdev
,
61 struct net_device
*dev
,
62 const struct mesh_setup
*setup
,
63 const struct mesh_config
*conf
)
65 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
68 BUILD_BUG_ON(IEEE80211_MAX_SSID_LEN
!= IEEE80211_MAX_MESH_ID_LEN
);
70 ASSERT_WDEV_LOCK(wdev
);
72 if (dev
->ieee80211_ptr
->iftype
!= NL80211_IFTYPE_MESH_POINT
)
75 if (wdev
->mesh_id_len
)
78 if (!setup
->mesh_id_len
)
81 if (!rdev
->ops
->join_mesh
)
84 err
= rdev
->ops
->join_mesh(&rdev
->wiphy
, dev
, conf
, setup
);
86 memcpy(wdev
->ssid
, setup
->mesh_id
, setup
->mesh_id_len
);
87 wdev
->mesh_id_len
= setup
->mesh_id_len
;
93 int cfg80211_join_mesh(struct cfg80211_registered_device
*rdev
,
94 struct net_device
*dev
,
95 const struct mesh_setup
*setup
,
96 const struct mesh_config
*conf
)
98 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
102 err
= __cfg80211_join_mesh(rdev
, dev
, setup
, conf
);
108 static int __cfg80211_leave_mesh(struct cfg80211_registered_device
*rdev
,
109 struct net_device
*dev
)
111 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
114 ASSERT_WDEV_LOCK(wdev
);
116 if (dev
->ieee80211_ptr
->iftype
!= NL80211_IFTYPE_MESH_POINT
)
119 if (!rdev
->ops
->leave_mesh
)
122 if (!wdev
->mesh_id_len
)
125 err
= rdev
->ops
->leave_mesh(&rdev
->wiphy
, dev
);
127 wdev
->mesh_id_len
= 0;
131 int cfg80211_leave_mesh(struct cfg80211_registered_device
*rdev
,
132 struct net_device
*dev
)
134 struct wireless_dev
*wdev
= dev
->ieee80211_ptr
;
138 err
= __cfg80211_leave_mesh(rdev
, dev
);