mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-10-29 17:42:41 +00:00
Compare commits
20 Commits
staging-WI
...
for-4.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d218ba64e3 | ||
|
|
4b31e481ec | ||
|
|
ba10a88ab3 | ||
|
|
b85bc5db9c | ||
|
|
e998711444 | ||
|
|
2d6bea18df | ||
|
|
1bf9e40987 | ||
|
|
a20b96eb31 | ||
|
|
c83ac67492 | ||
|
|
2b0c600fb3 | ||
|
|
c5793bae3a | ||
|
|
6afbb92dec | ||
|
|
89cb9d63bd | ||
|
|
16963c997f | ||
|
|
f7a9ad770d | ||
|
|
dcdccc7ba0 | ||
|
|
b67f97f213 | ||
|
|
e9dcf3d953 | ||
|
|
cc5edd4446 | ||
|
|
79adece623 |
@@ -0,0 +1,46 @@
|
||||
Index: hostapd-2023-09-08-e5ccbfc6/src/ap/wpa_auth_ft.c
|
||||
===================================================================
|
||||
--- hostapd-2023-09-08-e5ccbfc6.orig/src/ap/wpa_auth_ft.c
|
||||
+++ hostapd-2023-09-08-e5ccbfc6/src/ap/wpa_auth_ft.c
|
||||
@@ -3293,6 +3297,8 @@ static int wpa_ft_process_auth_req(struc
|
||||
size_t identity_len = 0, radius_cui_len = 0;
|
||||
size_t pmk_r1_len, kdk_len, len;
|
||||
int retval = WLAN_STATUS_UNSPECIFIED_FAILURE;
|
||||
+ struct os_reltime now;
|
||||
+ struct rsn_ftie *ftie;
|
||||
|
||||
*resp_ies = NULL;
|
||||
*resp_ies_len = 0;
|
||||
@@ -3324,6 +3330,9 @@ static int wpa_ft_process_auth_req(struc
|
||||
goto out;
|
||||
}
|
||||
|
||||
+ ftie = (struct rsn_ftie *) parse.ftie;
|
||||
+ os_memcpy(sm->SNonce, ftie->snonce, WPA_NONCE_LEN);
|
||||
+
|
||||
if (parse.r0kh_id == NULL) {
|
||||
wpa_printf(MSG_DEBUG, "FT: Invalid FTIE - no R0KH-ID");
|
||||
retval = WLAN_STATUS_INVALID_FTIE;
|
||||
@@ -3424,10 +3433,18 @@ pmk_r1_derived:
|
||||
os_memcpy(sm->pmk_r1, pmk_r1, pmk_r1_len);
|
||||
sm->pmk_r1_len = pmk_r1_len;
|
||||
|
||||
- if (random_get_bytes(sm->ANonce, WPA_NONCE_LEN)) {
|
||||
- wpa_printf(MSG_DEBUG, "FT: Failed to get random data for "
|
||||
- "ANonce");
|
||||
- goto out;
|
||||
+ if (os_get_reltime(&now) < 0 ||
|
||||
+ os_reltime_expired(&now, &sm->ANonce_time, 1)) {
|
||||
+ if (random_get_bytes(sm->ANonce, WPA_NONCE_LEN)) {
|
||||
+ wpa_printf(MSG_DEBUG, "FT: Failed to get random data for "
|
||||
+ "ANonce");
|
||||
+ return WLAN_STATUS_UNSPECIFIED_FAILURE;
|
||||
+ }
|
||||
+ sm->ANonce_time.sec = now.sec;
|
||||
+ sm->ANonce_time.usec = now.usec;
|
||||
+ wpa_printf(MSG_INFO, "FT: ANonce was randomized");
|
||||
+ } else {
|
||||
+ wpa_printf(MSG_INFO, "FT: ANonce has not expired");
|
||||
}
|
||||
|
||||
/* Now that we know the correct PMK-R1 length and as such, the length
|
||||
@@ -0,0 +1,27 @@
|
||||
--- a/src/ap/hostapd.c
|
||||
+++ b/src/ap/hostapd.c
|
||||
@@ -1527,19 +1527,15 @@ int hostapd_setup_bss(struct hostapd_dat
|
||||
if (x_snoop_init(hapd)) {
|
||||
wpa_printf(MSG_ERROR,
|
||||
"Generic snooping infrastructure initialization failed");
|
||||
- return -1;
|
||||
- }
|
||||
-
|
||||
- if (dhcp_snoop_init(hapd)) {
|
||||
+ conf->proxy_arp = 0;
|
||||
+ } else if (dhcp_snoop_init(hapd)) {
|
||||
wpa_printf(MSG_ERROR,
|
||||
"DHCP snooping initialization failed");
|
||||
- return -1;
|
||||
- }
|
||||
-
|
||||
- if (ndisc_snoop_init(hapd)) {
|
||||
+ conf->proxy_arp = 0;
|
||||
+ } else if (ndisc_snoop_init(hapd)) {
|
||||
wpa_printf(MSG_ERROR,
|
||||
"Neighbor Discovery snooping initialization failed");
|
||||
- return -1;
|
||||
+ conf->proxy_arp = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,411 @@
|
||||
From: Jouni Malinen <quic_jouni@quicinc.com>
|
||||
Date: Tue, 14 Feb 2023 11:29:30 +0200
|
||||
Subject: [PATCH] FT: Store PMK-R0/PMK-R1 after EAPOL-Key msg 2/4 MIC
|
||||
validation
|
||||
|
||||
hostapd was previously storing the derived PMK-R0 and PMK-R1 as soon as
|
||||
these keys were derived. While that is fine for most purposes, it is
|
||||
unnecessary to do that so quickly and if anything were to fail before
|
||||
the supplicant is able to return a valid EAPOL-Key msg 2/4, there would
|
||||
not really be any real use for the derived keys.
|
||||
|
||||
For the special case of FT-PSK and VLAN determination based on the
|
||||
wpa_psk file, the VLAN information is set in the per-STA data structures
|
||||
only after the EAPOL-Key msg 2/4 MIC has been verified. This ended up
|
||||
storing the PMK-R0/PMK-R1 entries without correct VLAN assignment and as
|
||||
such, any use of the FT protocol would not be able to transfer the VLAN
|
||||
information through RRB.
|
||||
|
||||
Split local storing of the FT key hierarchy for the cases using the FT
|
||||
4-way handshake so that PMK-R0 and PMK-R1 are first derived and then
|
||||
stored as a separate step after having verified the MIC in the EAPOL-Key
|
||||
msg 2/4 (i.e., after having confirmed the per-STA passphrase/PSK was
|
||||
selected) and VLAN update. This fixes VLAN information for the
|
||||
wpa_psk_file cases with FT-PSK.
|
||||
|
||||
Signed-off-by: Jouni Malinen <quic_jouni@quicinc.com>
|
||||
---
|
||||
|
||||
--- a/src/ap/wpa_auth.c
|
||||
+++ b/src/ap/wpa_auth.c
|
||||
@@ -58,7 +58,9 @@ static int wpa_group_config_group_keys(s
|
||||
struct wpa_group *group);
|
||||
static int wpa_derive_ptk(struct wpa_state_machine *sm, const u8 *snonce,
|
||||
const u8 *pmk, unsigned int pmk_len,
|
||||
- struct wpa_ptk *ptk, int force_sha256);
|
||||
+ struct wpa_ptk *ptk, int force_sha256,
|
||||
+ u8 *pmk_r0, u8 *pmk_r1, u8 *pmk_r0_name,
|
||||
+ size_t *key_len);
|
||||
static void wpa_group_free(struct wpa_authenticator *wpa_auth,
|
||||
struct wpa_group *group);
|
||||
static void wpa_group_get(struct wpa_authenticator *wpa_auth,
|
||||
@@ -940,6 +942,10 @@ static int wpa_try_alt_snonce(struct wpa
|
||||
const u8 *pmk = NULL;
|
||||
size_t pmk_len;
|
||||
int vlan_id = 0;
|
||||
+ u8 pmk_r0[PMK_LEN_MAX], pmk_r0_name[WPA_PMK_NAME_LEN];
|
||||
+ u8 pmk_r1[PMK_LEN_MAX];
|
||||
+ size_t key_len;
|
||||
+ int ret = -1;
|
||||
|
||||
os_memset(&PTK, 0, sizeof(PTK));
|
||||
for (;;) {
|
||||
@@ -961,8 +967,8 @@ static int wpa_try_alt_snonce(struct wpa
|
||||
pmk_len = sm->pmk_len;
|
||||
}
|
||||
|
||||
- if (wpa_derive_ptk(sm, sm->alt_SNonce, pmk, pmk_len, &PTK, 0) <
|
||||
- 0)
|
||||
+ if (wpa_derive_ptk(sm, sm->alt_SNonce, pmk, pmk_len, &PTK, 0,
|
||||
+ pmk_r0, pmk_r1, pmk_r0_name, &key_len) < 0)
|
||||
break;
|
||||
|
||||
if (wpa_verify_key_mic(sm->wpa_key_mgmt, pmk_len, &PTK,
|
||||
@@ -983,7 +989,7 @@ static int wpa_try_alt_snonce(struct wpa
|
||||
if (!ok) {
|
||||
wpa_printf(MSG_DEBUG,
|
||||
"WPA: Earlier SNonce did not result in matching MIC");
|
||||
- return -1;
|
||||
+ goto fail;
|
||||
}
|
||||
|
||||
wpa_printf(MSG_DEBUG,
|
||||
@@ -992,14 +998,26 @@ static int wpa_try_alt_snonce(struct wpa
|
||||
|
||||
if (vlan_id && wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt) &&
|
||||
wpa_auth_update_vlan(sm->wpa_auth, sm->addr, vlan_id) < 0)
|
||||
- return -1;
|
||||
+ goto fail;
|
||||
+
|
||||
+#ifdef CONFIG_IEEE80211R_AP
|
||||
+ if (wpa_key_mgmt_ft(sm->wpa_key_mgmt) && !sm->ft_completed) {
|
||||
+ wpa_printf(MSG_DEBUG, "FT: Store PMK-R0/PMK-R1");
|
||||
+ wpa_auth_ft_store_keys(sm, pmk_r0, pmk_r1, pmk_r0_name,
|
||||
+ key_len);
|
||||
+ }
|
||||
+#endif /* CONFIG_IEEE80211R_AP */
|
||||
|
||||
os_memcpy(sm->SNonce, sm->alt_SNonce, WPA_NONCE_LEN);
|
||||
os_memcpy(&sm->PTK, &PTK, sizeof(PTK));
|
||||
forced_memzero(&PTK, sizeof(PTK));
|
||||
sm->PTK_valid = true;
|
||||
|
||||
- return 0;
|
||||
+ ret = 0;
|
||||
+fail:
|
||||
+ forced_memzero(pmk_r0, sizeof(pmk_r0));
|
||||
+ forced_memzero(pmk_r1, sizeof(pmk_r1));
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -2283,7 +2301,9 @@ SM_STATE(WPA_PTK, PTKSTART)
|
||||
|
||||
static int wpa_derive_ptk(struct wpa_state_machine *sm, const u8 *snonce,
|
||||
const u8 *pmk, unsigned int pmk_len,
|
||||
- struct wpa_ptk *ptk, int force_sha256)
|
||||
+ struct wpa_ptk *ptk, int force_sha256,
|
||||
+ u8 *pmk_r0, u8 *pmk_r1, u8 *pmk_r0_name,
|
||||
+ size_t *key_len)
|
||||
{
|
||||
const u8 *z = NULL;
|
||||
size_t z_len = 0, kdk_len;
|
||||
@@ -2311,7 +2331,8 @@ static int wpa_derive_ptk(struct wpa_sta
|
||||
sm->pairwise,
|
||||
kdk_len);
|
||||
}
|
||||
- return wpa_auth_derive_ptk_ft(sm, ptk);
|
||||
+ return wpa_auth_derive_ptk_ft(sm, ptk, pmk_r0, pmk_r1,
|
||||
+ pmk_r0_name, key_len);
|
||||
}
|
||||
#endif /* CONFIG_IEEE80211R_AP */
|
||||
|
||||
@@ -2934,6 +2955,9 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
struct wpa_eapol_ie_parse kde;
|
||||
int vlan_id = 0;
|
||||
int owe_ptk_workaround = !!wpa_auth->conf.owe_ptk_workaround;
|
||||
+ u8 pmk_r0[PMK_LEN_MAX], pmk_r0_name[WPA_PMK_NAME_LEN];
|
||||
+ u8 pmk_r1[PMK_LEN_MAX];
|
||||
+ size_t key_len;
|
||||
|
||||
SM_ENTRY_MA(WPA_PTK, PTKCALCNEGOTIATING, wpa_ptk);
|
||||
sm->EAPOLKeyReceived = false;
|
||||
@@ -2972,7 +2996,8 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
}
|
||||
|
||||
if (wpa_derive_ptk(sm, sm->SNonce, pmk, pmk_len, &PTK,
|
||||
- owe_ptk_workaround == 2) < 0)
|
||||
+ owe_ptk_workaround == 2, pmk_r0, pmk_r1,
|
||||
+ pmk_r0_name, &key_len) < 0)
|
||||
break;
|
||||
|
||||
if (mic_len &&
|
||||
@@ -3021,7 +3046,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
sm->last_rx_eapol_key,
|
||||
sm->last_rx_eapol_key_len);
|
||||
sm->waiting_radius_psk = 1;
|
||||
- return;
|
||||
+ goto out;
|
||||
}
|
||||
|
||||
if (!ok) {
|
||||
@@ -3029,7 +3054,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
"invalid MIC in msg 2/4 of 4-Way Handshake");
|
||||
if (psk_found)
|
||||
wpa_auth_psk_failure_report(sm->wpa_auth, sm->addr);
|
||||
- return;
|
||||
+ goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -3043,12 +3068,12 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
key_data_length = WPA_GET_BE16(mic + mic_len);
|
||||
if (key_data_length > sm->last_rx_eapol_key_len - sizeof(*hdr) -
|
||||
sizeof(*key) - mic_len - 2)
|
||||
- return;
|
||||
+ goto out;
|
||||
|
||||
if (wpa_parse_kde_ies(key_data, key_data_length, &kde) < 0) {
|
||||
wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_INFO,
|
||||
"received EAPOL-Key msg 2/4 with invalid Key Data contents");
|
||||
- return;
|
||||
+ goto out;
|
||||
}
|
||||
if (kde.rsn_ie) {
|
||||
eapol_key_ie = kde.rsn_ie;
|
||||
@@ -3075,7 +3100,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
/* MLME-DEAUTHENTICATE.request */
|
||||
wpa_sta_disconnect(wpa_auth, sm->addr,
|
||||
WLAN_REASON_PREV_AUTH_NOT_VALID);
|
||||
- return;
|
||||
+ goto out;
|
||||
}
|
||||
if ((!sm->rsnxe && kde.rsnxe) ||
|
||||
(sm->rsnxe && !kde.rsnxe) ||
|
||||
@@ -3091,7 +3116,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
/* MLME-DEAUTHENTICATE.request */
|
||||
wpa_sta_disconnect(wpa_auth, sm->addr,
|
||||
WLAN_REASON_PREV_AUTH_NOT_VALID);
|
||||
- return;
|
||||
+ goto out;
|
||||
}
|
||||
#ifdef CONFIG_OCV
|
||||
if (wpa_auth_uses_ocv(sm)) {
|
||||
@@ -3103,14 +3128,14 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
if (wpa_channel_info(wpa_auth, &ci) != 0) {
|
||||
wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
|
||||
"Failed to get channel info to validate received OCI in EAPOL-Key 2/4");
|
||||
- return;
|
||||
+ goto out;
|
||||
}
|
||||
|
||||
if (get_sta_tx_parameters(sm,
|
||||
channel_width_to_int(ci.chanwidth),
|
||||
ci.seg1_idx, &tx_chanwidth,
|
||||
&tx_seg1_idx) < 0)
|
||||
- return;
|
||||
+ goto out;
|
||||
|
||||
res = ocv_verify_tx_params(kde.oci, kde.oci_len, &ci,
|
||||
tx_chanwidth, tx_seg1_idx);
|
||||
@@ -3127,7 +3152,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
OCV_FAILURE "addr=" MACSTR
|
||||
" frame=eapol-key-m2 error=%s",
|
||||
MAC2STR(sm->addr), ocv_errorstr);
|
||||
- return;
|
||||
+ goto out;
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_OCV */
|
||||
@@ -3135,7 +3160,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
if (ft && ft_check_msg_2_of_4(wpa_auth, sm, &kde) < 0) {
|
||||
wpa_sta_disconnect(wpa_auth, sm->addr,
|
||||
WLAN_REASON_PREV_AUTH_NOT_VALID);
|
||||
- return;
|
||||
+ goto out;
|
||||
}
|
||||
#endif /* CONFIG_IEEE80211R_AP */
|
||||
#ifdef CONFIG_P2P
|
||||
@@ -3171,7 +3196,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
"DPP: Peer indicated it supports PFS and local configuration allows this, but PFS was not negotiated for the association");
|
||||
wpa_sta_disconnect(wpa_auth, sm->addr,
|
||||
WLAN_REASON_PREV_AUTH_NOT_VALID);
|
||||
- return;
|
||||
+ goto out;
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_DPP2 */
|
||||
@@ -3191,7 +3216,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
sm->sup_pmk_r1_name, WPA_PMK_NAME_LEN);
|
||||
wpa_hexdump(MSG_DEBUG, "FT: Derived PMKR1Name",
|
||||
sm->pmk_r1_name, WPA_PMK_NAME_LEN);
|
||||
- return;
|
||||
+ goto out;
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_IEEE80211R_AP */
|
||||
@@ -3200,7 +3225,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
wpa_auth_update_vlan(wpa_auth, sm->addr, vlan_id) < 0) {
|
||||
wpa_sta_disconnect(wpa_auth, sm->addr,
|
||||
WLAN_REASON_PREV_AUTH_NOT_VALID);
|
||||
- return;
|
||||
+ goto out;
|
||||
}
|
||||
|
||||
sm->pending_1_of_4_timeout = 0;
|
||||
@@ -3216,9 +3241,20 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
|
||||
sm->MICVerified = true;
|
||||
|
||||
+#ifdef CONFIG_IEEE80211R_AP
|
||||
+ if (wpa_key_mgmt_ft(sm->wpa_key_mgmt) && !sm->ft_completed) {
|
||||
+ wpa_printf(MSG_DEBUG, "FT: Store PMK-R0/PMK-R1");
|
||||
+ wpa_auth_ft_store_keys(sm, pmk_r0, pmk_r1, pmk_r0_name,
|
||||
+ key_len);
|
||||
+ }
|
||||
+#endif /* CONFIG_IEEE80211R_AP */
|
||||
+
|
||||
os_memcpy(&sm->PTK, &PTK, sizeof(PTK));
|
||||
forced_memzero(&PTK, sizeof(PTK));
|
||||
sm->PTK_valid = true;
|
||||
+out:
|
||||
+ forced_memzero(pmk_r0, sizeof(pmk_r0));
|
||||
+ forced_memzero(pmk_r1, sizeof(pmk_r1));
|
||||
}
|
||||
|
||||
|
||||
--- a/src/ap/wpa_auth_ft.c
|
||||
+++ b/src/ap/wpa_auth_ft.c
|
||||
@@ -2175,13 +2175,13 @@ int wpa_ft_store_pmk_fils(struct wpa_sta
|
||||
}
|
||||
|
||||
|
||||
-int wpa_auth_derive_ptk_ft(struct wpa_state_machine *sm, struct wpa_ptk *ptk)
|
||||
+int wpa_auth_derive_ptk_ft(struct wpa_state_machine *sm, struct wpa_ptk *ptk,
|
||||
+ u8 *pmk_r0, u8 *pmk_r1, u8 *pmk_r0_name,
|
||||
+ size_t *key_len)
|
||||
{
|
||||
- u8 pmk_r0[PMK_LEN_MAX], pmk_r0_name[WPA_PMK_NAME_LEN];
|
||||
size_t pmk_r0_len = wpa_key_mgmt_sha384(sm->wpa_key_mgmt) ?
|
||||
SHA384_MAC_LEN : PMK_LEN;
|
||||
size_t pmk_r1_len = pmk_r0_len;
|
||||
- u8 pmk_r1[PMK_LEN_MAX];
|
||||
u8 ptk_name[WPA_PMK_NAME_LEN];
|
||||
const u8 *mdid = sm->wpa_auth->conf.mobility_domain;
|
||||
const u8 *r0kh = sm->wpa_auth->conf.r0_key_holder;
|
||||
@@ -2189,13 +2189,6 @@ int wpa_auth_derive_ptk_ft(struct wpa_st
|
||||
const u8 *r1kh = sm->wpa_auth->conf.r1_key_holder;
|
||||
const u8 *ssid = sm->wpa_auth->conf.ssid;
|
||||
size_t ssid_len = sm->wpa_auth->conf.ssid_len;
|
||||
- int psk_local = sm->wpa_auth->conf.ft_psk_generate_local;
|
||||
- int expires_in = sm->wpa_auth->conf.r0_key_lifetime;
|
||||
- struct vlan_description vlan;
|
||||
- struct rate_description rate;
|
||||
- const u8 *identity, *radius_cui;
|
||||
- size_t identity_len, radius_cui_len;
|
||||
- int session_timeout;
|
||||
const u8 *mpmk;
|
||||
size_t mpmk_len;
|
||||
|
||||
@@ -2211,10 +2204,41 @@ int wpa_auth_derive_ptk_ft(struct wpa_st
|
||||
return -1;
|
||||
}
|
||||
|
||||
+ *key_len = pmk_r0_len;
|
||||
+ if (wpa_derive_pmk_r0(mpmk, mpmk_len, ssid, ssid_len, mdid,
|
||||
+ r0kh, r0kh_len, sm->addr,
|
||||
+ pmk_r0, pmk_r0_name,
|
||||
+ pmk_r0_len == SHA384_MAC_LEN) < 0 ||
|
||||
+ wpa_derive_pmk_r1(pmk_r0, pmk_r0_len, pmk_r0_name, r1kh, sm->addr,
|
||||
+ pmk_r1, sm->pmk_r1_name) < 0)
|
||||
+ return -1;
|
||||
+
|
||||
+ return wpa_pmk_r1_to_ptk(pmk_r1, pmk_r1_len, sm->SNonce, sm->ANonce,
|
||||
+ sm->addr, sm->wpa_auth->addr, sm->pmk_r1_name,
|
||||
+ ptk, ptk_name, sm->wpa_key_mgmt, sm->pairwise,
|
||||
+ 0);
|
||||
+}
|
||||
+
|
||||
+
|
||||
+void wpa_auth_ft_store_keys(struct wpa_state_machine *sm, const u8 *pmk_r0,
|
||||
+ const u8 *pmk_r1, const u8 *pmk_r0_name,
|
||||
+ size_t key_len)
|
||||
+{
|
||||
+ int psk_local = sm->wpa_auth->conf.ft_psk_generate_local;
|
||||
+ int expires_in = sm->wpa_auth->conf.r0_key_lifetime;
|
||||
+ struct vlan_description vlan;
|
||||
+ struct rate_description rate;
|
||||
+ const u8 *identity, *radius_cui;
|
||||
+ size_t identity_len, radius_cui_len;
|
||||
+ int session_timeout;
|
||||
+
|
||||
+ if (psk_local && wpa_key_mgmt_ft_psk(sm->wpa_key_mgmt))
|
||||
+ return;
|
||||
+
|
||||
if (wpa_ft_get_vlan(sm->wpa_auth, sm->addr, &vlan) < 0) {
|
||||
wpa_printf(MSG_DEBUG, "FT: vlan not available for STA " MACSTR,
|
||||
MAC2STR(sm->addr));
|
||||
- return -1;
|
||||
+ return;
|
||||
}
|
||||
|
||||
wpa_ft_get_rate_limit(sm->wpa_auth, sm->addr, &rate);
|
||||
@@ -2224,32 +2248,16 @@ int wpa_auth_derive_ptk_ft(struct wpa_st
|
||||
&radius_cui);
|
||||
session_timeout = wpa_ft_get_session_timeout(sm->wpa_auth, sm->addr);
|
||||
|
||||
- if (wpa_derive_pmk_r0(mpmk, mpmk_len, ssid, ssid_len, mdid,
|
||||
- r0kh, r0kh_len, sm->addr,
|
||||
- pmk_r0, pmk_r0_name,
|
||||
- wpa_key_mgmt_sha384(sm->wpa_key_mgmt)) < 0)
|
||||
- return -1;
|
||||
- if (!psk_local || !wpa_key_mgmt_ft_psk(sm->wpa_key_mgmt))
|
||||
- wpa_ft_store_pmk_r0(sm->wpa_auth, sm->addr, pmk_r0, pmk_r0_len,
|
||||
- pmk_r0_name,
|
||||
- sm->pairwise, &vlan, expires_in,
|
||||
- session_timeout, identity, identity_len,
|
||||
- radius_cui, radius_cui_len, &rate);
|
||||
-
|
||||
- if (wpa_derive_pmk_r1(pmk_r0, pmk_r0_len, pmk_r0_name, r1kh, sm->addr,
|
||||
- pmk_r1, sm->pmk_r1_name) < 0)
|
||||
- return -1;
|
||||
- if (!psk_local || !wpa_key_mgmt_ft_psk(sm->wpa_key_mgmt))
|
||||
- wpa_ft_store_pmk_r1(sm->wpa_auth, sm->addr, pmk_r1, pmk_r1_len,
|
||||
- sm->pmk_r1_name, sm->pairwise, &vlan,
|
||||
- expires_in, session_timeout, identity,
|
||||
- identity_len, radius_cui, radius_cui_len,
|
||||
- &rate);
|
||||
-
|
||||
- return wpa_pmk_r1_to_ptk(pmk_r1, pmk_r1_len, sm->SNonce, sm->ANonce,
|
||||
- sm->addr, sm->wpa_auth->addr, sm->pmk_r1_name,
|
||||
- ptk, ptk_name, sm->wpa_key_mgmt, sm->pairwise,
|
||||
- 0);
|
||||
+ wpa_ft_store_pmk_r0(sm->wpa_auth, sm->addr, pmk_r0, key_len,
|
||||
+ pmk_r0_name,
|
||||
+ sm->pairwise, &vlan, expires_in,
|
||||
+ session_timeout, identity, identity_len,
|
||||
+ radius_cui, radius_cui_len, &rate);
|
||||
+
|
||||
+ wpa_ft_store_pmk_r1(sm->wpa_auth, sm->addr, pmk_r1, key_len,
|
||||
+ sm->pmk_r1_name, sm->pairwise, &vlan,
|
||||
+ expires_in, session_timeout, identity,
|
||||
+ identity_len, radius_cui, radius_cui_len, &rate);
|
||||
}
|
||||
|
||||
|
||||
--- a/src/ap/wpa_auth_i.h
|
||||
+++ b/src/ap/wpa_auth_i.h
|
||||
@@ -302,7 +302,12 @@ int wpa_write_ftie(struct wpa_auth_confi
|
||||
const u8 *anonce, const u8 *snonce,
|
||||
u8 *buf, size_t len, const u8 *subelem,
|
||||
size_t subelem_len, int rsnxe_used);
|
||||
-int wpa_auth_derive_ptk_ft(struct wpa_state_machine *sm, struct wpa_ptk *ptk);
|
||||
+int wpa_auth_derive_ptk_ft(struct wpa_state_machine *sm, struct wpa_ptk *ptk,
|
||||
+ u8 *pmk_r0, u8 *pmk_r1, u8 *pmk_r0_name,
|
||||
+ size_t *key_len);
|
||||
+void wpa_auth_ft_store_keys(struct wpa_state_machine *sm, const u8 *pmk_r0,
|
||||
+ const u8 *pmk_r1, const u8 *pmk_r0_name,
|
||||
+ size_t key_len);
|
||||
struct wpa_ft_pmk_cache * wpa_ft_pmk_cache_init(void);
|
||||
void wpa_ft_pmk_cache_deinit(struct wpa_ft_pmk_cache *cache);
|
||||
void wpa_ft_install_ptk(struct wpa_state_machine *sm, int retry);
|
||||
@@ -13,10 +13,10 @@ qcom_setup_interfaces()
|
||||
|
||||
case $board in
|
||||
cig,wf186w)
|
||||
ucidef_add_switch "switch0" "4:wan" "0:lan" "1:lan" "2:lan" "3:lan" "6@eth0"
|
||||
ucidef_add_switch "switch0" "4:wan" "0:lan" "1:lan" "2:lan" "3:lan" "6u@eth0"
|
||||
;;
|
||||
cig,wf186h)
|
||||
ucidef_add_switch "switch0" "4:wan" "1:lan" "2:lan" "6@eth0"
|
||||
ucidef_add_switch "switch0" "4:wan" "1:lan" "2:lan" "6u@eth0"
|
||||
;;
|
||||
sonicfi,rap630c-311g|\
|
||||
cybertan,eww631-a1)
|
||||
@@ -25,7 +25,7 @@ qcom_setup_interfaces()
|
||||
;;
|
||||
sonicfi,rap630w-311g|\
|
||||
cybertan,eww631-b1)
|
||||
ucidef_add_switch "switch1" "5:wan" "2:lan" "3:lan" "4:lan" "6@eth0"
|
||||
ucidef_add_switch "switch1" "5:wan" "2:lan" "3:lan" "4:lan" "6u@eth0"
|
||||
;;
|
||||
udaya,a6-id2)
|
||||
ucidef_set_interface_wan "eth1"
|
||||
@@ -46,7 +46,7 @@ qcom_setup_interfaces()
|
||||
edgecore,eap104)
|
||||
ucidef_set_interface_wan "eth0"
|
||||
ucidef_add_switch "switch1" \
|
||||
"6@eth1" "1:lan" "2:lan" "3:lan" "4:lan"
|
||||
"6u@eth1" "1:lan" "2:lan" "3:lan" "4:lan"
|
||||
;;
|
||||
hfcl,ion4x_w|\
|
||||
hfcl,ion4xi_w)
|
||||
@@ -62,10 +62,10 @@ qcom_setup_interfaces()
|
||||
sonicfi,rap630w-312g|\
|
||||
yuncore,fap655)
|
||||
ucidef_add_switch "switch1" \
|
||||
"6@eth0" "1:lan" "2:lan" "3:lan" "4:lan" "5:wan"
|
||||
"6u@eth0" "1:lan" "2:lan" "3:lan" "4:lan" "5:wan"
|
||||
;;
|
||||
glinet,b3000)
|
||||
ucidef_add_switch "switch1" "6@eth1" "1:wan" "2:lan" "3:lan"
|
||||
ucidef_add_switch "switch1" "6u@eth1" "1:wan" "2:lan" "3:lan"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
@@ -9,6 +9,11 @@
|
||||
/ {
|
||||
aliases {
|
||||
serial0 = &uart0;
|
||||
|
||||
led-boot = &led_power;
|
||||
led-failsafe = &led_power;
|
||||
led-running = &led_power;
|
||||
led-upgrade = &led_power;
|
||||
};
|
||||
|
||||
chosen {
|
||||
@@ -39,31 +44,22 @@
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
led_blue {
|
||||
led_power: led_blue {
|
||||
label = "sys:blue";
|
||||
gpios = <&pio 23 GPIO_ACTIVE_HIGH>;
|
||||
linux,default-trigger = "timer";
|
||||
active-delay = <500>;
|
||||
inactive-delay = <500>;
|
||||
default-state="on";
|
||||
default-state="off";
|
||||
};
|
||||
|
||||
led_green {
|
||||
label = "sys:green";
|
||||
gpios = <&pio 24 GPIO_ACTIVE_HIGH>;
|
||||
linux,default-trigger = "timer";
|
||||
active-delay = <500>;
|
||||
inactive-delay = <500>;
|
||||
default-state="on";
|
||||
default-state="off";
|
||||
};
|
||||
|
||||
led_red {
|
||||
label = "sys:red";
|
||||
gpios = <&pio 25 GPIO_ACTIVE_LOW>;
|
||||
linux,default-trigger = "timer";
|
||||
active-delay = <500>;
|
||||
inactive-delay = <500>;
|
||||
default-state="on";
|
||||
default-state="off";
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -113,7 +109,7 @@
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
label = "lan1";
|
||||
label = "lan3";
|
||||
};
|
||||
|
||||
port@1 {
|
||||
@@ -123,7 +119,7 @@
|
||||
|
||||
port@2 {
|
||||
reg = <2>;
|
||||
label = "lan3";
|
||||
label = "lan1";
|
||||
};
|
||||
|
||||
port@6 {
|
||||
|
||||
@@ -42,6 +42,15 @@ define Package/ath12k-firmware-ipq5332-peb/description
|
||||
Standard ath12k firmware for IPQ5332 + Pebble from QCA
|
||||
endef
|
||||
|
||||
define Package/ath12k-firmware-ipq5332-peb-peb
|
||||
$(Package/ath12k-firmware-default)
|
||||
TITLE:=ath12k firmware for IPQ5332 + Pebble + Pebble devices
|
||||
endef
|
||||
|
||||
define Package/ath12k-firmware-ipq5332-peb-peb/description
|
||||
Standard ath12k firmware for IPQ5332 + Pebble + Pebble from QCA
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
|
||||
endef
|
||||
@@ -67,6 +76,16 @@ define Package/ath12k-firmware-ipq5332-peb/install
|
||||
$(1)/lib/firmware/qcn6432/
|
||||
endef
|
||||
|
||||
define Package/ath12k-firmware-ipq5332-peb-peb/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/IPQ5332/
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/qcn6432/
|
||||
$(INSTALL_DATA) ./files/IPQ5332_peb_peb/*.* \
|
||||
$(1)/lib/firmware/IPQ5332/
|
||||
$(INSTALL_DATA) ./files/IPQ5332_peb_peb/qcn6432/* \
|
||||
$(1)/lib/firmware/qcn6432/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,ath12k-firmware-qcn92xx))
|
||||
$(eval $(call BuildPackage,ath12k-firmware-ipq5332))
|
||||
$(eval $(call BuildPackage,ath12k-firmware-ipq5332-peb))
|
||||
$(eval $(call BuildPackage,ath12k-firmware-ipq5332-peb-peb))
|
||||
|
||||
13257
feeds/qca-wifi-7/ath12k-firmware/files/IPQ5332_peb_peb/Data.msc
Normal file
13257
feeds/qca-wifi-7/ath12k-firmware/files/IPQ5332_peb_peb/Data.msc
Normal file
File diff suppressed because it is too large
Load Diff
BIN
feeds/qca-wifi-7/ath12k-firmware/files/IPQ5332_peb_peb/iu_fw.b00
Normal file
BIN
feeds/qca-wifi-7/ath12k-firmware/files/IPQ5332_peb_peb/iu_fw.b00
Normal file
Binary file not shown.
BIN
feeds/qca-wifi-7/ath12k-firmware/files/IPQ5332_peb_peb/iu_fw.b01
Normal file
BIN
feeds/qca-wifi-7/ath12k-firmware/files/IPQ5332_peb_peb/iu_fw.b01
Normal file
Binary file not shown.
BIN
feeds/qca-wifi-7/ath12k-firmware/files/IPQ5332_peb_peb/iu_fw.b02
Normal file
BIN
feeds/qca-wifi-7/ath12k-firmware/files/IPQ5332_peb_peb/iu_fw.b02
Normal file
Binary file not shown.
@@ -0,0 +1,3 @@
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/iu_fw.b00
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/iu_fw.b01
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/iu_fw.b02
|
||||
BIN
feeds/qca-wifi-7/ath12k-firmware/files/IPQ5332_peb_peb/iu_fw.mdt
Normal file
BIN
feeds/qca-wifi-7/ath12k-firmware/files/IPQ5332_peb_peb/iu_fw.mdt
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,11 @@
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/q6_fw0.b00
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/q6_fw0.b01
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/q6_fw0.b02
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/q6_fw0.b03
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/q6_fw0.b04
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/q6_fw0.b05
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/q6_fw0.b06
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/q6_fw0.b07
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/q6_fw0.b08
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/q6_fw0.b09
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/q6_fw0.b11
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,3 @@
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/q6_fw1.b00
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/q6_fw1.b01
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/q6_fw1.b02
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,3 @@
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/q6_fw2.b00
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/q6_fw2.b01
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/q6_fw2.b02
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,3 @@
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/q6_fw3.b00
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/q6_fw3.b01
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/q6_fw3.b02
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,3 @@
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/q6_fw4.b00
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/q6_fw4.b01
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/q6_fw4.b02
|
||||
Binary file not shown.
13657
feeds/qca-wifi-7/ath12k-firmware/files/IPQ5332_peb_peb/qcn6432/Data.msc
Normal file
13657
feeds/qca-wifi-7/ath12k-firmware/files/IPQ5332_peb_peb/qcn6432/Data.msc
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,16 @@
|
||||
//Number of VAPs
|
||||
{"Mode": 0,"num vap":17} // Max VAP support is 17 per MAC
|
||||
{"Mode": 1,"num vap":17} // Max VAP support is 17 per MAC
|
||||
{"Mode": 2,"num vap":17} // Max VAP support is 17 per MAC
|
||||
|
||||
//Number of clients
|
||||
{"Mode":0, "num clients":256} // Max client support is 256 for both single MAC and dual MAC
|
||||
{"Mode":1, "num clients":256} // Max client support is 256 per MAC
|
||||
{"Mode":2, "num clients":256} // Max client support is 256 per MAC
|
||||
|
||||
// Please do not reduce the default configuration while working in QWRAP Mode.
|
||||
|
||||
//AFC Proxy ,Deployment type ,Power mode mask INI configuration
|
||||
{"afc_local_rsvd":0,"Deployment_Type":1,"Power_mode_mask":7}
|
||||
2<EFBFBD>=R<02>[I<>
|
||||
<EFBFBD>;<3B>b|G%<25><><19><05>ъ[<5B>nT
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,3 @@
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/qcn6432/iu_fw.b00
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/qcn6432/iu_fw.b01
|
||||
build/ms/bin/5332.wlan_fw2.mia_peb_peb_eval_cs/PIL_IMAGES/qcn6432/iu_fw.b02
|
||||
Binary file not shown.
@@ -0,0 +1,181 @@
|
||||
seq_start;
|
||||
seq_type:mem_req;
|
||||
sink:etr_ddr,0x1,0x400;
|
||||
seq_end;
|
||||
seq_start;
|
||||
seq_type:mac_event_trace;
|
||||
subsys_cfg_start:umac;
|
||||
cxc_eb0:0x2,0x42AAA8B3,0x64BFA3C0,0x00008000,0x0001C0FC;
|
||||
reo_eb0:0x4,0x61C81F4,0x0,0x0,0x0;
|
||||
tqm_eb0:0x5,0xCDB3C6C6,0x803007E0,0x0,0x0;
|
||||
tcl_eb0:0x6,0x25030034,0x3000,0x0,0x0;
|
||||
wbm_eb0:0x7,0x880004,0x380000,0x0,0x0;
|
||||
cxc_eb1:0x8,0x42AAA8B3,0x64BFA3C0,0x00008000,0x0001C0FC;
|
||||
tcl_eb1:0x9,0x25030034,0x3000,0x0,0x0;
|
||||
reo_eb1:0xA,0x61C81F4,0x0,0x0,0x0;
|
||||
tqm_eb1:0xB,0xCDB3C6C6,0x803007E0,0x0,0x0;
|
||||
wbm_eb1:0xC,0x880004,0x380000,0x0,0x0;
|
||||
mxi:0xD,0x122234,0x0,0x0,0x0;
|
||||
wsib:0xE,0x0,0x0,0x0,0x0;
|
||||
memw:0x0;
|
||||
subsys_cfg_end:umac;
|
||||
subsys_cfg_start:dmac;
|
||||
swevt:0x0,0xFFFFFFFF,0xFFFFFFFF,0x00000000,0x00000000;
|
||||
txdma_eb0:0x1,0x200,0x0,0x0,0x0;
|
||||
txdma_eb1:0x2,0xD9220,0xAF0,0x0,0x0;
|
||||
txdma_eb2:0x3,0xD9220,0xAF0,0x0,0x0;
|
||||
rxdma_eb0:0x4,0x93297E3F,0xC00000,0x0,0x0;
|
||||
rxdma_eb1:0x5,0x707F,0x0,0x0,0x0;
|
||||
txole_eb0:0x6,0xFFFFFFFF,0x0,0x0,0x0;
|
||||
txole_eb1:0x7,0x781F0734,0x6,0x0,0x0;
|
||||
txole_eb2:0x8,0x781F0734,0x6,0x0,0x0;
|
||||
rxole_eb0:0x9,0xF,0x0,0x0,0x0;
|
||||
rxole_eb1:0xA,0x7F,0x0,0x0,0x0;
|
||||
rxole_eb2:0xB,0x7F,0x0,0x0,0x0;
|
||||
crypto:0xC,0xFF3FFF,0x0,0x0,0x0;
|
||||
mxi:0xD,0x122234,0x0,0x0,0x0;
|
||||
sfm_eb0:0xE,0x40000003,0x7F8,0x0,0x0;
|
||||
rxmon_eb0:0x14,0x22800010,0x40A00,0x0,0x0;
|
||||
rxmon_eb1:0x15,0x18005000,0x18,0x0,0x0;
|
||||
txmon_eb0:0x12,0x22800010,0x40A00,0x0,0x0;
|
||||
txmon_eb1:0x13,0x98005000,0x199,0x0,0x0;
|
||||
memw:0x0;
|
||||
subsys_cfg_end:dmac;
|
||||
subsys_cfg_start:pmac0;
|
||||
swevt:0x0,0xFFFFFFFF,0xFFFFFFFF,0x00000000,0x00000000;
|
||||
hwsch:0x1,0x803FFFF7,0x30003,0x0,0x0;
|
||||
pdg:0x2,0xE430F87,0x622856E,0x0,0x0;
|
||||
txpcu_eb0:0x8,0xE87A047,0x132,0x0,0x0;
|
||||
rxpcu_eb0:0x9,0x10060217,0x1F24500,0x0,0x0;
|
||||
rri:0xa,0x0,0x0,0x0,0x0;
|
||||
ampi:0xb,0x69C07,0x0,0x0,0x0;
|
||||
mxi:0xd,0x122234,0x0,0x0,0x0;
|
||||
txpcu_eb1:0x10,0x0,0x0,0x0,0x0;
|
||||
sfm_eb1:0x12,0x40000003,0x7F8,0x0,0x0;
|
||||
rxpcu_eb1:0x13,0x0,0x0,0x0,0x0;
|
||||
hwmlo:0x1c,0x1C100004,0x7800,0x0,0x0;
|
||||
memw:0x0;
|
||||
subsys_cfg_end:pmac0;
|
||||
subsys_cfg_start:pmac1;
|
||||
swevt:0x0,0xFFFFFFFF,0xFFFFFFFF,0x00000000,0x00000000;
|
||||
hwsch:0x1,0x803FFFF7,0x30003,0x0,0x0;
|
||||
pdg:0x2,0xE430F87,0x622856E,0x0,0x0;
|
||||
txpcu_eb0:0x8,0xE87A047,0x132,0x0,0x0;
|
||||
rxpcu_eb0:0x9,0x10060217,0x1F24500,0x0,0x0;
|
||||
rri:0xa,0x0,0x0,0x0,0x0;
|
||||
ampi:0xb,0x69C07,0x0,0x0,0x0;
|
||||
mxi:0xd,0x122234,0x0,0x0,0x0;
|
||||
txpcu_eb1:0x10,0x0,0x0,0x0,0x0;
|
||||
sfm_eb1:0x12,0x40000003,0x7F8,0x0,0x0;
|
||||
rxpcu_eb1:0x13,0x0,0x0,0x0,0x0;
|
||||
hwmlo:0x1c,0x1C100004,0x7800,0x0,0x0;
|
||||
memw:0x0;
|
||||
subsys_cfg_end:pmac1;
|
||||
seq_end;
|
||||
seq_start;
|
||||
seq_type:phy_event_trace;
|
||||
subsys_cfg_start:phya0;
|
||||
data_tlv:0;
|
||||
wsi:0x0,0x00000000,0x00000000;
|
||||
rfcntl:0x0,0x00000000,0x00000000;
|
||||
tpc:0x0,0x00000000,0x00000000;
|
||||
cal:0x0,0x00000000,0x00000000;
|
||||
impcorr:0x0,0x00000000,0x00000000;
|
||||
mpi:0x6,0x00000006,0x00000000;
|
||||
fft:0x0,0x00000000,0x00000000;
|
||||
txtd:0x0,0x00000000,0x00000000;
|
||||
pmi:0x9,0x0000000A,0x00000000;
|
||||
rxtd:0xa,0x0000000A,0x00000000;
|
||||
demfront:0x0,0x00000000,0x00000000;
|
||||
pcss:0xc,0x0000003E,0x00000000;
|
||||
txfd:0x0,0x00000000,0x00000000;
|
||||
robe:0x0,0x00000000,0x00000000;
|
||||
dmac_0_1:0x0,0x00000000,0x00000000;
|
||||
dmac_2_3:0x0,0x00000000,0x00000000;
|
||||
dmac_4_5:0x0,0x00000000,0x00000000;
|
||||
dmac_6:0x0,0x00000000,0x00000000;
|
||||
eos:0x0,0x00000000,0x00000000;
|
||||
subsys_cfg_end:phya0;
|
||||
//subsys_cfg_start:phya1;
|
||||
//data_tlv:1;
|
||||
//wsi:0x0,0x00000000,0x00000000;
|
||||
//rfcntl:0x0,0x00000000,0x00000000;
|
||||
//tpc:0x0,0x00000000,0x00000000;
|
||||
//cal:0x0,0x00000000,0x00000000;
|
||||
//impcorr:0x0,0x00000000,0x00000000;
|
||||
//mpi:0x6,0x00000006,0x00000000;
|
||||
//fft:0x0,0x00000000,0x00000000;
|
||||
//txtd:0x0,0x00000000,0x00000000;
|
||||
//pmi:0x9,0x0000000A,0x00000000;
|
||||
//rxtd:0xa,0x0000000A,0x00000000;
|
||||
//demfront:0x0,0x00000000,0x00000000;
|
||||
//pcss:0xc,0x0000003E,0x00000000;
|
||||
//txfd:0x0,0x00000000,0x00000000;
|
||||
//robe:0x0,0x00000000,0x00000000;
|
||||
//dmac_0_1:0x0,0x00000000,0x00000000;
|
||||
//dmac_2_3:0x0,0x00000000,0x00000000;
|
||||
//dmac_4_5:0x0,0x00000000,0x00000000;
|
||||
//dmac_6:0x0,0x00000000,0x00000000;
|
||||
//eos:0x0,0x00000000,0x00000000;
|
||||
//subsys_cfg_end:phya1;
|
||||
seq_end;
|
||||
//seq_start;
|
||||
//seq_type:noc_trace;
|
||||
//noc_id:umacnoc;
|
||||
//syncoutperiod:0x1F;
|
||||
//probe_id:0x0;
|
||||
//probe_type:0x2;
|
||||
//probe_andinv:0x0;
|
||||
//probe_portsel:0x1;
|
||||
//filter0_path:0x0;
|
||||
//filter0_path_mask:0x0;
|
||||
//filter0_addr_min_lo:0x0;
|
||||
//filter0_addr_min_hi:0x0;
|
||||
//filter0_addr_max_lo:0xFFFFFFFF;
|
||||
//filter0_addr_max_hi:0xF;
|
||||
//filter0_opcode:0x3;
|
||||
//filter0_status:0x3;
|
||||
//filter0_trtype:0x0;
|
||||
//filter0_extid:0x0;
|
||||
//filter0_extid_mask:0x0;
|
||||
//filter1_path:0x0;
|
||||
//filter1_path_mask:0x0;
|
||||
//filter1_addr_min_lo:0x0;
|
||||
//filter1_addr_min_hi:0x0;
|
||||
//filter1_addr_max_lo:0xFFFFFFFF;
|
||||
//filter1_addr_max_hi:0xF;
|
||||
//filter1_opcode:0x3;
|
||||
//filter1_status:0x3;
|
||||
//filter1_trtype:0x0;
|
||||
//filter1_extid:0x0;
|
||||
//filter1_extid_mask:0x0;
|
||||
//seq_end;
|
||||
//seq_start;
|
||||
//seq_type:mac_tlv_trace;
|
||||
//subsys_cfg_start:pmac0;
|
||||
//tlv_port:tqm_hwsch_tlv;
|
||||
//tlv_config:tlv_type,other_tlv,specific_tlv,data_tlv;
|
||||
//tlv_config:1,3,3,3;
|
||||
//memw:0x2,0x10220A0,0xFFFFFDFF,0x10220B0,0x7FFFFFFF;
|
||||
//subsys_cfg_end:pmac0;
|
||||
//seq_end;
|
||||
//seq_start;
|
||||
//seq_start;
|
||||
//seq_type:mac_tlv_trace;
|
||||
//subsys_cfg_start:pmac1;
|
||||
//tlv_port:tqm_hwsch_tlv;
|
||||
//tlv_config:tlv_type,other_tlv,specific_tlv,data_tlv;
|
||||
//tlv_config:1,3,3,3;
|
||||
//memw:0x2,0x10220A0,0xFFFFFDFF,0x10220B0,0x7FFFFFFF;
|
||||
//subsys_cfg_end:pmac1;
|
||||
//seq_end;
|
||||
//seq_start;
|
||||
//seq_type:mac_obo_trace;
|
||||
//subsys_cfg_start:pmac0;
|
||||
//tbus_port:pdg_testbus, 0x7;
|
||||
//memw:0x0;
|
||||
//subsys_cfg_end:pmac0;
|
||||
//seq_end;
|
||||
//seq_start;
|
||||
//seq_type:irq_trace;
|
||||
//seq_end;
|
||||
@@ -0,0 +1,133 @@
|
||||
seq_start;
|
||||
seq_type:mem_req;
|
||||
sink:etr_ddr,0x1,0x400;
|
||||
seq_end;
|
||||
seq_start;
|
||||
seq_type:mac_event_trace;
|
||||
subsys_cfg_start:umac;
|
||||
cxc_eb0:0x2,0x42AAA8B3,0x64BFA3C0,0x00008000,0x0001C0FC;
|
||||
reo_eb0:0x4,0x61C81F4,0x0,0x0,0x0;
|
||||
tqm_eb0:0x5,0xCDB3C6C6,0x803007E0,0x0,0x0;
|
||||
tcl_eb0:0x6,0x25030034,0x3000,0x0,0x0;
|
||||
wbm_eb0:0x7,0x880004,0x380000,0x0,0x0;
|
||||
cxc_eb1:0x8,0x42AAA8B3,0x64BFA3C0,0x00008000,0x0001C0FC;
|
||||
tcl_eb1:0x9,0x25030034,0x3000,0x0,0x0;
|
||||
reo_eb1:0xA,0x61C81F4,0x0,0x0,0x0;
|
||||
tqm_eb1:0xB,0xCDB3C6C6,0x803007E0,0x0,0x0;
|
||||
wbm_eb1:0xC,0x880004,0x380000,0x0,0x0;
|
||||
wsib:0xE,0x0,0x0,0x0,0x0;
|
||||
memw:0x0;
|
||||
subsys_cfg_end:umac;
|
||||
subsys_cfg_start:dmac;
|
||||
swevt:0x0,0xFFFFFFFF,0xFFFFFFFF,0x00000000,0x00000000;
|
||||
txdma_eb0:0x1,0x0,0x0,0x0,0x0;
|
||||
txdma_eb1:0x2,0x286C0,0x83C304,0x0,0x0;
|
||||
txdma_eb2:0x3,0x286C0,0x83C304,0x0,0x0;
|
||||
rxdma_eb0:0x4,0x93297E3F,0xC00000,0x0,0x0;
|
||||
rxdma_eb1:0x5,0x707F,0x0,0x0,0x0;
|
||||
txole_eb0:0x6,0xFFFFFFFF,0x0,0x0,0x0;
|
||||
txole_eb1:0x7,0x781F0734,0x6,0x0,0x0;
|
||||
txole_eb2:0x8,0x781F0734,0x6,0x0,0x0;
|
||||
rxole_eb0:0x9,0xF,0x0,0x0,0x0;
|
||||
rxole_eb1:0xA,0x7F,0x0,0x0,0x0;
|
||||
rxole_eb2:0xB,0x7F,0x0,0x0,0x0;
|
||||
crypto:0xC,0xFF3FFF,0x0,0x0,0x0;
|
||||
mxi:0xD,0x122234,0x0,0x0,0x0;
|
||||
sfm_eb0:0xE,0x40000003,0x7F8,0x0,0x0;
|
||||
rxmon_eb0:0x14,0x0,0x0,0x0,0x0;
|
||||
rxmon_eb1:0x15,0x0,0x0,0x0,0x0;
|
||||
txmon_eb0:0x12,0x0,0x0,0x0,0x0;
|
||||
txmon_eb1:0x13,0x0,0x0,0x0,0x0;
|
||||
memw:0x0;
|
||||
subsys_cfg_end:dmac;
|
||||
subsys_cfg_start:pmac0;
|
||||
swevt:0x0,0xFFFFFFFF,0xFFFFFFFF,0x00000000,0x00000000;
|
||||
hwsch:0x1,0x3FFFF7,0x30000,0x0,0x0;
|
||||
pdg:0x2,0xE430F87,0x622856E,0x0,0x0;
|
||||
txpcu_eb0:0x8,0xE87A047,0x112,0x0,0x0;
|
||||
rxpcu_eb0:0x9,0x10060217,0x1824500,0x0,0x0;
|
||||
rri:0xa,0x0,0x0,0x0,0x0;
|
||||
ampi:0xb,0x69C07,0x0,0x0,0x0;
|
||||
mxi:0xd,0x122234,0x0,0x0,0x0;
|
||||
txpcu_eb1:0x10,0x0,0x0,0x0,0x0;
|
||||
sfm_eb1:0x12,0x40000003,0x7F8,0x0,0x0;
|
||||
rxpcu_eb1:0x13,0x0,0x0,0x0,0x0;
|
||||
hwmlo:0x1c,0x1C100004,0x0,0x0,0x0;
|
||||
memw:0x0;
|
||||
subsys_cfg_end:pmac0;
|
||||
seq_end;
|
||||
seq_start;
|
||||
seq_type:phy_event_trace;
|
||||
subsys_cfg_start:phya0;
|
||||
data_tlv:0;
|
||||
wsi:0x0,0x00000000,0x00000000;
|
||||
rfcntl:0x0,0x00000000,0x00000000;
|
||||
tpc:0x0,0x00000000,0x00000000;
|
||||
cal:0x0,0x00000000,0x00000000;
|
||||
impcorr:0x0,0x00000000,0x00000000;
|
||||
mpi:0x6,0x00000006,0x00000000;
|
||||
fft:0x0,0x00000000,0x00000000;
|
||||
txtd:0x0,0x00000000,0x00000000;
|
||||
pmi:0x9,0x0000000A,0x00000000;
|
||||
rxtd:0xa,0x0000000A,0x00000000;
|
||||
demfront:0x0,0x00000000,0x00000000;
|
||||
pcss:0xc,0x0000003E,0x00000000;
|
||||
txfd:0x0,0x00000000,0x00000000;
|
||||
robe:0x0,0x00000000,0x00000000;
|
||||
dmac_0_1:0x0,0x00000000,0x00000000;
|
||||
dmac_2_3:0x0,0x00000000,0x00000000;
|
||||
dmac_4_5:0x0,0x00000000,0x00000000;
|
||||
dmac_6:0x0,0x00000000,0x00000000;
|
||||
eos:0x0,0x00000000,0x00000000;
|
||||
subsys_cfg_end:phya0;
|
||||
seq_end;
|
||||
//seq_start;
|
||||
//seq_type:noc_trace;
|
||||
//noc_id:umacnoc;
|
||||
//syncoutperiod:0x1F;
|
||||
//probe_id:0x0;
|
||||
//probe_type:0x2;
|
||||
//probe_andinv:0x0;
|
||||
//probe_portsel:0x1;
|
||||
//filter0_path:0x0;
|
||||
//filter0_path_mask:0x0;
|
||||
//filter0_addr_min_lo:0x0;
|
||||
//filter0_addr_min_hi:0x0;
|
||||
//filter0_addr_max_lo:0xFFFFFFFF;
|
||||
//filter0_addr_max_hi:0xF;
|
||||
//filter0_opcode:0x3;
|
||||
//filter0_status:0x3;
|
||||
//filter0_trtype:0x0;
|
||||
//filter0_extid:0x0;
|
||||
//filter0_extid_mask:0x0;
|
||||
//filter1_path:0x0;
|
||||
//filter1_path_mask:0x0;
|
||||
//filter1_addr_min_lo:0x0;
|
||||
//filter1_addr_min_hi:0x0;
|
||||
//filter1_addr_max_lo:0xFFFFFFFF;
|
||||
//filter1_addr_max_hi:0xF;
|
||||
//filter1_opcode:0x3;
|
||||
//filter1_status:0x3;
|
||||
//filter1_trtype:0x0;
|
||||
//filter1_extid:0x0;
|
||||
//filter1_extid_mask:0x0;
|
||||
//seq_end;
|
||||
//seq_start;
|
||||
//seq_type:mac_tlv_trace;
|
||||
//subsys_cfg_start:pmac0;
|
||||
//tlv_port:txpcu_ampi_tlv;
|
||||
//tlv_config:tlv_type,other_tlv,specific_tlv,data_tlv;
|
||||
//tlv_config:1,3,3,3;
|
||||
//memw:0x0;
|
||||
//subsys_cfg_end:pmac0;
|
||||
//seq_end;
|
||||
//seq_start;
|
||||
//seq_type:mac_obo_trace;
|
||||
//subsys_cfg_start:pmac0;
|
||||
//tbus_port:pdg_testbus, 0x7;
|
||||
//memw:0x0;
|
||||
//subsys_cfg_end:pmac0;
|
||||
//seq_end;
|
||||
//seq_start;
|
||||
//seq_type:irq_trace;
|
||||
//seq_end;
|
||||
@@ -53,6 +53,11 @@ $(call Package/ath12k-wifi-default)
|
||||
TITLE:=board-2.bin for RAP750W_311a
|
||||
endef
|
||||
|
||||
define Package/ath12k-wifi-cig-wf189w
|
||||
$(call Package/ath12k-wifi-default)
|
||||
TITLE:=board-2.bin for WF189W
|
||||
endef
|
||||
|
||||
define Package/ath12k-wifi-cig-wf189/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/ath12k/QCN92XX/hw1.0/
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/
|
||||
@@ -83,7 +88,16 @@ define Package/ath12k-wifi-sonicfi-rap750w-311a/install
|
||||
$(INSTALL_DATA) ./ipq5332_qcn6432.regdb $(1)/lib/firmware/ath12k/QCN6432/hw1.0/regdb.bin
|
||||
endef
|
||||
|
||||
define Package/ath12k-wifi-cig-wf189w/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/ath12k/QCN6432/hw1.0/
|
||||
$(INSTALL_DATA) ./board-2.bin.189w.IPQ5332 $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/board-2.bin
|
||||
$(INSTALL_DATA) ./board-2.bin.189w.QCN6432 $(1)/lib/firmware/ath12k/QCN6432/hw1.0/board-2.bin
|
||||
$(INSTALL_DATA) ./ipq5332_qcn6432.regdb $(1)/lib/firmware/ath12k/QCN6432/hw1.0/regdb.bin
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,ath12k-wifi-cig-wf189))
|
||||
$(eval $(call BuildPackage,ath12k-wifi-edgecore-eap105))
|
||||
$(eval $(call BuildPackage,ath12k-wifi-sonicfi-rap7110c-341x))
|
||||
$(eval $(call BuildPackage,ath12k-wifi-sonicfi-rap750w-311a))
|
||||
$(eval $(call BuildPackage,ath12k-wifi-cig-wf189w))
|
||||
|
||||
BIN
feeds/qca-wifi-7/ath12k-wifi/board-2.bin.189w.IPQ5332
Normal file
BIN
feeds/qca-wifi-7/ath12k-wifi/board-2.bin.189w.IPQ5332
Normal file
Binary file not shown.
BIN
feeds/qca-wifi-7/ath12k-wifi/board-2.bin.189w.QCN6432
Normal file
BIN
feeds/qca-wifi-7/ath12k-wifi/board-2.bin.189w.QCN6432
Normal file
Binary file not shown.
@@ -73,6 +73,10 @@ hostapd_append_wpa_key_mgmt() {
|
||||
owe)
|
||||
append wpa_key_mgmt "OWE"
|
||||
;;
|
||||
psk2-radius)
|
||||
append wpa_key_mgmt "WPA-PSK"
|
||||
[ "${ieee80211r:-0}" -gt 0 ] && append wpa_key_mgmt "FT-PSK"
|
||||
;;
|
||||
esac
|
||||
|
||||
[ "$fils" -gt 0 ] && {
|
||||
@@ -663,7 +667,7 @@ hostapd_set_bss_options() {
|
||||
set_default sae_require_mfp 1
|
||||
[ "$ppsk" -eq 0 ] && set_default sae_pwe 2
|
||||
;;
|
||||
psk-sae|eap-eap2)
|
||||
psk-sae|psk2-radius|eap-eap2)
|
||||
set_default ieee80211w 1
|
||||
set_default sae_require_mfp 1
|
||||
[ "$ppsk" -eq 0 ] && set_default sae_pwe 2
|
||||
@@ -790,6 +794,10 @@ hostapd_set_bss_options() {
|
||||
append bss_conf "wep_default_key=$wep_keyidx" "$N"
|
||||
[ -n "$wep_rekey" ] && append bss_conf "wep_rekey_period=$wep_rekey" "$N"
|
||||
;;
|
||||
psk2-radius)
|
||||
append bss_conf "wpa_psk_radius=3" "$N"
|
||||
append_radius_server
|
||||
vlan_possible=1
|
||||
esac
|
||||
|
||||
case "$auth_type" in
|
||||
|
||||
@@ -14,6 +14,9 @@ sercomm,ap72tip)
|
||||
sonicfi,rap7110c-341x)
|
||||
ucidef_set_led_default "power" "POWER" "pwm:blue" "on"
|
||||
;;
|
||||
cig,wf189w)
|
||||
ucidef_set_led_default "power" "POWER" "pwm:blue" "on"
|
||||
;;
|
||||
esac
|
||||
|
||||
board_config_flush
|
||||
|
||||
@@ -21,6 +21,9 @@ ipq53xx_setup_interfaces()
|
||||
sonicfi,rap7110c-341x)
|
||||
ucidef_set_interfaces_lan_wan "" "eth0"
|
||||
;;
|
||||
cig,wf189w)
|
||||
ucidef_add_switch "switch1" "5u@eth0" "3:lan" "2:lan" "1:lan" "0u@eth1" "4:wan"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
@@ -28,6 +31,7 @@ qcom_setup_macs()
|
||||
{
|
||||
local board="$1"
|
||||
case $board in
|
||||
cig,wf189w|\
|
||||
cig,wf189)
|
||||
mtd=$(find_mtd_chardev "0:APPSBLENV")
|
||||
[ -z "$mtd" ] && return;
|
||||
|
||||
@@ -27,6 +27,7 @@ board=$(board_name)
|
||||
case "$FIRMWARE" in
|
||||
ath12k/IPQ5332/hw1.0/caldata.bin)
|
||||
case "$board" in
|
||||
cig,wf189w|\
|
||||
cig,wf189|\
|
||||
edgecore,eap105|\
|
||||
sercomm,ap72tip)
|
||||
@@ -59,6 +60,20 @@ ath12k/QCN6432/hw1.0/caldata_1.bin)
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
ath12k/QCN6432/hw1.0/cal-ahb-soc@0:wifi1@c0000000.bin)
|
||||
case "$board" in
|
||||
cig,wf189w)
|
||||
caldata_extract "0:ART" 0x26800 0x20000
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
ath12k/QCN6432/hw1.0/cal-ahb-soc@0:wifi2@c0000000.bin)
|
||||
case "$board" in
|
||||
cig,wf189w)
|
||||
caldata_extract "0:ART" 0x58800 0x20000
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
exit 1
|
||||
;;
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
|
||||
START=99
|
||||
|
||||
boot() {
|
||||
for j in 68 69 70 71 75 88 92 96; do
|
||||
echo 8 > /proc/irq/$j/smp_affinity
|
||||
done
|
||||
|
||||
for j in 67 74 91 87; do
|
||||
echo 4 > /proc/irq/$j/smp_affinity
|
||||
done
|
||||
|
||||
for j in 66 73 86 90 93; do
|
||||
echo 2 > /proc/irq/$j/smp_affinity
|
||||
done
|
||||
|
||||
for j in 65 72 85 89; do
|
||||
echo 1 > /proc/irq/$j/smp_affinity
|
||||
done
|
||||
}
|
||||
@@ -86,6 +86,7 @@ platform_do_upgrade() {
|
||||
|
||||
board=$(board_name)
|
||||
case $board in
|
||||
cig,wf189w|\
|
||||
cig,wf189)
|
||||
if [ -f /proc/boot_info/bootconfig0/rootfs/upgradepartition ]; then
|
||||
CI_UBIPART="$(cat /proc/boot_info/bootconfig0/rootfs/upgradepartition)"
|
||||
|
||||
787
feeds/qca-wifi-7/ipq53xx/dts/ipq5332-cig-wf189w.dts
Normal file
787
feeds/qca-wifi-7/ipq53xx/dts/ipq5332-cig-wf189w.dts
Normal file
@@ -0,0 +1,787 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
||||
/*
|
||||
* IPQ5332 RDP446 board device tree source
|
||||
*
|
||||
* Copyright (c) 2020-2021 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
#include "ipq5332.dtsi"
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/input/input.h>
|
||||
#include <dt-bindings/leds/common.h>
|
||||
#include "ipq5332-default-memory.dtsi"
|
||||
|
||||
/ {
|
||||
model = "CIG WF189W";
|
||||
compatible = "cig,wf189w", "qcom,ipq5332-ap-mi04.1", "qcom,ipq5332-rdp446", "qcom,ipq5332";
|
||||
|
||||
/* 1G Layout for IPQ5332 + QCN6432 + QCN6432
|
||||
* +==========+==============+========================+
|
||||
* | | | |
|
||||
* | Region | Start Offset | Size |
|
||||
* | | | |
|
||||
* +---------+--------------+-------------------------+
|
||||
* | Q6 | | |
|
||||
* | code/ | 0x4A900000 | 25MB |
|
||||
* | data | | |
|
||||
* +---------+--------------+-------------------------+
|
||||
* | IPQ5332 | | |
|
||||
* | data | 0x4C200000 | 21MB |
|
||||
* +---------+--------------+-------------------------+
|
||||
* | IPQ5332 | | |
|
||||
* | M3 Dump | 0x4D700000 | 1MB |
|
||||
* +---------+--------------+-------------------------+
|
||||
* | IPQ5332 | | |
|
||||
* | QDSS | 0x4D800000 | 1MB |
|
||||
* +---------+--------------+-------------------------+
|
||||
* | IPQ5332 | | |
|
||||
* | CALDB | 0x4D900000 | 5MB |
|
||||
* +---------+--------------+-------------------------+
|
||||
* |QCN6432_1| | |
|
||||
* | data | 0x4DE00000 | 21MB |
|
||||
* +---------+--------------+-------------------------+
|
||||
* |QCN6432_1| | |
|
||||
* | M3 Dump | 0x4F300000 | 1MB |
|
||||
* +---------+--------------+-------------------------+
|
||||
* |QCN6432_1| | |
|
||||
* | QDSS | 0x4E400000 | 1MB |
|
||||
* +---------+--------------+-------------------------+
|
||||
* |QCN6432_1| | |
|
||||
* | CALDB | 0x4F500000 | 5MB |
|
||||
* +---------+--------------+-------------------------+
|
||||
* |QCN6432_2| | |
|
||||
* | data | 0x4FA00000 | 21MB |
|
||||
* +---------+--------------+-------------------------+
|
||||
* |QCN6432_2| | |
|
||||
* | M3 Dump | 0x50F00000 | 1MB |
|
||||
* +---------+--------------+-------------------------+
|
||||
* |QCN6432_2| | |
|
||||
* | QDSS | 0x51000000 | 1MB |
|
||||
* +---------+--------------+-------------------------+
|
||||
* |QCN6432_2| | |
|
||||
* | CALDB | 0x51100000 | 5MB |
|
||||
* +---------+--------------+-------------------------+
|
||||
* | | | |
|
||||
* | MLO | 0x51600000 | 12MB |
|
||||
* +==================================================+
|
||||
* | |
|
||||
* | |
|
||||
* | |
|
||||
* | Rest of memory for Linux |
|
||||
* | |
|
||||
* | |
|
||||
* | |
|
||||
* +==================================================+
|
||||
*/
|
||||
|
||||
reserved-memory {
|
||||
|
||||
/delete-node/ m3_dump@4cc00000;
|
||||
/delete-node/ q6_etr_dump@1;
|
||||
/delete-node/ mlo_global_mem_0@0x4db00000;
|
||||
/delete-node/ wcnss@4a900000;
|
||||
/delete-node/ q6_caldb_region@4ce00000;
|
||||
|
||||
q6_mem_regions: q6_mem_regions@4A900000 {
|
||||
reg = <0x0 0x4a900000 0x0 0x6D00000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
q6_code_data: q6_code_data@4A900000 {
|
||||
reg = <0x0 0x4a900000 0x0 0x1900000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
q6_ipq5332_data: q6_ipq5332_data@4C200000 {
|
||||
reg = <0x0 0x4C200000 0x0 0x1500000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
m3_dump: m3_dump@4D700000 {
|
||||
reg = <0x0 0x4D700000 0x0 0x100000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
q6_etr_region: q6_etr_dump@4D800000 {
|
||||
reg = <0x0 0x4D800000 0x0 0x100000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
q6_ipq5332_caldb: q6_ipq5332_caldb@4D900000 {
|
||||
reg = <0x0 0x4D900000 0x0 0x500000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
q6_qcn6432_data_1: q6_qcn6432_data_1@4DE00000 {
|
||||
reg = <0x0 0x4DE00000 0x0 0x1500000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
m3_dump_qcn6432_1: m3_dump_qcn6432_1@4F300000 {
|
||||
reg = <0x0 0x4F300000 0x0 0x100000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
q6_qcn6432_etr_1: q6_qcn6432_etr_1@4F400000 {
|
||||
reg = <0x0 0x4F400000 0x0 0x100000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
q6_qcn6432_caldb_1: q6_qcn6432_caldb_1@4F500000 {
|
||||
reg = <0x0 0x4F500000 0x0 0x500000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
q6_qcn6432_data_2: q6_qcn6432_data_2@4FA00000 {
|
||||
reg = <0x0 0x4FA00000 0x0 0x1500000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
m3_dump_qcn6432_2: m3_dump_qcn6432_2@50F00000 {
|
||||
reg = <0x0 0x50F00000 0x0 0x100000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
q6_qcn6432_etr_2: q6_qcn6432_etr_2@51000000 {
|
||||
reg = <0x0 0x51000000 0x0 0x100000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
q6_qcn6432_caldb_2: q6_qcn6432_caldb_2@51100000 {
|
||||
reg = <0x0 0x51100000 0x0 0x500000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
mlo_global_mem0: mlo_global_mem_0@51600000 {
|
||||
reg = <0x0 0x51600000 0x0 0xC00000>;
|
||||
no-map;
|
||||
};
|
||||
};
|
||||
|
||||
aliases {
|
||||
serial0 = &blsp1_uart0;
|
||||
serial1 = &blsp1_uart1;
|
||||
ethernet0 = "/soc/dp1";
|
||||
ethernet1 = "/soc/dp2";
|
||||
led-boot = &led_power;
|
||||
led-failsafe = &led_power;
|
||||
led-running = &led_power;
|
||||
led-upgrade = &led_power;
|
||||
};
|
||||
|
||||
chosen {
|
||||
stdout-path = "serial0";
|
||||
};
|
||||
|
||||
soc@0 {
|
||||
mdio:mdio@90000 {
|
||||
pinctrl-0 = <&mdio1_pins &mdio0_pins>;
|
||||
pinctrl-names = "default";
|
||||
/*gpio51 for manhattan reset*/
|
||||
phy-reset-gpio = <&tlmm 22 GPIO_ACTIVE_LOW>;
|
||||
phyaddr_fixup = <0xC90F018>;
|
||||
uniphyaddr_fixup = <0xC90F014>;
|
||||
mdio_clk_fixup; /* MDIO clock sequence fix up flag */
|
||||
status = "okay";
|
||||
|
||||
phy0: ethernet-phy@0 {
|
||||
reg = <1>;
|
||||
fixup;
|
||||
};
|
||||
phy1: ethernet-phy@1 {
|
||||
reg = <2>;
|
||||
fixup;
|
||||
};
|
||||
phy2: ethernet-phy@2 {
|
||||
reg = <3>;
|
||||
fixup;
|
||||
};
|
||||
phy3: ethernet-phy@3 {
|
||||
reg = <4>;
|
||||
fixup;
|
||||
};
|
||||
|
||||
switch0@10 {
|
||||
compatible = "qca,qca8386";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x10>;
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
label = "cpu";
|
||||
ethernet = <&gmac2>;
|
||||
dsa-tag-protocol = "qca_4b";
|
||||
};
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
label = "lan1";
|
||||
phy-handle = <&phy0>;
|
||||
phy-mode = "usxgmii";
|
||||
};
|
||||
|
||||
port@2 {
|
||||
reg = <2>;
|
||||
label = "lan2";
|
||||
phy-handle = <&phy1>;
|
||||
phy-mode = "usxgmii";
|
||||
};
|
||||
|
||||
port@3 {
|
||||
reg = <3>;
|
||||
label = "lan3";
|
||||
phy-handle = <&phy2>;
|
||||
phy-mode = "usxgmii";
|
||||
};
|
||||
|
||||
port@4 {
|
||||
reg = <4>;
|
||||
label = "lan4";
|
||||
phy-handle = <&phy3>;
|
||||
phy-mode = "usxgmii";
|
||||
};
|
||||
|
||||
port@5 {
|
||||
reg = <5>;
|
||||
forced-speed = <2500>;
|
||||
forced-duplex = <1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
pwmleds {
|
||||
compatible = "pwm-leds";
|
||||
|
||||
red {
|
||||
label = "pwm:red";
|
||||
pwms = <&pwm 3 1250000>;
|
||||
max-brightness = <160>;
|
||||
linux,default-trigger = "none";
|
||||
};
|
||||
|
||||
green {
|
||||
label = "pwm:green";
|
||||
pwms = <&pwm 2 1250000>;
|
||||
max-brightness = <160>;
|
||||
linux,default-trigger = "none";
|
||||
};
|
||||
|
||||
led_power: blue {
|
||||
label = "pwm:blue";
|
||||
pwms = <&pwm 1 1250000>;
|
||||
max-brightness = <160>;
|
||||
linux,default-trigger = "none";
|
||||
};
|
||||
};
|
||||
|
||||
gpio_keys {
|
||||
compatible = "gpio-keys";
|
||||
pinctrl-0 = <&button_pins>;
|
||||
pinctrl-names = "default";
|
||||
status = "okay";
|
||||
|
||||
button@1 {
|
||||
label = "rst";
|
||||
linux,code = <KEY_RESTART>;
|
||||
gpios = <&tlmm 21 GPIO_ACTIVE_LOW>;
|
||||
linux,input-type = <1>;
|
||||
debounce-interval = <60>;
|
||||
};
|
||||
};
|
||||
|
||||
ess-instance {
|
||||
num_devices = <0x2>;
|
||||
|
||||
ess-switch@3a000000 {
|
||||
pinctrl-names = "default";
|
||||
switch_cpu_bmp = <0x1>; /* cpu port bitmap */
|
||||
switch_lan_bmp = <0x2>; /* lan port bitmap */
|
||||
switch_wan_bmp = <0x4>; /* wan port bitmap */
|
||||
switch_mac_mode = <0xc>; /* mac mode for uniphy instance0*/
|
||||
switch_mac_mode1 = <0xc>; /* mac mode for uniphy instance1*/
|
||||
switch_mac_mode2 = <0xff>; /* mac mode for uniphy instance2*/
|
||||
|
||||
qcom,port_phyinfo {
|
||||
port@0 {
|
||||
port_id = <1>;
|
||||
forced-speed = <2500>;
|
||||
forced-duplex = <1>;
|
||||
};
|
||||
port@1 {
|
||||
port_id = <2>;
|
||||
forced-speed = <2500>;
|
||||
forced-duplex = <1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ess-switch1@1 {
|
||||
compatible = "qcom,ess-switch-qca8386";
|
||||
device_id = <1>;
|
||||
switch_access_mode = "mdio";
|
||||
mdio-bus = <&mdio>;
|
||||
switch_mac_mode = <0xc>; /* mac mode for uniphy instance0 */
|
||||
switch_mac_mode1 = <0xc>; /* mac mode1 for uniphy instance1 */
|
||||
switch_cpu_bmp = <0x21>; /* cpu port bitmap */
|
||||
switch_lan_bmp = <0x0e>; /* lan port bitmap */
|
||||
switch_wan_bmp = <0x10>; /* wan port bitmap */
|
||||
// link-polling-required = <0>;
|
||||
fdb_sync = "interrupt";
|
||||
link-intr-gpio = <&tlmm 24 GPIO_ACTIVE_HIGH>;
|
||||
|
||||
qcom,port_phyinfo {
|
||||
port@0 {
|
||||
port_id = <0>;
|
||||
forced-speed = <2500>;
|
||||
forced-duplex = <1>;
|
||||
};
|
||||
port@1 {
|
||||
port_id = <1>;
|
||||
phy_address = <1>;
|
||||
};
|
||||
port@2 {
|
||||
port_id = <2>;
|
||||
phy_address = <2>;
|
||||
};
|
||||
port@3 {
|
||||
port_id = <3>;
|
||||
phy_address = <3>;
|
||||
};
|
||||
port@4 {
|
||||
port_id = <4>;
|
||||
phy_address = <4>;
|
||||
};
|
||||
port@5 {
|
||||
port_id = <5>;
|
||||
forced-speed = <2500>;
|
||||
forced-duplex = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
led_source@2 {
|
||||
source = <2>;
|
||||
mode = "normal";
|
||||
speed = "all";
|
||||
blink_en = "enable";
|
||||
active = "high";
|
||||
};
|
||||
led_source@5 {
|
||||
source = <5>;
|
||||
mode = "normal";
|
||||
speed = "all";
|
||||
blink_en = "enable";
|
||||
active = "high";
|
||||
};
|
||||
led_source@8 {
|
||||
source = <8>;
|
||||
mode = "normal";
|
||||
speed = "all";
|
||||
blink_en = "enable";
|
||||
active = "high";
|
||||
};
|
||||
led_source@11 {
|
||||
source = <11>;
|
||||
mode = "normal";
|
||||
speed = "all";
|
||||
blink_en = "enable";
|
||||
active = "high";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
dp1 {
|
||||
device_type = "network";
|
||||
compatible = "qcom,nss-dp";
|
||||
qcom,id = <2>;
|
||||
reg = <0x3a504000 0x4000>;
|
||||
qcom,mactype = <1>;
|
||||
local-mac-address = [000000000000];
|
||||
qcom,mht-dev = <1>;
|
||||
qcom,is_switch_connected = <1>;
|
||||
qcom,ppe-offload-disabled = <1>;
|
||||
phy-mode = "sgmii";
|
||||
};
|
||||
|
||||
gmac2:dp2 {
|
||||
device_type = "network";
|
||||
compatible = "qcom,nss-dp";
|
||||
qcom,id = <1>;
|
||||
reg = <0x3a500000 0x4000>;
|
||||
qcom,mactype = <1>;
|
||||
local-mac-address = [000000000000];
|
||||
phy-mode = "sgmii";
|
||||
qcom,mht-dev = <1>;
|
||||
qcom,is_switch_connected = <1>;
|
||||
qcom,ppe-offload-disabled = <1>;
|
||||
};
|
||||
|
||||
/* EDMA host driver configuration for the board */
|
||||
edma@3ab00000 {
|
||||
qcom,txdesc-ring-start = <4>; /* Tx desc ring start ID */
|
||||
qcom,txdesc-rings = <12>; /* Total number of Tx desc rings to be provisioned */
|
||||
qcom,mht-txdesc-rings = <8>; /* Extra Tx desc rings to be provisioned for MHT SW ports */
|
||||
qcom,txcmpl-ring-start = <4>; /* Tx complete ring start ID */
|
||||
qcom,txcmpl-rings = <12>; /* Total number of Tx complete rings to be provisioned */
|
||||
qcom,mht-txcmpl-rings = <8>; /* Extra Tx complete rings to be provisioned for mht sw ports. */
|
||||
qcom,rxfill-ring-start = <4>; /* Rx fill ring start ID */
|
||||
qcom,rxfill-rings = <4>; /* Total number of Rx fill rings to be provisioned */
|
||||
qcom,rxdesc-ring-start = <12>; /* Rx desc ring start ID */
|
||||
qcom,rxdesc-rings = <4>; /* Total number of Rx desc rings to be provisioned */
|
||||
qcom,rx-page-mode = <0>; /* Rx fill ring page mode */
|
||||
qcom,tx-map-priority-level = <1>; /* Tx priority level per port */
|
||||
qcom,rx-map-priority-level = <1>; /* Rx priority level per core */
|
||||
qcom,ppeds-num = <2>; /* Number of PPEDS nodes */
|
||||
/* PPE-DS node format: <Rx-fill Tx-cmpl Rx Tx Queue-base Queue-count> */
|
||||
qcom,ppeds-map = <1 1 1 1 32 8>, /* PPEDS Node#0 ring and queue map */
|
||||
<2 2 2 2 40 8>; /* PPEDS Node#1 ring and queue map */
|
||||
qcom,txdesc-map = <8 9 10 11>, /* Port0 per-core Tx ring map */
|
||||
<12 13 14 15>, /* MHT-Port1 per-core Tx ring map */
|
||||
<4 5 6 7>, /* MHT-Port2 per-core Tx ring map/packets from vp*/
|
||||
<16 17 18 19>, /* MHT-Port3 per-core Tx ring map */
|
||||
<20 21 22 23>; /* MHT-Port4 per-core Tx ring map */
|
||||
qcom,txdesc-fc-grp-map = <1 2 3 4 5>; /* Per GMAC flow control group map */
|
||||
qcom,rxfill-map = <4 5 6 7>; /* Per-core Rx fill ring map */
|
||||
qcom,rxdesc-map = <12 13 14 15>; /* Per-core Rx desc ring map */
|
||||
qcom,rx-queue-start = <0>; /* Rx queue start */
|
||||
qcom,rx-ring-queue-map = <0 8 16 24>, /* Priority 0 queues per-core Rx ring map */
|
||||
<1 9 17 25>, /* Priority 1 queues per-core Rx ring map */
|
||||
<2 10 18 26>, /* Priority 2 queues per-core Rx ring map */
|
||||
<3 11 19 27>, /* Priority 3 queues per-core Rx ring map */
|
||||
<4 12 20 28>, /* Priority 4 queues per-core Rx ring map */
|
||||
<5 13 21 29>, /* Priority 5 queues per-core Rx ring map */
|
||||
<6 14 22 30>, /* Priority 6 queues per-core Rx ring map */
|
||||
<7 15 23 31>; /* Priority 7 queues per-core Rx ring map */
|
||||
interrupts = <0 163 4>, /* Tx complete ring id #4 IRQ info */
|
||||
<0 164 4>, /* Tx complete ring id #5 IRQ info */
|
||||
<0 165 4>, /* Tx complete ring id #6 IRQ info */
|
||||
<0 166 4>, /* Tx complete ring id #7 IRQ info */
|
||||
<0 167 4>, /* Tx complete ring id #8 IRQ info */
|
||||
<0 168 4>, /* Tx complete ring id #9 IRQ info */
|
||||
<0 169 4>, /* Tx complete ring id #10 IRQ info */
|
||||
<0 170 4>, /* Tx complete ring id #11 IRQ info */
|
||||
<0 171 4>, /* Tx complete ring id #12 IRQ info */
|
||||
<0 172 4>, /* Tx complete ring id #13 IRQ info */
|
||||
<0 173 4>, /* Tx complete ring id #14 IRQ info */
|
||||
<0 174 4>, /* Tx complete ring id #15 IRQ info */
|
||||
<0 139 4>, /* Rx desc ring id #12 IRQ info */
|
||||
<0 140 4>, /* Rx desc ring id #13 IRQ info */
|
||||
<0 141 4>, /* Rx desc ring id #14 IRQ info */
|
||||
<0 142 4>, /* Rx desc ring id #15 IRQ info */
|
||||
<0 191 4>, /* Misc error IRQ info */
|
||||
<0 160 4>, /* PPEDS Node #1(TxComp ring id #1) TxComplete IRQ info */
|
||||
<0 128 4>, /* PPEDS Node #1(Rx Desc ring id #1) Rx Desc IRQ info */
|
||||
<0 152 4>, /* PPEDS Node #1(RxFill Desc ring id #1) Rx Fill IRQ info */
|
||||
<0 161 4>, /* PPEDS Node #2(TxComp ring id #2) TxComplete IRQ info */
|
||||
<0 129 4>, /* PPEDS Node #2(Rx Desc ring id #2) Rx Desc IRQ info */
|
||||
<0 153 4>, /* PPEDS Node #2(RxFill Desc ring id #2) Rx Fill IRQ info */
|
||||
<0 175 4>, /* MHT port Tx complete ring id #16 IRQ info */
|
||||
<0 176 4>, /* MHT port Tx complete ring id #17 IRQ info */
|
||||
<0 177 4>, /* MHT port Tx complete ring id #18 IRQ info */
|
||||
<0 178 4>, /* MHT port Tx complete ring id #19 IRQ info */
|
||||
<0 179 4>, /* MHT port Tx complete ring id #20 IRQ info */
|
||||
<0 180 4>, /* MHT port Tx complete ring id #21 IRQ info */
|
||||
<0 181 4>, /* MHT port Tx complete ring id #22 IRQ info */
|
||||
<0 182 4>; /* MHT port Tx complete ring id #23 IRQ info */
|
||||
};
|
||||
|
||||
wsi: wsi {
|
||||
id = <0>;
|
||||
num_chip = <3>;
|
||||
status = "okay";
|
||||
chip_info = <0 2 1 2>,
|
||||
<1 2 2 0>,
|
||||
<2 2 0 1>;
|
||||
};
|
||||
|
||||
q6v5_wcss: remoteproc@d100000 {
|
||||
boot-args = <0x1 0x4 0x3 0x1 0x2f 0x2>,
|
||||
<0x1 0x4 0x4 0x2 0x2c 0x2>;
|
||||
memory-region = <&q6_mem_regions>,
|
||||
<&mlo_global_mem0>;
|
||||
|
||||
/delete-node/ remoteproc_pd1;
|
||||
/delete-node/ remoteproc_pd2;
|
||||
/delete-node/ remoteproc_pd3;
|
||||
|
||||
q6_wcss_pd4: remoteproc_pd4 {
|
||||
compatible = "qcom,ipq5332-mpd-upd-text";
|
||||
firmware = "IPQ5332/q6_fw4.mdt";
|
||||
|
||||
q6_wcss_pd1: remoteproc_pd1 {
|
||||
compatible = "qcom,ipq5332-wcss-ahb-mpd";
|
||||
firmware = "IPQ5332/q6_fw1.mdt";
|
||||
m3_firmware = "IPQ5332/iu_fw.mdt";
|
||||
interrupts-extended = <&wcss_smp2p_in 8 0>,
|
||||
<&wcss_smp2p_in 9 0>,
|
||||
<&wcss_smp2p_in 12 0>,
|
||||
<&wcss_smp2p_in 11 0>;
|
||||
interrupt-names = "fatal",
|
||||
"ready",
|
||||
"spawn-ack",
|
||||
"stop-ack";
|
||||
|
||||
qcom,smem-states = <&wcss_smp2p_out 8>,
|
||||
<&wcss_smp2p_out 9>,
|
||||
<&wcss_smp2p_out 10>;
|
||||
qcom,smem-state-names = "shutdown",
|
||||
"stop",
|
||||
"spawn";
|
||||
};
|
||||
|
||||
q6_wcss_pd2: remoteproc_pd2 {
|
||||
compatible = "qcom,ipq5332-wcss-pcie-mpd";
|
||||
firmware = "IPQ5332/q6_fw2.mdt";
|
||||
m3_firmware = "qcn6432/iu_fw.mdt";
|
||||
interrupts-extended = <&wcss_smp2p_in 16 0>,
|
||||
<&wcss_smp2p_in 17 0>,
|
||||
<&wcss_smp2p_in 20 0>,
|
||||
<&wcss_smp2p_in 19 0>;
|
||||
interrupt-names = "fatal",
|
||||
"ready",
|
||||
"spawn-ack",
|
||||
"stop-ack";
|
||||
|
||||
qcom,smem-states = <&wcss_smp2p_out 16>,
|
||||
<&wcss_smp2p_out 17>,
|
||||
<&wcss_smp2p_out 18>;
|
||||
qcom,smem-state-names = "shutdown",
|
||||
"stop",
|
||||
"spawn";
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
q6_wcss_pd3: remoteproc_pd3 {
|
||||
compatible = "qcom,ipq5332-wcss-pcie-mpd";
|
||||
firmware = "IPQ5332/q6_fw3.mdt";
|
||||
interrupts-extended = <&wcss_smp2p_in 24 0>,
|
||||
<&wcss_smp2p_in 25 0>,
|
||||
<&wcss_smp2p_in 28 0>,
|
||||
<&wcss_smp2p_in 27 0>;
|
||||
interrupt-names = "fatal",
|
||||
"ready",
|
||||
"spawn-ack",
|
||||
"stop-ack";
|
||||
|
||||
qcom,smem-states = <&wcss_smp2p_out 24>,
|
||||
<&wcss_smp2p_out 25>,
|
||||
<&wcss_smp2p_out 26>;
|
||||
qcom,smem-state-names = "shutdown",
|
||||
"stop",
|
||||
"spawn";
|
||||
status = "ok";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&blsp1_uart0 {
|
||||
pinctrl-0 = <&serial_0_pins>;
|
||||
pinctrl-names = "default";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&blsp1_uart1 {
|
||||
pinctrl-0 = <&serial_1_pins>;
|
||||
pinctrl-names = "default";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&sleep_clk {
|
||||
clock-frequency = <32000>;
|
||||
};
|
||||
|
||||
&xo {
|
||||
clock-frequency = <24000000>;
|
||||
};
|
||||
|
||||
&qpic_bam {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&qpic_nand {
|
||||
pinctrl-0 = <&qspi_default_state>;
|
||||
pinctrl-names = "default";
|
||||
status = "okay";
|
||||
|
||||
nandcs@0 {
|
||||
reg = <0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
nand-ecc-strength = <8>;
|
||||
nand-ecc-step-size = <512>;
|
||||
nand-bus-width = <8>;
|
||||
};
|
||||
};
|
||||
|
||||
&tlmm {
|
||||
qspi_default_state: qspi-default-state {
|
||||
qspi_clock {
|
||||
pins = "gpio13";
|
||||
function = "qspi_clk";
|
||||
drive-strength = <8>;
|
||||
bias-pull-down;
|
||||
};
|
||||
|
||||
qspi_cs {
|
||||
pins = "gpio12";
|
||||
function = "qspi_cs";
|
||||
drive-strength = <8>;
|
||||
bias-pull-up;
|
||||
};
|
||||
|
||||
qspi_data {
|
||||
pins = "gpio8", "gpio9", "gpio10", "gpio11";
|
||||
function = "qspi_data";
|
||||
drive-strength = <8>;
|
||||
bias-pull-down;
|
||||
};
|
||||
};
|
||||
|
||||
pwm_pins: pwm_pinmux {
|
||||
/* PWM LED GREEN */
|
||||
mux_1 {
|
||||
pins = "gpio30";
|
||||
function = "pwm1";
|
||||
drive-strength = <8>;
|
||||
};
|
||||
/* PWM LED BLUE */
|
||||
mux_2 {
|
||||
pins = "gpio31";
|
||||
function = "pwm1";
|
||||
drive-strength = <8>;
|
||||
};
|
||||
/* PWM LED RED */
|
||||
mux_3 {
|
||||
pins = "gpio29";
|
||||
function = "pwm1";
|
||||
drive-strength = <8>;
|
||||
};
|
||||
};
|
||||
|
||||
serial_1_pins: serial1-pinmux {
|
||||
pins = "gpio33", "gpio34", "gpio35", "gpio36";
|
||||
function = "blsp1_uart2";
|
||||
drive-strength = <8>;
|
||||
bias-pull-up;
|
||||
};
|
||||
|
||||
|
||||
button_pins: button-state {
|
||||
pins = "gpio21";
|
||||
function = "gpio";
|
||||
drive-strength = <8>;
|
||||
bias-pull-up;
|
||||
};
|
||||
|
||||
spi_0_data_clk_pins: spi-0-data-clk-state {
|
||||
pins = "gpio14", "gpio15", "gpio16";
|
||||
function = "blsp0_spi";
|
||||
drive-strength = <2>;
|
||||
bias-pull-down;
|
||||
};
|
||||
|
||||
spi_0_cs_pins: spi-0-cs-state {
|
||||
pins = "gpio17";
|
||||
function = "blsp0_spi";
|
||||
drive-strength = <2>;
|
||||
bias-pull-up;
|
||||
};
|
||||
|
||||
mdio1_pins: mdio1-state {
|
||||
mux_0 {
|
||||
pins = "gpio27";
|
||||
function = "mdc1";
|
||||
drive-strength = <2>;
|
||||
bias-pull-up;
|
||||
};
|
||||
mux_1 {
|
||||
pins = "gpio28";
|
||||
function = "mdio1";
|
||||
drive-strength = <2>;
|
||||
bias-pull-up;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&license_manager {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pwm {
|
||||
pinctrl-0 = <&pwm_pins>;
|
||||
used-pwm-indices = <1>, <1>, <0>, <1>;
|
||||
pinctrl-names = "default";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&hs_m31phy_0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&wifi0 {
|
||||
qcom,multipd_arch;
|
||||
qcom,rproc = <&q6_wcss_pd1>;
|
||||
qcom,rproc_rpd = <&q6v5_wcss>;
|
||||
qcom,userpd-subsys-name = "q6v5_wcss_userpd1";
|
||||
qcom,tgt-mem-mode = <0>;
|
||||
qcom,bdf-addr = <0x4C200000 0x4C200000 0x4C200000 0x0 0x0 0x0>;
|
||||
qcom,caldb-addr = <0x4D900000 0x4D900000 0x4D900000 0x0 0x0 0x0>;
|
||||
qcom,caldb-size = <0x500000>;
|
||||
qcom,board_id = <0x41>;
|
||||
mem-region = <&q6_ipq5332_data>;
|
||||
memory-region = <&q6_ipq5332_data>;
|
||||
qcom,wsi = <&wsi>;
|
||||
qcom,wsi_index = <0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&wifi1 {
|
||||
qcom,multipd_arch;
|
||||
qcom,rproc = <&q6_wcss_pd2>;
|
||||
qcom,rproc_rpd = <&q6v5_wcss>;
|
||||
qcom,userpd-subsys-name = "q6v5_wcss_userpd2";
|
||||
qcom,tgt-mem-mode = <0>;
|
||||
qcom,bdf-addr = <0x4DE00000 0x4DE00000 0x4DE00000 0x0 0x0 0x0>;
|
||||
qcom,caldb-addr = <0x4F500000 0x4F500000 0x4F500000 0x0 0x0 0x0>;
|
||||
qcom,umac-irq-reset-addr = <0x20000884>;
|
||||
qcom,caldb-size = <0x500000>;
|
||||
qcom,board_id = <0x061>;
|
||||
mem-region = <&q6_qcn6432_data_1>;
|
||||
memory-region = <&q6_qcn6432_data_1>;
|
||||
qcom,wsi = <&wsi>;
|
||||
qcom,wsi_index = <1>;
|
||||
status = "okay";
|
||||
interrupts = <GIC_SPI 33 IRQ_TYPE_EDGE_RISING>;
|
||||
interrupt-names = "umac_reset";
|
||||
};
|
||||
|
||||
&wifi2 {
|
||||
qcom,multipd_arch;
|
||||
qcom,rproc = <&q6_wcss_pd3>;
|
||||
qcom,rproc_rpd = <&q6v5_wcss>;
|
||||
qcom,userpd-subsys-name = "q6v5_wcss_userpd3";
|
||||
qcom,tgt-mem-mode = <0>;
|
||||
qcom,bdf-addr = <0x4FA00000 0x4FA00000 0x4FA00000 0x0 0x0 0x0>;
|
||||
qcom,caldb-addr = <0x51100000 0x51100000 0x51100000 0x0 0x0 0x0>;
|
||||
qcom,umac-irq-reset-addr = <0x18000884>;
|
||||
qcom,caldb-size = <0x500000>;
|
||||
qcom,board_id = <0x0b1>;
|
||||
mem-region = <&q6_qcn6432_data_2>;
|
||||
memory-region = <&q6_qcn6432_data_2>;
|
||||
qcom,wsi = <&wsi>;
|
||||
qcom,wsi_index = <2>;
|
||||
status = "okay";
|
||||
interrupts = <GIC_SPI 410 IRQ_TYPE_EDGE_RISING>;
|
||||
interrupt-names = "umac_reset";
|
||||
};
|
||||
@@ -64,3 +64,16 @@ define Device/sonicfi_rap750w_311a
|
||||
DEVICE_PACKAGES := ath12k-wifi-sonicfi-rap750w-311a ath12k-firmware-ipq5332-peb
|
||||
endef
|
||||
TARGET_DEVICES += sonicfi_rap750w_311a
|
||||
|
||||
define Device/cig_wf189w
|
||||
DEVICE_TITLE := CIG WF189W
|
||||
DEVICE_DTS := ipq5332-cig-wf189w
|
||||
DEVICE_DTS_DIR := ../dts
|
||||
DEVICE_DTS_CONFIG := config@mi04.1
|
||||
IMAGES := sysupgrade.tar nand-factory.bin nand-factory.ubi
|
||||
IMAGE/sysupgrade.tar := sysupgrade-tar | append-metadata
|
||||
IMAGE/nand-factory.bin := append-ubi | qsdk-ipq-factory-nand
|
||||
IMAGE/nand-factory.ubi := append-ubi
|
||||
DEVICE_PACKAGES := ath12k-wifi-cig-wf189w ath12k-firmware-ipq5332-peb-peb
|
||||
endef
|
||||
TARGET_DEVICES += cig_wf189w
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
From 41861d8524e61b1c350f00c67e0ca8534b73d033 Mon Sep 17 00:00:00 2001
|
||||
From: huangyunxiang <huangyunxiang@cigtech.com>
|
||||
Date: Wed, 9 Apr 2025 10:03:52 +0800
|
||||
Subject: [PATCH] qca-ssdk:Fix QCA8385 Maximum support for 4096 VLAN settings
|
||||
|
||||
---
|
||||
include/init/ssdk_plat.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/include/init/ssdk_plat.h b/init/ssdk_plat.h
|
||||
index 414918a5bd..92596477af 100644
|
||||
--- a/include/init/ssdk_plat.h
|
||||
+++ b/include/init/ssdk_plat.h
|
||||
@@ -174,7 +174,7 @@
|
||||
#define AR8327_NUM_PHYS 5
|
||||
#define AR8327_PORT_CPU 0
|
||||
#define AR8327_NUM_PORTS 7
|
||||
-#define AR8327_MAX_VLANS 128
|
||||
+#define AR8327_MAX_VLANS 4096
|
||||
|
||||
#define MII_PHYADDR_C45 (1<<30)
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -157,15 +157,16 @@ function discover_dhcp() {
|
||||
function redirector_lookup() {
|
||||
const path = '/tmp/ucentral.redirector';
|
||||
ulog(LOG_INFO, 'Contact redirector service\n');
|
||||
let serial = uci.get('ucentral', 'config', 'serial');
|
||||
let serial = uci.get('system', '@system[-1]', 'mac');
|
||||
|
||||
fs.unlink(path);
|
||||
system(`wget http://ucentral.io/${serial} -O /tmp/ucentral.redirector`);
|
||||
system(`curl -k --cert /etc/ucentral/cert.pem --key /etc/ucentral/key.pem --cacert /etc/ucentral/cas.pem https://openlan.keys.tip.build/v1/devices/${serial} --output /tmp/ucentral.redirector`);
|
||||
if (!fs.stat(path))
|
||||
return;
|
||||
let redir = readjsonfile(path);
|
||||
if (redir?.server && redir?.port) {
|
||||
if (gateway_write({ server: redir.server, port: redir.port, valid: false })) {
|
||||
if (redir?.controller_endpoint) {
|
||||
let controller_endpoint = split(redir.controller_endpoint, ':');
|
||||
if (gateway_write({ server: controller_endpoint[0], port: controller_endpoint[1] || 15002, valid: false })) {
|
||||
ulog(LOG_INFO, `Discovered cloud via lookup service ${redir.server}:${redir.port}\n`);
|
||||
client_start();
|
||||
set_state(VALIDATING);
|
||||
|
||||
@@ -4,10 +4,10 @@ PKG_NAME:=ucentral-schema
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE_URL=https://github.com/Telecominfraproject/wlan-ucentral-schema.git
|
||||
PKG_MIRROR_HASH:=d452d91d5df677d91e7ee3c04d8d9bfd66d5fbad58052228b27342bf55bef020
|
||||
PKG_MIRROR_HASH:=fe33f072d7bcbbb14c7c3415e0750699bb5dae8a9af06c59c90c020f8b192a15
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_DATE:=2025-01-27
|
||||
PKG_SOURCE_VERSION:=a2133a8e2ab1c8e2453f8132c9b83f4599fb4a11
|
||||
PKG_SOURCE_VERSION:=5a6d23b76bc51289ae99d22fdf406516b0c630e6
|
||||
PKG_MAINTAINER:=John Crispin <john@phrozen.org>
|
||||
PKG_LICENSE:=BSD-3-Clause
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
hname=$(cat /etc/board.json | jsonfilter -e '@.system.label_macaddr')
|
||||
[ -z "$hname" ] && hname=$(cat /sys/class/net/eth0/address)
|
||||
uci set system.@system[-1].mac=$hname
|
||||
hname=$(echo $hname | tr -d : | awk '{print tolower($0)}')
|
||||
uci set system.@system[-1].hostname=$hname
|
||||
uci set ucentral.config.serial=$hname
|
||||
|
||||
@@ -3,12 +3,6 @@ include $(TOPDIR)/rules.mk
|
||||
PKG_NAME:=ucentral-tools
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_SOURCE_URL=https://github.com/blogic/ucentral-tools.git
|
||||
PKG_MIRROR_HASH:=9ae6a0cd431595871c233550427c4043c2ba7ddb3c5d87e46ab74a03b2b5a947
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE_DATE:=2021-01-28
|
||||
PKG_SOURCE_VERSION:=b013fc636e48d407870a46aaa68a09ed74de8d6f
|
||||
|
||||
PKG_MAINTAINER:=John Crispin <john@phrozen.org>
|
||||
PKG_LICENSE:=BSD-3-Clause
|
||||
|
||||
|
||||
36
feeds/ucentral/ucentral-tools/src/CMakeLists.txt
Normal file
36
feeds/ucentral/ucentral-tools/src/CMakeLists.txt
Normal file
@@ -0,0 +1,36 @@
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
|
||||
PROJECT(openwifi-tools C)
|
||||
INCLUDE(GNUInstallDirs)
|
||||
ADD_DEFINITIONS(-Os -ggdb -Wall -Werror --std=gnu99 -Wmissing-declarations)
|
||||
|
||||
SET(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
|
||||
|
||||
ADD_EXECUTABLE(firstcontact firstcontact.c)
|
||||
TARGET_LINK_LIBRARIES(firstcontact curl crypto ssl ubox)
|
||||
INSTALL(TARGETS firstcontact
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_SBINDIR}
|
||||
)
|
||||
|
||||
ADD_EXECUTABLE(dhcpdiscover dhcpdiscover.c)
|
||||
INSTALL(TARGETS dhcpdiscover
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_SBINDIR}
|
||||
)
|
||||
|
||||
ADD_EXECUTABLE(dnsprobe dnsprobe.c)
|
||||
TARGET_LINK_LIBRARIES(dnsprobe ubox resolv)
|
||||
INSTALL(TARGETS dnsprobe
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_SBINDIR}
|
||||
)
|
||||
|
||||
ADD_EXECUTABLE(radiusprobe radiusprobe.c)
|
||||
TARGET_LINK_LIBRARIES(radiusprobe radcli)
|
||||
INSTALL(TARGETS radiusprobe
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_SBINDIR}
|
||||
)
|
||||
|
||||
ADD_EXECUTABLE(ip-collide ip-collide.c)
|
||||
TARGET_LINK_LIBRARIES(ip-collide ubox)
|
||||
INSTALL(TARGETS ip-collide
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_SBINDIR}
|
||||
)
|
||||
1345
feeds/ucentral/ucentral-tools/src/dhcpdiscover.c
Normal file
1345
feeds/ucentral/ucentral-tools/src/dhcpdiscover.c
Normal file
File diff suppressed because it is too large
Load Diff
690
feeds/ucentral/ucentral-tools/src/dnsprobe.c
Normal file
690
feeds/ucentral/ucentral-tools/src/dnsprobe.c
Normal file
@@ -0,0 +1,690 @@
|
||||
/*
|
||||
* nslookup_lede - musl compatible replacement for busybox nslookup
|
||||
*
|
||||
* Copyright (C) 2017 Jo-Philipp Wich <jo@mein.io>
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
//config:config NSLOOKUP_OPENWRT
|
||||
//config: bool "nslookup_openwrt"
|
||||
//config: depends on !NSLOOKUP
|
||||
//config: default y
|
||||
//config: help
|
||||
//config: nslookup is a tool to query Internet name servers (LEDE flavor).
|
||||
//config:
|
||||
//config:config FEATURE_NSLOOKUP_OPENWRT_LONG_OPTIONS
|
||||
//config: bool "Enable long options"
|
||||
//config: default y
|
||||
//config: depends on NSLOOKUP_OPENWRT && LONG_OPTS
|
||||
//config: help
|
||||
//config: Support long options for the nslookup applet.
|
||||
|
||||
//applet:IF_NSLOOKUP_OPENWRT(APPLET(nslookup, BB_DIR_USR_BIN, BB_SUID_DROP))
|
||||
|
||||
//kbuild:lib-$(CONFIG_NSLOOKUP_OPENWRT) += nslookup_lede.o
|
||||
|
||||
//usage:#define nslookup_lede_trivial_usage
|
||||
//usage: "[HOST] [SERVER]"
|
||||
//usage:#define nslookup_lede_full_usage "\n\n"
|
||||
//usage: "Query the nameserver for the IP address of the given HOST\n"
|
||||
//usage: "optionally using a specified DNS server"
|
||||
//usage:
|
||||
//usage:#define nslookup_lede_example_usage
|
||||
//usage: "$ nslookup localhost\n"
|
||||
//usage: "Server: default\n"
|
||||
//usage: "Address: default\n"
|
||||
//usage: "\n"
|
||||
//usage: "Name: debian\n"
|
||||
//usage: "Address: 127.0.0.1\n"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <resolv.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <time.h>
|
||||
#include <poll.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/socket.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <net/if.h>
|
||||
#include <netdb.h>
|
||||
|
||||
#include <libubox/ulog.h>
|
||||
|
||||
#define ENABLE_FEATURE_IPV6 1
|
||||
|
||||
typedef struct len_and_sockaddr {
|
||||
socklen_t len;
|
||||
union {
|
||||
struct sockaddr sa;
|
||||
struct sockaddr_in sin;
|
||||
#if ENABLE_FEATURE_IPV6
|
||||
struct sockaddr_in6 sin6;
|
||||
#endif
|
||||
} u;
|
||||
} len_and_sockaddr;
|
||||
|
||||
struct ns {
|
||||
const char *name;
|
||||
len_and_sockaddr addr;
|
||||
int failures;
|
||||
int replies;
|
||||
};
|
||||
|
||||
struct query {
|
||||
const char *name;
|
||||
size_t qlen, rlen;
|
||||
unsigned char query[512], reply[512];
|
||||
unsigned long latency;
|
||||
int rcode, n_ns;
|
||||
};
|
||||
|
||||
static const char *rcodes[] = {
|
||||
"NOERROR",
|
||||
"FORMERR",
|
||||
"SERVFAIL",
|
||||
"NXDOMAIN",
|
||||
"NOTIMP",
|
||||
"REFUSED",
|
||||
"YXDOMAIN",
|
||||
"YXRRSET",
|
||||
"NXRRSET",
|
||||
"NOTAUTH",
|
||||
"NOTZONE",
|
||||
"RESERVED11",
|
||||
"RESERVED12",
|
||||
"RESERVED13",
|
||||
"RESERVED14",
|
||||
"RESERVED15",
|
||||
"BADVERS"
|
||||
};
|
||||
|
||||
static unsigned int default_port = 53;
|
||||
static unsigned int default_retry = 1;
|
||||
static unsigned int default_timeout = 2;
|
||||
|
||||
|
||||
static int parse_reply(const unsigned char *msg, size_t len, int *bb_style_counter)
|
||||
{
|
||||
ns_msg handle;
|
||||
ns_rr rr;
|
||||
int i, n, rdlen;
|
||||
const char *format = NULL;
|
||||
char astr[INET6_ADDRSTRLEN], dname[MAXDNAME];
|
||||
const unsigned char *cp;
|
||||
|
||||
if (ns_initparse(msg, len, &handle) != 0) {
|
||||
//fprintf(stderr, "Unable to parse reply: %s\n", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (i = 0; i < ns_msg_count(handle, ns_s_an); i++) {
|
||||
if (ns_parserr(&handle, ns_s_an, i, &rr) != 0) {
|
||||
//fprintf(stderr, "Unable to parse resource record: %s\n", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
rdlen = ns_rr_rdlen(rr);
|
||||
|
||||
switch (ns_rr_type(rr))
|
||||
{
|
||||
case ns_t_a:
|
||||
if (rdlen != 4) {
|
||||
//fprintf(stderr, "Unexpected A record length\n");
|
||||
return -1;
|
||||
}
|
||||
inet_ntop(AF_INET, ns_rr_rdata(rr), astr, sizeof(astr));
|
||||
printf("Name:\t%s\nAddress: %s\n", ns_rr_name(rr), astr);
|
||||
break;
|
||||
|
||||
#if ENABLE_FEATURE_IPV6
|
||||
case ns_t_aaaa:
|
||||
if (rdlen != 16) {
|
||||
//fprintf(stderr, "Unexpected AAAA record length\n");
|
||||
return -1;
|
||||
}
|
||||
inet_ntop(AF_INET6, ns_rr_rdata(rr), astr, sizeof(astr));
|
||||
printf("%s\thas AAAA address %s\n", ns_rr_name(rr), astr);
|
||||
break;
|
||||
#endif
|
||||
|
||||
case ns_t_ns:
|
||||
if (!format)
|
||||
format = "%s\tnameserver = %s\n";
|
||||
/* fall through */
|
||||
|
||||
case ns_t_cname:
|
||||
if (!format)
|
||||
format = "%s\tcanonical name = %s\n";
|
||||
/* fall through */
|
||||
|
||||
case ns_t_ptr:
|
||||
if (!format)
|
||||
format = "%s\tname = %s\n";
|
||||
if (ns_name_uncompress(ns_msg_base(handle), ns_msg_end(handle),
|
||||
ns_rr_rdata(rr), dname, sizeof(dname)) < 0) {
|
||||
//fprintf(stderr, "Unable to uncompress domain: %s\n", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
printf(format, ns_rr_name(rr), dname);
|
||||
break;
|
||||
|
||||
case ns_t_mx:
|
||||
if (rdlen < 2) {
|
||||
fprintf(stderr, "MX record too short\n");
|
||||
return -1;
|
||||
}
|
||||
n = ns_get16(ns_rr_rdata(rr));
|
||||
if (ns_name_uncompress(ns_msg_base(handle), ns_msg_end(handle),
|
||||
ns_rr_rdata(rr) + 2, dname, sizeof(dname)) < 0) {
|
||||
//fprintf(stderr, "Cannot uncompress MX domain: %s\n", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
printf("%s\tmail exchanger = %d %s\n", ns_rr_name(rr), n, dname);
|
||||
break;
|
||||
|
||||
case ns_t_txt:
|
||||
if (rdlen < 1) {
|
||||
//fprintf(stderr, "TXT record too short\n");
|
||||
return -1;
|
||||
}
|
||||
n = *(unsigned char *)ns_rr_rdata(rr);
|
||||
if (n > 0) {
|
||||
memset(dname, 0, sizeof(dname));
|
||||
memcpy(dname, ns_rr_rdata(rr) + 1, n);
|
||||
printf("%s\ttext = \"%s\"\n", ns_rr_name(rr), dname);
|
||||
}
|
||||
break;
|
||||
|
||||
case ns_t_soa:
|
||||
if (rdlen < 20) {
|
||||
//fprintf(stderr, "SOA record too short\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("%s\n", ns_rr_name(rr));
|
||||
|
||||
cp = ns_rr_rdata(rr);
|
||||
n = ns_name_uncompress(ns_msg_base(handle), ns_msg_end(handle),
|
||||
cp, dname, sizeof(dname));
|
||||
|
||||
if (n < 0) {
|
||||
//fprintf(stderr, "Unable to uncompress domain: %s\n", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("\torigin = %s\n", dname);
|
||||
cp += n;
|
||||
|
||||
n = ns_name_uncompress(ns_msg_base(handle), ns_msg_end(handle),
|
||||
cp, dname, sizeof(dname));
|
||||
|
||||
if (n < 0) {
|
||||
//fprintf(stderr, "Unable to uncompress domain: %s\n", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("\tmail addr = %s\n", dname);
|
||||
cp += n;
|
||||
|
||||
printf("\tserial = %lu\n", ns_get32(cp));
|
||||
cp += 4;
|
||||
|
||||
printf("\trefresh = %lu\n", ns_get32(cp));
|
||||
cp += 4;
|
||||
|
||||
printf("\tretry = %lu\n", ns_get32(cp));
|
||||
cp += 4;
|
||||
|
||||
printf("\texpire = %lu\n", ns_get32(cp));
|
||||
cp += 4;
|
||||
|
||||
printf("\tminimum = %lu\n", ns_get32(cp));
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
static int parse_nsaddr(const char *addrstr, len_and_sockaddr *lsa)
|
||||
{
|
||||
char *eptr, *hash, ifname[IFNAMSIZ];
|
||||
unsigned int port = default_port;
|
||||
unsigned int scope = 0;
|
||||
|
||||
hash = strchr(addrstr, '#');
|
||||
|
||||
if (hash) {
|
||||
*hash++ = '\0';
|
||||
port = strtoul(hash, &eptr, 10);
|
||||
|
||||
if (eptr == hash || *eptr != '\0' || port > 65535) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
hash = strchr(addrstr, '%');
|
||||
|
||||
if (hash) {
|
||||
for (eptr = ++hash; *eptr != '\0' && *eptr != '#'; eptr++) {
|
||||
if ((eptr - hash) >= IFNAMSIZ) {
|
||||
errno = ENODEV;
|
||||
return -1;
|
||||
}
|
||||
|
||||
ifname[eptr - hash] = *eptr;
|
||||
}
|
||||
|
||||
ifname[eptr - hash] = '\0';
|
||||
scope = if_nametoindex(ifname);
|
||||
|
||||
if (scope == 0) {
|
||||
errno = ENODEV;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
#if ENABLE_FEATURE_IPV6
|
||||
if (inet_pton(AF_INET6, addrstr, &lsa->u.sin6.sin6_addr)) {
|
||||
lsa->u.sin6.sin6_family = AF_INET6;
|
||||
lsa->u.sin6.sin6_port = htons(port);
|
||||
lsa->u.sin6.sin6_scope_id = scope;
|
||||
lsa->len = sizeof(lsa->u.sin6);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!scope && inet_pton(AF_INET, addrstr, &lsa->u.sin.sin_addr)) {
|
||||
lsa->u.sin.sin_family = AF_INET;
|
||||
lsa->u.sin.sin_port = htons(port);
|
||||
lsa->len = sizeof(lsa->u.sin);
|
||||
return 0;
|
||||
}
|
||||
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
static unsigned long mtime(void)
|
||||
{
|
||||
struct timespec ts;
|
||||
clock_gettime(CLOCK_REALTIME, &ts);
|
||||
return (unsigned long)ts.tv_sec * 1000 + ts.tv_nsec / 1000000;
|
||||
}
|
||||
|
||||
#if ENABLE_FEATURE_IPV6
|
||||
static void to_v4_mapped(len_and_sockaddr *a)
|
||||
{
|
||||
if (a->u.sa.sa_family != AF_INET)
|
||||
return;
|
||||
|
||||
memcpy(a->u.sin6.sin6_addr.s6_addr + 12,
|
||||
&a->u.sin.sin_addr, 4);
|
||||
|
||||
memcpy(a->u.sin6.sin6_addr.s6_addr,
|
||||
"\0\0\0\0\0\0\0\0\0\0\xff\xff", 12);
|
||||
|
||||
a->u.sin6.sin6_family = AF_INET6;
|
||||
a->u.sin6.sin6_flowinfo = 0;
|
||||
a->u.sin6.sin6_scope_id = 0;
|
||||
a->len = sizeof(a->u.sin6);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Function logic borrowed & modified from musl libc, res_msend.c
|
||||
*/
|
||||
|
||||
static int send_queries(struct ns *ns, int n_ns, struct query *queries, int n_queries)
|
||||
{
|
||||
int fd;
|
||||
int timeout = default_timeout * 1000, retry_interval, servfail_retry = 0;
|
||||
len_and_sockaddr from = { };
|
||||
#if ENABLE_FEATURE_IPV6
|
||||
int one = 1;
|
||||
#endif
|
||||
int recvlen = 0;
|
||||
int n_replies = 0;
|
||||
struct pollfd pfd;
|
||||
unsigned long t0, t1, t2;
|
||||
int nn, qn, next_query = 0;
|
||||
|
||||
from.u.sa.sa_family = AF_INET;
|
||||
from.len = sizeof(from.u.sin);
|
||||
|
||||
#if ENABLE_FEATURE_IPV6
|
||||
for (nn = 0; nn < n_ns; nn++) {
|
||||
if (ns[nn].addr.u.sa.sa_family == AF_INET6) {
|
||||
from.u.sa.sa_family = AF_INET6;
|
||||
from.len = sizeof(from.u.sin6);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Get local address and open/bind a socket */
|
||||
fd = socket(from.u.sa.sa_family, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
|
||||
|
||||
#if ENABLE_FEATURE_IPV6
|
||||
/* Handle case where system lacks IPv6 support */
|
||||
if (fd < 0 && from.u.sa.sa_family == AF_INET6 && errno == EAFNOSUPPORT) {
|
||||
fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
|
||||
from.u.sa.sa_family = AF_INET;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
|
||||
if (bind(fd, &from.u.sa, from.len) < 0) {
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
#if ENABLE_FEATURE_IPV6
|
||||
/* Convert any IPv4 addresses in a mixed environment to v4-mapped */
|
||||
if (from.u.sa.sa_family == AF_INET6) {
|
||||
setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one));
|
||||
|
||||
for (nn = 0; nn < n_ns; nn++)
|
||||
to_v4_mapped(&ns[nn].addr);
|
||||
}
|
||||
#endif
|
||||
|
||||
pfd.fd = fd;
|
||||
pfd.events = POLLIN;
|
||||
retry_interval = timeout / default_retry;
|
||||
t0 = t2 = mtime();
|
||||
t1 = t2 - retry_interval;
|
||||
|
||||
for (; t2 - t0 < timeout; t2 = mtime()) {
|
||||
if (t2 - t1 >= retry_interval) {
|
||||
for (qn = 0; qn < n_queries; qn++) {
|
||||
if (queries[qn].rlen)
|
||||
continue;
|
||||
|
||||
for (nn = 0; nn < n_ns; nn++) {
|
||||
sendto(fd, queries[qn].query, queries[qn].qlen,
|
||||
MSG_NOSIGNAL, &ns[nn].addr.u.sa, ns[nn].addr.len);
|
||||
}
|
||||
}
|
||||
|
||||
t1 = t2;
|
||||
servfail_retry = 2 * n_queries;
|
||||
}
|
||||
|
||||
/* Wait for a response, or until time to retry */
|
||||
if (poll(&pfd, 1, t1+retry_interval-t2) <= 0)
|
||||
continue;
|
||||
|
||||
while (1) {
|
||||
recvlen = recvfrom(fd, queries[next_query].reply,
|
||||
sizeof(queries[next_query].reply), 0,
|
||||
&from.u.sa, &from.len);
|
||||
|
||||
/* read error */
|
||||
if (recvlen < 0)
|
||||
break;
|
||||
|
||||
/* Ignore non-identifiable packets */
|
||||
if (recvlen < 4)
|
||||
continue;
|
||||
|
||||
/* Ignore replies from addresses we didn't send to */
|
||||
for (nn = 0; nn < n_ns; nn++)
|
||||
if (memcmp(&from.u.sa, &ns[nn].addr.u.sa, from.len) == 0)
|
||||
break;
|
||||
|
||||
if (nn >= n_ns)
|
||||
continue;
|
||||
|
||||
/* Find which query this answer goes with, if any */
|
||||
for (qn = next_query; qn < n_queries; qn++)
|
||||
if (!memcmp(queries[next_query].reply, queries[qn].query, 2))
|
||||
break;
|
||||
|
||||
if (qn >= n_queries || queries[qn].rlen)
|
||||
continue;
|
||||
|
||||
queries[qn].rcode = queries[next_query].reply[3] & 15;
|
||||
queries[qn].latency = mtime() - t0;
|
||||
queries[qn].n_ns = nn;
|
||||
|
||||
ns[nn].replies++;
|
||||
|
||||
/* Only accept positive or negative responses;
|
||||
* retry immediately on server failure, and ignore
|
||||
* all other codes such as refusal. */
|
||||
switch (queries[qn].rcode) {
|
||||
case 0:
|
||||
case 3:
|
||||
break;
|
||||
|
||||
case 2:
|
||||
if (servfail_retry && servfail_retry--) {
|
||||
ns[nn].failures++;
|
||||
sendto(fd, queries[qn].query, queries[qn].qlen,
|
||||
MSG_NOSIGNAL, &ns[nn].addr.u.sa, ns[nn].addr.len);
|
||||
}
|
||||
/* fall through */
|
||||
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Store answer */
|
||||
n_replies++;
|
||||
|
||||
queries[qn].rlen = recvlen;
|
||||
|
||||
if (qn == next_query) {
|
||||
while (next_query < n_queries) {
|
||||
if (!queries[next_query].rlen)
|
||||
break;
|
||||
|
||||
next_query++;
|
||||
}
|
||||
}
|
||||
else {
|
||||
memcpy(queries[qn].reply, queries[next_query].reply, recvlen);
|
||||
}
|
||||
|
||||
if (next_query >= n_queries)
|
||||
return n_replies;
|
||||
}
|
||||
}
|
||||
|
||||
return n_replies;
|
||||
}
|
||||
|
||||
static struct ns *add_ns(struct ns **ns, int *n_ns, const char *addr)
|
||||
{
|
||||
char portstr[sizeof("65535")], *p;
|
||||
len_and_sockaddr a = { };
|
||||
struct ns *tmp;
|
||||
struct addrinfo *ai, *aip, hints = {
|
||||
.ai_flags = AI_NUMERICSERV,
|
||||
.ai_socktype = SOCK_DGRAM
|
||||
};
|
||||
|
||||
if (parse_nsaddr(addr, &a)) {
|
||||
/* Maybe we got a domain name, attempt to resolve it using the standard
|
||||
* resolver routines */
|
||||
|
||||
p = strchr(addr, '#');
|
||||
snprintf(portstr, sizeof(portstr), "%hu",
|
||||
(unsigned short)(p ? strtoul(p, NULL, 10) : default_port));
|
||||
|
||||
if (!getaddrinfo(addr, portstr, &hints, &ai)) {
|
||||
for (aip = ai; aip; aip = aip->ai_next) {
|
||||
if (aip->ai_addr->sa_family != AF_INET &&
|
||||
aip->ai_addr->sa_family != AF_INET6)
|
||||
continue;
|
||||
|
||||
#if ! ENABLE_FEATURE_IPV6
|
||||
if (aip->ai_addr->sa_family != AF_INET)
|
||||
continue;
|
||||
#endif
|
||||
|
||||
tmp = realloc(*ns, sizeof(**ns) * (*n_ns + 1));
|
||||
|
||||
if (!tmp)
|
||||
return NULL;
|
||||
|
||||
*ns = tmp;
|
||||
|
||||
(*ns)[*n_ns].name = addr;
|
||||
(*ns)[*n_ns].replies = 0;
|
||||
(*ns)[*n_ns].failures = 0;
|
||||
(*ns)[*n_ns].addr.len = aip->ai_addrlen;
|
||||
|
||||
memcpy(&(*ns)[*n_ns].addr.u.sa, aip->ai_addr, aip->ai_addrlen);
|
||||
|
||||
(*n_ns)++;
|
||||
}
|
||||
|
||||
freeaddrinfo(ai);
|
||||
|
||||
return &(*ns)[*n_ns];
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
tmp = realloc(*ns, sizeof(**ns) * (*n_ns + 1));
|
||||
|
||||
if (!tmp)
|
||||
return NULL;
|
||||
|
||||
*ns = tmp;
|
||||
|
||||
(*ns)[*n_ns].addr = a;
|
||||
(*ns)[*n_ns].name = addr;
|
||||
(*ns)[*n_ns].replies = 0;
|
||||
(*ns)[*n_ns].failures = 0;
|
||||
|
||||
return &(*ns)[(*n_ns)++];
|
||||
}
|
||||
|
||||
static struct query *add_query(struct query **queries, int *n_queries,
|
||||
int type, const char *dname)
|
||||
{
|
||||
struct query *tmp;
|
||||
ssize_t qlen;
|
||||
|
||||
tmp = realloc(*queries, sizeof(**queries) * (*n_queries + 1));
|
||||
|
||||
if (!tmp)
|
||||
return NULL;
|
||||
|
||||
memset(&tmp[*n_queries], 0, sizeof(*tmp));
|
||||
|
||||
qlen = res_mkquery(QUERY, dname, C_IN, type, NULL, 0, NULL,
|
||||
tmp[*n_queries].query, sizeof(tmp[*n_queries].query));
|
||||
|
||||
tmp[*n_queries].qlen = qlen;
|
||||
tmp[*n_queries].name = dname;
|
||||
*queries = tmp;
|
||||
|
||||
return &tmp[(*n_queries)++];
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int rc = 1;
|
||||
struct ns *ns = NULL;
|
||||
struct query *queries = NULL;
|
||||
int n_ns = 0, n_queries = 0;
|
||||
int c = 0;
|
||||
|
||||
char *url = "telecominfraproject.com";
|
||||
char *server = "127.0.0.1";
|
||||
int v6 = 0;
|
||||
|
||||
while (1) {
|
||||
int option = getopt(argc, argv, "u:s:i:6");
|
||||
|
||||
if (option == -1)
|
||||
break;
|
||||
|
||||
switch (option) {
|
||||
case '6':
|
||||
v6 = 1;
|
||||
break;
|
||||
case 'u':
|
||||
url = optarg;
|
||||
break;
|
||||
case 's':
|
||||
server = optarg;
|
||||
break;
|
||||
default:
|
||||
case 'h':
|
||||
printf("Usage: dnsprobe OPTIONS\n"
|
||||
" -6 - use ipv6\n"
|
||||
" -u <url>\n"
|
||||
" -s <server>\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
ulog_open(ULOG_SYSLOG | ULOG_STDIO, LOG_DAEMON, "dnsprobe");
|
||||
|
||||
ULOG_INFO("attempting to probe dns - %s %s %s\n",
|
||||
url, server, v6 ? "ipv6" : "");
|
||||
|
||||
|
||||
add_query(&queries, &n_queries, v6 ? T_AAAA : T_A, url);
|
||||
|
||||
add_ns(&ns, &n_ns, server);
|
||||
|
||||
rc = send_queries(&ns[0], 1, queries, n_queries);
|
||||
if (rc <= 0) {
|
||||
fprintf(stderr, "Failed to send queries: %s\n", strerror(errno));
|
||||
rc = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (queries[0].rcode != 0) {
|
||||
printf("** server can't find %s: %s\n", queries[0].name,
|
||||
rcodes[queries[0].rcode]);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (queries[0].rlen) {
|
||||
c = parse_reply(queries[0].reply, queries[0].rlen, NULL);
|
||||
}
|
||||
|
||||
if (c == 0)
|
||||
printf("*** Can't find %s: No answer\n", queries[0].name);
|
||||
else if (c < 0)
|
||||
printf("*** Can't find %s: Parse error\n", queries[0].name);
|
||||
else
|
||||
rc = 0;
|
||||
|
||||
out:
|
||||
if (n_ns)
|
||||
free(ns);
|
||||
|
||||
if (n_queries)
|
||||
free(queries);
|
||||
|
||||
return rc;
|
||||
}
|
||||
100
feeds/ucentral/ucentral-tools/src/firstcontact.c
Normal file
100
feeds/ucentral/ucentral-tools/src/firstcontact.c
Normal file
@@ -0,0 +1,100 @@
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <getopt.h>
|
||||
|
||||
#include <curl/curl.h>
|
||||
|
||||
#include <libubox/ulog.h>
|
||||
|
||||
static const char *file_cert = "/etc/open-wifi/client.pem";
|
||||
static const char *file_key = "/etc/open-wifi/client_dec.key";
|
||||
static const char *file_json = "/etc/open-wifi/redirector.json";
|
||||
static const char *file_dbg = "/tmp/firstcontact.hdr";
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
FILE *fp_json;
|
||||
FILE *fp_dbg;
|
||||
CURLcode res;
|
||||
CURL *curl;
|
||||
char *devid = NULL;
|
||||
char *url;
|
||||
|
||||
while (1) {
|
||||
int option = getopt(argc, argv, "k:c:o:hi:");
|
||||
|
||||
if (option == -1)
|
||||
break;
|
||||
|
||||
switch (option) {
|
||||
case 'k':
|
||||
file_key = optarg;
|
||||
break;
|
||||
case 'c':
|
||||
file_cert = optarg;
|
||||
break;
|
||||
case 'o':
|
||||
file_json = optarg;
|
||||
break;
|
||||
case 'i':
|
||||
devid = optarg;
|
||||
break;
|
||||
default:
|
||||
case 'h':
|
||||
printf("Usage: firstcontact OPTIONS\n"
|
||||
" -k <keyfile>\n"
|
||||
" -c <certfile>\n"
|
||||
" -o <outfile>\n"
|
||||
" -i <devid>\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (!devid) {
|
||||
fprintf(stderr, "missing devid\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
ulog_open(ULOG_SYSLOG | ULOG_STDIO, LOG_DAEMON, "firstcontact");
|
||||
ULOG_INFO("attempting first contact\n");
|
||||
|
||||
fp_dbg = fopen(file_dbg, "wb");
|
||||
fp_json = fopen(file_json, "wb");
|
||||
if (!fp_json) {
|
||||
ULOG_ERR("failed to create %s\n", file_json);
|
||||
return -1;
|
||||
}
|
||||
|
||||
curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||
curl = curl_easy_init();
|
||||
if (!curl) {
|
||||
ULOG_ERR("curl_easy_init failed\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (asprintf(&url, "https://clientauth.demo.one.digicert.com/iot/api/v2/device/%s", devid) < 0) {
|
||||
ULOG_ERR("failed to assemble url\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_URL, url);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp_json);
|
||||
curl_easy_setopt(curl, CURLOPT_HEADERDATA, fp_dbg);
|
||||
curl_easy_setopt(curl, CURLOPT_SSLCERTTYPE, "PEM");
|
||||
curl_easy_setopt(curl, CURLOPT_SSLCERT, file_cert);
|
||||
curl_easy_setopt(curl, CURLOPT_SSLKEYTYPE, "PEM");
|
||||
curl_easy_setopt(curl, CURLOPT_SSLKEY, file_key);
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
|
||||
|
||||
res = curl_easy_perform(curl);
|
||||
if (res != CURLE_OK)
|
||||
ULOG_ERR("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
|
||||
else
|
||||
ULOG_INFO("downloaded first contact data\n");
|
||||
curl_easy_cleanup(curl);
|
||||
curl_global_cleanup();
|
||||
|
||||
ulog_close();
|
||||
|
||||
return (res != CURLE_OK);
|
||||
}
|
||||
86
feeds/ucentral/ucentral-tools/src/ip-collide.c
Normal file
86
feeds/ucentral/ucentral-tools/src/ip-collide.c
Normal file
@@ -0,0 +1,86 @@
|
||||
#include <arpa/inet.h>
|
||||
#include <net/if.h>
|
||||
|
||||
#include <libubox/list.h>
|
||||
#include <libubox/ulog.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
struct route {
|
||||
struct list_head list;
|
||||
char devname[64];
|
||||
uint32_t domain;
|
||||
uint32_t mask;
|
||||
};
|
||||
|
||||
static struct list_head routes = LIST_HEAD_INIT(routes);
|
||||
|
||||
static int parse_routes(void)
|
||||
{
|
||||
FILE *fp = fopen("/proc/net/route", "r");
|
||||
int flgs, ref, use, metric, mtu, win, ir;
|
||||
struct route *route;
|
||||
unsigned long g;
|
||||
int r;
|
||||
|
||||
r = fscanf(fp, "%*[^\n]\n");
|
||||
if (r < 0) {
|
||||
fprintf(stderr, "failed to parse routes\n");
|
||||
return -1;
|
||||
}
|
||||
while (1) {
|
||||
route = malloc(sizeof(*route));
|
||||
if (!route)
|
||||
break;
|
||||
memset(route, 0, sizeof(*route));
|
||||
r = fscanf(fp, "%63s%x%lx%X%d%d%d%x%d%d%d\n",
|
||||
route->devname, &route->domain, &g, &flgs, &ref, &use, &metric, &route->mask,
|
||||
&mtu, &win, &ir);
|
||||
if (r != 11 && (r < 0) && feof(fp))
|
||||
break;
|
||||
list_add(&route->list, &routes);
|
||||
printf("1 %s %x %x\n", route->devname, ntohl(route->domain), ntohl(route->mask));
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int find_collisions(void)
|
||||
{
|
||||
struct route *route;
|
||||
|
||||
list_for_each_entry(route, &routes, list) {
|
||||
struct route *compare;
|
||||
|
||||
if (!route->domain || !route->mask)
|
||||
continue;
|
||||
list_for_each_entry(compare, &routes, list) {
|
||||
if (!compare->domain || !compare->mask)
|
||||
continue;
|
||||
if (compare == route)
|
||||
continue;
|
||||
if (((route->domain & route->mask) == (compare->domain & route->mask)) ||
|
||||
((route->domain & compare->mask) == (compare->domain & compare->mask))) {
|
||||
ULOG_ERR("collision detected\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
ULOG_INFO("no collision detected\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
ulog_open(ULOG_SYSLOG | ULOG_STDIO, LOG_DAEMON, "ip-collide");
|
||||
|
||||
parse_routes();
|
||||
if (!list_empty(&routes))
|
||||
return find_collisions();
|
||||
|
||||
return 0;
|
||||
}
|
||||
47
feeds/ucentral/ucentral-tools/src/radiusprobe.c
Normal file
47
feeds/ucentral/ucentral-tools/src/radiusprobe.c
Normal file
@@ -0,0 +1,47 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <radcli/radcli.h>
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
int result;
|
||||
char username[128];
|
||||
char passwd[AUTH_PASS_LEN + 1];
|
||||
VALUE_PAIR *send, *received;
|
||||
uint32_t service;
|
||||
rc_handle *rh;
|
||||
|
||||
/* Not needed if you already used openlog() */
|
||||
rc_openlog("radiusprobe");
|
||||
|
||||
if ((rh = rc_read_config("/tmp/radius.conf")) == NULL)
|
||||
return ERROR_RC;
|
||||
|
||||
strcpy(username, "healthcheck");
|
||||
strcpy(passwd, "uCentral");
|
||||
|
||||
send = NULL;
|
||||
|
||||
if (rc_avpair_add(rh, &send, PW_USER_NAME, username, -1, 0) == NULL)
|
||||
return ERROR_RC;
|
||||
|
||||
if (rc_avpair_add(rh, &send, PW_USER_PASSWORD, passwd, -1, 0) == NULL)
|
||||
return ERROR_RC;
|
||||
|
||||
service = PW_AUTHENTICATE_ONLY;
|
||||
if (rc_avpair_add(rh, &send, PW_SERVICE_TYPE, &service, -1, 0) == NULL)
|
||||
return ERROR_RC;
|
||||
|
||||
result = rc_auth(rh, 0, send, &received, NULL);
|
||||
|
||||
if (result == OK_RC || result == REJECT_RC) {
|
||||
fprintf(stderr, "RADIUS server OK\n");
|
||||
result = 0;
|
||||
} else {
|
||||
fprintf(stderr, "RADIUS server failure\n");
|
||||
result = -1;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
44
feeds/ucentral/udhcpinject/Makefile
Normal file
44
feeds/ucentral/udhcpinject/Makefile
Normal file
@@ -0,0 +1,44 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=udhcpinject
|
||||
PKG_VERSION:=1.0
|
||||
PKG_RELEASE:=1
|
||||
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/udhcpinject
|
||||
SECTION:=net
|
||||
CATEGORY:=Network
|
||||
TITLE:=An agent to inject DHCP option
|
||||
DEPENDS:=+libpcap +kmod-ifb +tc
|
||||
MAINTAINER:=kmk <alex18_huang@accton.com>
|
||||
endef
|
||||
|
||||
define Package/udhcpinject/description
|
||||
A utility to insert DHCP option 82 transparently into DHCP Discover packets.
|
||||
The format is as follows:
|
||||
Option 82: (82) Agent Information
|
||||
Option: (1) Agent Circuit ID
|
||||
Agent Circuit ID: BSSID:ESSID
|
||||
Option: (2) Agent Remote ID
|
||||
Agent Remote ID: AP Hostname
|
||||
endef
|
||||
|
||||
define Build/Prepare
|
||||
mkdir -p $(PKG_BUILD_DIR)
|
||||
$(CP) ./src/* $(PKG_BUILD_DIR)/
|
||||
endef
|
||||
|
||||
define Package/udhcpinject/conffiles
|
||||
/etc/config/dhcpinject
|
||||
endef
|
||||
|
||||
define Package/udhcpinject/install
|
||||
$(INSTALL_DIR) $(1)/usr/bin
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/udhcpinject $(1)/usr/bin/
|
||||
$(CP) ./files/* $(1)/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,udhcpinject))
|
||||
107
feeds/ucentral/udhcpinject/README.md
Normal file
107
feeds/ucentral/udhcpinject/README.md
Normal file
@@ -0,0 +1,107 @@
|
||||
# DHCP Option82 injector
|
||||
inject DHCP option 82 transparently on TIP AP
|
||||
|
||||
## Format
|
||||
```
|
||||
Option 82: (82) Agent Information
|
||||
Option: (1) Agent Circuit ID
|
||||
Agent Circuit ID: BSSID:ESSID
|
||||
Option: (2) Agent Remote ID
|
||||
Agent Remote ID: AP Hostname
|
||||
```
|
||||
|
||||
## Usage
|
||||
add "dhcpinject" under ssid->services
|
||||
```json
|
||||
{
|
||||
"interfaces": [
|
||||
{
|
||||
"ethernet": [
|
||||
{
|
||||
"select-ports": [
|
||||
"WAN*"
|
||||
]
|
||||
}
|
||||
],
|
||||
"ipv4": {
|
||||
"addressing": "dynamic"
|
||||
},
|
||||
"name": "WAN",
|
||||
"role": "upstream",
|
||||
"services": [
|
||||
"ssh",
|
||||
"lldp",
|
||||
"dhcp-snooping",
|
||||
"http"
|
||||
],
|
||||
"ssids": [
|
||||
{
|
||||
"bss-mode": "ap",
|
||||
"encryption": {
|
||||
"ieee80211w": "optional",
|
||||
"key": "ERC981206",
|
||||
"proto": "psk2"
|
||||
},
|
||||
"name": "EAP101-ERICHI",
|
||||
"services": [
|
||||
"wifi-frames",
|
||||
"dhcpinject" <-- devices connected to this ssid will trigger this application
|
||||
],
|
||||
"wifi-bands": [
|
||||
"2G",
|
||||
"5G"
|
||||
]
|
||||
},
|
||||
{
|
||||
"bss-mode": "ap",
|
||||
"encryption": {
|
||||
"ieee80211w": "optional",
|
||||
"key": "AKH981016",
|
||||
"proto": "psk2"
|
||||
},
|
||||
"name": "EAP101-AKIHO",
|
||||
"services": [
|
||||
"wifi-frames", <-- devices connected to this ssid will NOT trigger this application
|
||||
],
|
||||
"wifi-bands": [
|
||||
"2G",
|
||||
"5G"
|
||||
]
|
||||
},
|
||||
{
|
||||
"bss-mode": "ap",
|
||||
"encryption": {
|
||||
"ieee80211w": "optional",
|
||||
"key": "DMY971128",
|
||||
"proto": "psk2"
|
||||
},
|
||||
"name": "EAP101-DAMAYU",
|
||||
"services": [
|
||||
"wifi-frames",
|
||||
"dhcpinject" <-- devices connected to this ssid will trigger this application
|
||||
],
|
||||
"wifi-bands": [
|
||||
"2G"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"services": {
|
||||
"dhcp-inject": {
|
||||
"select-ports": [
|
||||
"WAN*" <-- Will fallback to eth0 if no ports are provided
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Workflow
|
||||
Suppose SSID EAP101-ERICHI binds to iface wlan0
|
||||
|
||||
- Application read SSIDs and uplink ports from env variable `$SSIDs` and `$PORTs` (generated by script `/etc/init.d/udhcpinject`)
|
||||
- Apply `tc` on `wlan0` to redirect DHCP Discover/Request to iface `ifb-inject`
|
||||
- Application listen on interface `ifb-inject` for incoming DHCP packets
|
||||
- On packets arrive, application identify the src interface by vlan tag and insert corresponding attribute
|
||||
- Forward packet to up0v0
|
||||
7
feeds/ucentral/udhcpinject/files/etc/config/dhcpinject
Normal file
7
feeds/ucentral/udhcpinject/files/etc/config/dhcpinject
Normal file
@@ -0,0 +1,7 @@
|
||||
# config device 'uplink'
|
||||
# list port 'eth0'
|
||||
#
|
||||
# config ssids 'ssids'
|
||||
# list ssid 'EAP101-ERICHI'
|
||||
# list ssid 'EAP101-AKIHO'
|
||||
# list ssid 'EAP101-DAMAYU'
|
||||
73
feeds/ucentral/udhcpinject/files/etc/init.d/dhcpinject
Executable file
73
feeds/ucentral/udhcpinject/files/etc/init.d/dhcpinject
Executable file
@@ -0,0 +1,73 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
|
||||
USE_PROCD=1
|
||||
|
||||
START=95
|
||||
STOP=10
|
||||
|
||||
SERVICE_NAME="dhcpinject"
|
||||
PROG=/usr/bin/udhcpinject
|
||||
|
||||
start_service() {
|
||||
local ssid_list=""
|
||||
local ssids=""
|
||||
local ports=""
|
||||
|
||||
# Function to process each ssid
|
||||
append_ssid() {
|
||||
local value="$1"
|
||||
if [ -n "$ssids" ]; then
|
||||
ssids="$ssids,$value"
|
||||
else
|
||||
ssids="$value"
|
||||
fi
|
||||
}
|
||||
|
||||
append_port() {
|
||||
local value="$1"
|
||||
if [ -n "$ports" ]; then
|
||||
ports="$ports,$value"
|
||||
else
|
||||
ports="$value"
|
||||
fi
|
||||
}
|
||||
|
||||
# Load the dhcpinject config
|
||||
config_load dhcpinject
|
||||
|
||||
# Get the list of SSIDs
|
||||
config_list_foreach ssids ssid append_ssid
|
||||
|
||||
# Get the list of ports
|
||||
config_list_foreach uplink port append_port
|
||||
|
||||
# Fallback to eth0 if no ports are specified
|
||||
if [ -z "$ports" ]; then
|
||||
ports="eth0"
|
||||
fi
|
||||
|
||||
# Optional: Log or echo for debugging
|
||||
logger -t dhcp_inject "Generated SSIDs=$ssids, Uplink=$ports"
|
||||
|
||||
procd_open_instance "$SERVICE_NAME"
|
||||
procd_set_param command $PROG
|
||||
procd_set_param env SSIDs="$ssids" PORTs="$ports"
|
||||
procd_set_param respawn 3600 10 10
|
||||
procd_set_param file /etc/config/dhcpinject
|
||||
procd_set_param reload_signal SIGHUP
|
||||
procd_close_instance
|
||||
}
|
||||
|
||||
stop_service() {
|
||||
procd_kill $SERVICE_NAME
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
procd_send_signal $SERVICE_NAME
|
||||
}
|
||||
|
||||
restart_service() {
|
||||
stop
|
||||
sleep 1
|
||||
start
|
||||
}
|
||||
16
feeds/ucentral/udhcpinject/src/Makefile
Normal file
16
feeds/ucentral/udhcpinject/src/Makefile
Normal file
@@ -0,0 +1,16 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
TARGET_CFLAGS += -Wall
|
||||
|
||||
obj-y := udhcpinject.o
|
||||
|
||||
all: udhcpinject
|
||||
|
||||
udhcpinject: $(obj-y)
|
||||
$(CC) $(LDFLAGS) -lpcap -o $@ $(obj-y)
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $(CFLAGS) $(TARGET_CFLAGS) -c $< -o $@
|
||||
|
||||
clean:
|
||||
rm -f *.o udhcpinject
|
||||
621
feeds/ucentral/udhcpinject/src/udhcpinject.c
Normal file
621
feeds/ucentral/udhcpinject/src/udhcpinject.c
Normal file
@@ -0,0 +1,621 @@
|
||||
#include <arpa/inet.h>
|
||||
#include <errno.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/if_packet.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/udp.h>
|
||||
#include <net/if.h>
|
||||
#include <netinet/in.h>
|
||||
#include <pcap.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/socket.h>
|
||||
#include <syslog.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "udhcpinject.h"
|
||||
|
||||
#define MAX_INTERFACES 48
|
||||
#define MAX_PORTS 8
|
||||
|
||||
// Global variables
|
||||
struct iface_info *iface_map = NULL;
|
||||
static struct port_info *ports = NULL;
|
||||
int iface_count = 0;
|
||||
int port_count = 0;
|
||||
static pcap_t *handle = NULL;
|
||||
static char *provided_ssids = NULL;
|
||||
static char *provided_ports = NULL;
|
||||
|
||||
// Function to cleanup tc rules
|
||||
void cleanup_tc() {
|
||||
char cmd[1024];
|
||||
for (int i = 0; i < iface_count; i++) {
|
||||
snprintf(cmd, sizeof(cmd), "tc filter del dev %s ingress pref 32 2>/dev/null",
|
||||
iface_map[i].iface);
|
||||
system(cmd);
|
||||
}
|
||||
}
|
||||
|
||||
// Cleanup function
|
||||
void cleanup() {
|
||||
syslog(LOG_INFO, "Cleaning up resources...\n");
|
||||
cleanup_tc();
|
||||
|
||||
if (handle) {
|
||||
pcap_close(handle);
|
||||
handle = NULL;
|
||||
}
|
||||
if (ports) {
|
||||
for (int i = 0; i < port_count; i++) {
|
||||
if (ports[i].sock >= 0) {
|
||||
close(ports[i].sock);
|
||||
}
|
||||
}
|
||||
free(ports);
|
||||
ports = NULL;
|
||||
port_count = 0;
|
||||
}
|
||||
if (iface_map) {
|
||||
free(iface_map);
|
||||
iface_map = NULL;
|
||||
iface_count = 0;
|
||||
}
|
||||
if (provided_ssids) {
|
||||
free(provided_ssids);
|
||||
provided_ssids = NULL;
|
||||
}
|
||||
if (provided_ports) {
|
||||
free(provided_ports);
|
||||
provided_ports = NULL;
|
||||
}
|
||||
syslog(LOG_INFO, "Cleanup complete.\n");
|
||||
}
|
||||
|
||||
// Function to parse SSIDs and populate iface_map
|
||||
int parse_ssids(const char *ssids) {
|
||||
if (iface_map) {
|
||||
free(iface_map);
|
||||
iface_map = NULL;
|
||||
iface_count = 0;
|
||||
}
|
||||
|
||||
// Create a set of provided SSIDs for efficient lookup
|
||||
char ssids_copy[256];
|
||||
strncpy(ssids_copy, ssids, sizeof(ssids_copy) - 1);
|
||||
ssids_copy[sizeof(ssids_copy) - 1] = '\0';
|
||||
|
||||
// Count number of SSIDs for allocation
|
||||
int ssid_count = 1; // Start at 1 for first SSID
|
||||
for (int i = 0; ssids_copy[i]; i++) {
|
||||
if (ssids_copy[i] == ',')
|
||||
ssid_count++;
|
||||
}
|
||||
|
||||
char **ssid_set = malloc(ssid_count * sizeof(char *));
|
||||
if (!ssid_set) {
|
||||
syslog(LOG_ERR, "Failed to allocate memory for SSID set\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
int ssid_idx = 0;
|
||||
char *token = strtok(ssids_copy, ",");
|
||||
while (token) {
|
||||
ssid_set[ssid_idx++] = token;
|
||||
token = strtok(NULL, ",");
|
||||
}
|
||||
|
||||
// Execute iwinfo command and capture output
|
||||
FILE *pipe = popen("iwinfo | grep wlan -A1 | grep -v \"^--\" | tr -d '\"' "
|
||||
"| awk '/wlan/ {name=$1; essid=$3} /Access Point/ "
|
||||
"{print name \"=\" essid \",\" $3}' | tr -d ':'",
|
||||
"r");
|
||||
if (!pipe) {
|
||||
syslog(LOG_ERR, "Failed to execute iwinfo command\n");
|
||||
free(ssid_set);
|
||||
return -1;
|
||||
}
|
||||
|
||||
char line[256];
|
||||
while (fgets(line, sizeof(line), pipe) != NULL) {
|
||||
// Remove trailing newline
|
||||
line[strcspn(line, "\n")] = 0;
|
||||
|
||||
// Parse line format: wlanX=SSID,BSSID
|
||||
char *iface = strtok(line, "=");
|
||||
char *rest = strtok(NULL, "=");
|
||||
if (!iface || !rest)
|
||||
continue;
|
||||
|
||||
char *essid = strtok(rest, ",");
|
||||
char *bssid = strtok(NULL, ",");
|
||||
if (!essid || !bssid)
|
||||
continue;
|
||||
|
||||
// Check if this SSID is in our provided set
|
||||
int match = 0;
|
||||
for (int i = 0; i < ssid_idx; i++) {
|
||||
if (strcmp(essid, ssid_set[i]) == 0) {
|
||||
match = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!match)
|
||||
continue;
|
||||
|
||||
// Add matching interface to iface_map
|
||||
if (iface_count >= MAX_INTERFACES) {
|
||||
syslog(LOG_ERR, "Too many matching interfaces, max is %d\n",
|
||||
MAX_INTERFACES);
|
||||
pclose(pipe);
|
||||
free(ssid_set);
|
||||
return -1;
|
||||
}
|
||||
|
||||
iface_map =
|
||||
realloc(iface_map, (iface_count + 1) * sizeof(struct iface_info));
|
||||
if (!iface_map) {
|
||||
syslog(LOG_ERR, "Failed to reallocate iface_map\n");
|
||||
pclose(pipe);
|
||||
free(ssid_set);
|
||||
return -1;
|
||||
}
|
||||
|
||||
struct iface_info *info = &iface_map[iface_count];
|
||||
info->serial = iface_count + 1;
|
||||
|
||||
strncpy(info->iface, iface, LEN_IFACE);
|
||||
info->iface[LEN_IFACE] = '\0';
|
||||
|
||||
strncpy(info->essid, essid, LEN_ESSID);
|
||||
info->essid[LEN_ESSID] = '\0';
|
||||
|
||||
strncpy(info->bssid, bssid, LEN_BSSID);
|
||||
info->bssid[LEN_BSSID] = '\0';
|
||||
|
||||
iface_count++;
|
||||
}
|
||||
|
||||
int pipe_status = pclose(pipe);
|
||||
if (pipe_status == -1) {
|
||||
syslog(LOG_ERR, "Error closing iwinfo pipe: %s\n", strerror(errno));
|
||||
}
|
||||
|
||||
free(ssid_set);
|
||||
|
||||
if (iface_count == 0) {
|
||||
syslog(LOG_ERR, "No matching interfaces found for provided SSIDs\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
syslog(LOG_INFO, "Found %d matching interfaces\n", iface_count);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int parse_ports(const char *port_list) {
|
||||
if (ports) {
|
||||
for (int i = 0; i < port_count; i++) {
|
||||
if (ports[i].sock >= 0) {
|
||||
close(ports[i].sock);
|
||||
}
|
||||
}
|
||||
free(ports);
|
||||
ports = NULL;
|
||||
port_count = 0;
|
||||
}
|
||||
|
||||
char ports_copy[256];
|
||||
strncpy(ports_copy, port_list, sizeof(ports_copy) - 1);
|
||||
ports_copy[sizeof(ports_copy) - 1] = '\0';
|
||||
|
||||
port_count = 1;
|
||||
for (int i = 0; ports_copy[i]; i++) {
|
||||
if (ports_copy[i] == ',') {
|
||||
port_count++;
|
||||
}
|
||||
}
|
||||
|
||||
if (port_count > MAX_PORTS) {
|
||||
syslog(LOG_ERR, "Too many ports specified, maximum is %d\n", MAX_PORTS);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ports = calloc(port_count, sizeof(struct port_info));
|
||||
if (!ports) {
|
||||
syslog(LOG_ERR, "Failed to allocate memory for ports\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
char *token = strtok(ports_copy, ",");
|
||||
int idx = 0;
|
||||
while (token && idx < port_count) {
|
||||
strncpy(ports[idx].name, token, LEN_IFACE);
|
||||
ports[idx].name[LEN_IFACE] = '\0';
|
||||
|
||||
ports[idx].sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
|
||||
if (ports[idx].sock < 0) {
|
||||
syslog(LOG_ERR, "Socket creation failed for %s: %s\n",
|
||||
ports[idx].name, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
ports[idx].ifindex = if_nametoindex(ports[idx].name);
|
||||
if (ports[idx].ifindex == 0) {
|
||||
syslog(LOG_ERR, "Failed to get interface index for %s: %s\n",
|
||||
ports[idx].name, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
token = strtok(NULL, ",");
|
||||
idx++;
|
||||
}
|
||||
|
||||
syslog(LOG_INFO, "Configured %d ports for forwarding\n", port_count);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int setup_tc() {
|
||||
char cmd[1024];
|
||||
|
||||
snprintf(cmd, sizeof(cmd), "ip link show ifb-inject >/dev/null 2>&1");
|
||||
if (system(cmd) != 0) {
|
||||
snprintf(cmd, sizeof(cmd),
|
||||
"ip link add name ifb-inject type ifb && ip link set "
|
||||
"ifb-inject up");
|
||||
if (system(cmd) != 0) {
|
||||
syslog(LOG_ERR, "Failed to setup ifb-inject\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < iface_count; i++) {
|
||||
snprintf(cmd, sizeof(cmd), "tc qdisc add dev %s ingress 2>/dev/null 1>2",
|
||||
iface_map[i].iface);
|
||||
int result = system(cmd);
|
||||
if (result == 2) {
|
||||
syslog(LOG_INFO, "Ingress qdisc already exists for %s\n", iface_map[i].iface);
|
||||
}
|
||||
else if (result == 1) {
|
||||
syslog(LOG_ERR, "Failed to add qdisc for %s\n", iface_map[i].iface);
|
||||
return -1;
|
||||
}
|
||||
|
||||
snprintf(cmd, sizeof(cmd),
|
||||
"tc filter add dev %s ingress protocol ip pref 32 u32 "
|
||||
"match ip protocol 17 0xff "
|
||||
"match u16 0x0044 0xffff at 20 "
|
||||
"match u16 0x0043 0xffff at 22 "
|
||||
"match u8 0x01 0xff at 28 "
|
||||
"action vlan push id %d pipe "
|
||||
"action mirred egress mirror dev ifb-inject pipe "
|
||||
"action drop",
|
||||
iface_map[i].iface, iface_map[i].serial);
|
||||
if (system(cmd) != 0) {
|
||||
syslog(LOG_ERR, "Failed to setup tc for %s\n", iface_map[i].iface);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Signal handler
|
||||
void signal_handler(int sig) {
|
||||
if (sig == SIGTERM) {
|
||||
syslog(LOG_INFO, "Received SIGTERM, cleaning up...\n");
|
||||
cleanup();
|
||||
exit(0);
|
||||
} else if (sig == SIGHUP) {
|
||||
syslog(LOG_INFO, "Received reload signal, reconfiguring...\n");
|
||||
sleep(5);
|
||||
// Clean up existing resources
|
||||
cleanup_tc();
|
||||
|
||||
// Free old SSIDs and get new ones
|
||||
if (provided_ssids) {
|
||||
free(provided_ssids);
|
||||
}
|
||||
provided_ssids = getenv("SSIDs");
|
||||
if (!provided_ssids) {
|
||||
syslog(LOG_ERR, "No SSIDs provided on reload\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// Reload SSIDs
|
||||
if (parse_ssids(provided_ssids) != 0) {
|
||||
syslog(LOG_ERR, "Failed to reload SSIDs configuration\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// Free old ports and get new ones
|
||||
if (provided_ports) {
|
||||
free(provided_ports);
|
||||
}
|
||||
provided_ports = getenv("PORTs");
|
||||
if (!provided_ports) {
|
||||
syslog(LOG_ERR, "No PORTs provided on reload\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// Close existing sockets and reopen with new config
|
||||
if (ports) {
|
||||
for (int i = 0; i < port_count; i++) {
|
||||
if (ports[i].sock >= 0) {
|
||||
close(ports[i].sock);
|
||||
}
|
||||
}
|
||||
free(ports);
|
||||
ports = NULL;
|
||||
port_count = 0;
|
||||
}
|
||||
|
||||
// Reload ports
|
||||
if (parse_ports(provided_ports) != 0) {
|
||||
syslog(LOG_ERR, "Failed to reload ports configuration\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// Reapply tc rules
|
||||
if (setup_tc() == 0) {
|
||||
syslog(LOG_INFO, "Reloaded with SSIDs: %s and Ports: %s\n",
|
||||
provided_ssids, provided_ports);
|
||||
} else {
|
||||
syslog(LOG_ERR, "Failed to reload tc configuration\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
char *get_hostname() {
|
||||
static char hostname[256];
|
||||
if (gethostname(hostname, sizeof(hostname)) != 0) {
|
||||
strcpy(hostname, "unknown");
|
||||
}
|
||||
return hostname;
|
||||
}
|
||||
|
||||
struct iface_info *find_iface_info_by_vlan(int vlan_id) {
|
||||
for (int i = 0; i < iface_count; i++) {
|
||||
if (iface_map[i].serial == vlan_id) {
|
||||
return &iface_map[i];
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void process_packet(unsigned char *user, const struct pcap_pkthdr *header,
|
||||
const unsigned char *packet) {
|
||||
int orig_len = header->len;
|
||||
struct ethhdr *eth = (struct ethhdr *)packet;
|
||||
int vlan_id = -1;
|
||||
int eth_offset = sizeof(struct ethhdr);
|
||||
|
||||
if (ntohs(eth->h_proto) != ETH_P_8021Q) {
|
||||
syslog(LOG_DEBUG,
|
||||
"No VLAN header found in packet (EtherType: 0x%04x)\n",
|
||||
ntohs(eth->h_proto));
|
||||
return;
|
||||
}
|
||||
|
||||
struct vlan_hdr *vlan = (struct vlan_hdr *)(packet + eth_offset);
|
||||
vlan_id = ntohs(vlan->h_vlan_TCI) & 0x0FFF;
|
||||
eth_offset += sizeof(struct vlan_hdr);
|
||||
|
||||
struct iface_info *info = find_iface_info_by_vlan(vlan_id);
|
||||
if (!info) {
|
||||
syslog(LOG_ERR, "No interface info found for VLAN ID %d\n", vlan_id);
|
||||
return;
|
||||
}
|
||||
|
||||
char *hostname = get_hostname();
|
||||
int circuit_id_len = strlen(info->bssid) + 1 + strlen(info->essid);
|
||||
int remote_id_len = strlen(hostname);
|
||||
int opt82_len = 2 + 2 + circuit_id_len + 2 + remote_id_len;
|
||||
|
||||
// Find DHCP options end from the end of the packet
|
||||
int ip_offset = eth_offset;
|
||||
struct iphdr *ip = (struct iphdr *)(packet + ip_offset);
|
||||
int udp_offset = ip_offset + (ip->ihl * 4);
|
||||
struct udphdr *udp = (struct udphdr *)(packet + udp_offset);
|
||||
int dhcp_offset = udp_offset + sizeof(struct udphdr);
|
||||
unsigned char *dhcp_start = (unsigned char *)(packet + dhcp_offset);
|
||||
int dhcp_len = ntohs(udp->len) - sizeof(struct udphdr);
|
||||
|
||||
int options_end = -1;
|
||||
for (int i = dhcp_len - 1; i >= 0; i--) {
|
||||
if (dhcp_start[i] == 0xFF) { // End option
|
||||
options_end = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (options_end == -1) {
|
||||
syslog(LOG_DEBUG, "Could not find DHCP options end tag\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// Calculate new packet size: remove VLAN (-4), remove end tag (-1), add
|
||||
// Option 82, add end tag (+1)
|
||||
int orig_options_len = options_end;
|
||||
int new_len = orig_len - 4 - 1 + opt82_len + 1;
|
||||
unsigned char *new_packet = malloc(new_len);
|
||||
if (!new_packet) {
|
||||
syslog(LOG_ERR, "Failed to allocate memory for new packet\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// Copy Ethernet header
|
||||
struct ethhdr *new_eth = (struct ethhdr *)new_packet;
|
||||
memcpy(new_eth, eth, sizeof(struct ethhdr));
|
||||
new_eth->h_proto = vlan->h_vlan_encapsulated_proto;
|
||||
|
||||
// Copy IP header
|
||||
struct iphdr *new_ip = (struct iphdr *)(new_packet + sizeof(struct ethhdr));
|
||||
memcpy(new_ip, ip, ip->ihl * 4);
|
||||
|
||||
// Copy UDP header
|
||||
struct udphdr *new_udp =
|
||||
(struct udphdr *)(new_packet + sizeof(struct ethhdr) + (ip->ihl * 4));
|
||||
memcpy(new_udp, udp, sizeof(struct udphdr));
|
||||
|
||||
// Copy DHCP payload up to options end, add Option 82, add end tag
|
||||
unsigned char *new_dhcp =
|
||||
(unsigned char *)(new_packet + sizeof(struct ethhdr) + (ip->ihl * 4) +
|
||||
sizeof(struct udphdr));
|
||||
memcpy(new_dhcp, dhcp_start, orig_options_len);
|
||||
|
||||
// Add Option 82
|
||||
int opt82_offset = orig_options_len;
|
||||
new_dhcp[opt82_offset++] = 82; // Option code
|
||||
new_dhcp[opt82_offset++] = opt82_len - 2; // Option length
|
||||
|
||||
// Sub-option 1: Circuit ID (BSSID:ESSID)
|
||||
new_dhcp[opt82_offset++] = 1; // Sub-option code
|
||||
new_dhcp[opt82_offset++] = circuit_id_len; // Sub-option length
|
||||
memcpy(new_dhcp + opt82_offset, info->bssid, strlen(info->bssid));
|
||||
opt82_offset += strlen(info->bssid);
|
||||
new_dhcp[opt82_offset++] = ':';
|
||||
memcpy(new_dhcp + opt82_offset, info->essid, strlen(info->essid));
|
||||
opt82_offset += strlen(info->essid);
|
||||
|
||||
// Sub-option 2: Remote ID (hostname)
|
||||
new_dhcp[opt82_offset++] = 2; // Sub-option code
|
||||
new_dhcp[opt82_offset++] = remote_id_len;
|
||||
memcpy(new_dhcp + opt82_offset, hostname, remote_id_len);
|
||||
opt82_offset += remote_id_len;
|
||||
|
||||
// Add end tag
|
||||
new_dhcp[opt82_offset++] = 0xFF;
|
||||
|
||||
// Update lengths
|
||||
new_ip->tot_len = htons(ntohs(ip->tot_len) + opt82_len);
|
||||
new_udp->len = htons(ntohs(udp->len) + opt82_len);
|
||||
|
||||
// Recalculate IP checksum
|
||||
new_ip->check = 0;
|
||||
unsigned int sum = 0;
|
||||
unsigned short *ip_ptr = (unsigned short *)new_ip;
|
||||
for (int i = 0; i < ip->ihl * 2; i++) {
|
||||
sum += *ip_ptr++;
|
||||
}
|
||||
while (sum >> 16) {
|
||||
sum = (sum & 0xFFFF) + (sum >> 16);
|
||||
}
|
||||
new_ip->check = ~sum;
|
||||
|
||||
// Recalculate UDP checksum
|
||||
new_udp->check = 0;
|
||||
sum = 0;
|
||||
// Pseudo-header
|
||||
sum +=
|
||||
(ntohs(new_ip->saddr) & 0xFFFF) + (ntohs(new_ip->saddr >> 16) & 0xFFFF);
|
||||
sum +=
|
||||
(ntohs(new_ip->daddr) & 0xFFFF) + (ntohs(new_ip->daddr >> 16) & 0xFFFF);
|
||||
sum += htons(IPPROTO_UDP);
|
||||
sum += new_udp->len;
|
||||
|
||||
// UDP header and data
|
||||
unsigned char *udp_start = (unsigned char *)new_udp;
|
||||
int udp_total_len = ntohs(new_udp->len);
|
||||
unsigned short *udp_ptr = (unsigned short *)udp_start;
|
||||
for (int i = 0; i < udp_total_len / 2; i++) {
|
||||
sum += *udp_ptr++;
|
||||
}
|
||||
if (udp_total_len % 2) {
|
||||
sum += *(unsigned char *)udp_ptr;
|
||||
}
|
||||
while (sum >> 16) {
|
||||
sum = (sum & 0xFFFF) + (sum >> 16);
|
||||
}
|
||||
new_udp->check = ~sum;
|
||||
if (new_udp->check == 0)
|
||||
new_udp->check = 0xFFFF;
|
||||
|
||||
// Send the packet
|
||||
struct sockaddr_ll socket_address = {0};
|
||||
socket_address.sll_family = AF_PACKET;
|
||||
socket_address.sll_protocol = htons(ETH_P_ALL);
|
||||
|
||||
for (int i = 0; i < port_count; i++) {
|
||||
socket_address.sll_ifindex = ports[i].ifindex;
|
||||
|
||||
if (sendto(ports[i].sock, new_packet, new_len, 0,
|
||||
(struct sockaddr *)&socket_address,
|
||||
sizeof(socket_address)) < 0) {
|
||||
syslog(LOG_ERR, "Failed to send packet to %s: %s\n",
|
||||
ports[i].name, strerror(errno));
|
||||
} else {
|
||||
syslog(LOG_DEBUG,
|
||||
"Successfully forwarded packet to %s (new length: %d)\n",
|
||||
ports[i].name, new_len);
|
||||
}
|
||||
}
|
||||
|
||||
free(new_packet);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
openlog("dhcp_inject:", LOG_PID | LOG_CONS, LOG_DAEMON);
|
||||
|
||||
signal(SIGTERM, signal_handler);
|
||||
signal(SIGHUP, signal_handler);
|
||||
|
||||
sleep(5);
|
||||
|
||||
provided_ssids = getenv("SSIDs");
|
||||
syslog(LOG_INFO, "Provided SSIDs: %s\n", provided_ssids);
|
||||
if (!provided_ssids && argc > 1) {
|
||||
provided_ssids = strdup(argv[1]);
|
||||
}
|
||||
if (!provided_ssids) {
|
||||
syslog(LOG_ERR, "No SSIDs provided. Exiting...\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
provided_ports = getenv("PORTs");
|
||||
syslog(LOG_INFO, "Provided PORTs: %s\n", provided_ports);
|
||||
if (!provided_ports) {
|
||||
syslog(LOG_ERR, "No PORTs provided. Exiting...\n");
|
||||
cleanup();
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (parse_ssids(provided_ssids) != 0) {
|
||||
syslog(LOG_ERR, "Failed to parse SSIDs\n");
|
||||
cleanup();
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (parse_ports(provided_ports) != 0) {
|
||||
syslog(LOG_ERR, "Failed to parse ports\n");
|
||||
cleanup();
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (setup_tc() != 0) {
|
||||
syslog(LOG_ERR, "Setup failed\n");
|
||||
cleanup();
|
||||
return 1;
|
||||
}
|
||||
|
||||
syslog(LOG_INFO, "Setup complete for SSIDs: %s and Ports: %s\n",
|
||||
provided_ssids, provided_ports);
|
||||
|
||||
char errbuf[PCAP_ERRBUF_SIZE];
|
||||
handle = pcap_open_live("ifb-inject", BUFSIZ, 1, 1000, errbuf);
|
||||
if (handle == NULL) {
|
||||
syslog(LOG_ERR, "Couldn't open device ifb-inject: %s\n", errbuf);
|
||||
cleanup();
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (pcap_loop(handle, -1, process_packet, NULL) < 0) {
|
||||
syslog(LOG_ERR, "pcap_loop failed: %s\n", pcap_geterr(handle));
|
||||
cleanup();
|
||||
return 1;
|
||||
}
|
||||
|
||||
cleanup();
|
||||
return 0;
|
||||
}
|
||||
46
feeds/ucentral/udhcpinject/src/udhcpinject.h
Normal file
46
feeds/ucentral/udhcpinject/src/udhcpinject.h
Normal file
@@ -0,0 +1,46 @@
|
||||
#include <stdint.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#define LEN_ESSID 32
|
||||
#define LEN_BSSID 12
|
||||
#define LEN_IFACE 15
|
||||
|
||||
// DHCP header structure
|
||||
struct dhcp_packet {
|
||||
uint8_t op;
|
||||
uint8_t htype;
|
||||
uint8_t hlen;
|
||||
uint8_t hops;
|
||||
uint32_t xid;
|
||||
uint16_t secs;
|
||||
uint16_t flags;
|
||||
struct in_addr ciaddr;
|
||||
struct in_addr yiaddr;
|
||||
struct in_addr siaddr;
|
||||
struct in_addr giaddr;
|
||||
uint8_t chaddr[16];
|
||||
char sname[64];
|
||||
char file[128];
|
||||
uint32_t magic;
|
||||
uint8_t options[];
|
||||
};
|
||||
|
||||
// Structure to hold interface info
|
||||
struct iface_info {
|
||||
char iface[LEN_IFACE + 1];
|
||||
char essid[LEN_ESSID + 1];
|
||||
char bssid[LEN_BSSID + 1];
|
||||
int serial;
|
||||
};
|
||||
|
||||
struct port_info {
|
||||
char name[LEN_IFACE + 1];
|
||||
int sock;
|
||||
int ifindex;
|
||||
};
|
||||
|
||||
// VLAN header structure
|
||||
struct vlan_hdr {
|
||||
__be16 h_vlan_TCI; // VLAN Tag Control Information
|
||||
__be16 h_vlan_encapsulated_proto; // Encapsulated protocol
|
||||
};
|
||||
14
profiles/cig_wf189w.yml
Normal file
14
profiles/cig_wf189w.yml
Normal file
@@ -0,0 +1,14 @@
|
||||
---
|
||||
profile: cig_wf189w
|
||||
target: ipq53xx
|
||||
subtarget: generic
|
||||
description: Build image for the CIG WF189W
|
||||
image: bin/targets/ipq53xx/generic/openwrt-ipq53xx-cig_wf189w-squashfs-sysupgrade.tar
|
||||
feeds:
|
||||
- name: qca
|
||||
path: ../../feeds/qca-wifi-7
|
||||
include:
|
||||
- ucentral-ap
|
||||
packages:
|
||||
- ipq53xx
|
||||
- qca-ssdk-shell
|
||||
Reference in New Issue
Block a user