int wpas_mbo_ie(struct wpa_supplicant *wpa_s, u8 *buf, size_t len) { struct wpabuf *mbo; int res; if (len < MBO_IE_HEADER + 3 + 7) return 0; /* Leave room for the MBO IE header */ mbo = wpabuf_alloc(len - MBO_IE_HEADER); if (!mbo) return 0; /* Add non-preferred channels attribute */ wpas_mbo_non_pref_chan_attrs(wpa_s, mbo, 0); /* * Send cellular capabilities attribute even if AP does not advertise * cellular capabilities. */ wpabuf_put_u8(mbo, MBO_ATTR_ID_CELL_DATA_CAPA); wpabuf_put_u8(mbo, 1); wpabuf_put_u8(mbo, wpa_s->conf->mbo_cell_capa); res = mbo_add_ie(buf, len, wpabuf_head_u8(mbo), wpabuf_len(mbo)); if (!res) wpa_printf(MSG_ERROR, "Failed to add MBO IE"); wpabuf_free(mbo); return res; }
size_t wpas_mbo_ie_bss_trans_reject(struct wpa_supplicant *wpa_s, u8 *pos, size_t len, enum mbo_transition_reject_reason reason) { u8 reject_attr[3]; reject_attr[0] = MBO_ATTR_ID_TRANSITION_REJECT_REASON; reject_attr[1] = 1; reject_attr[2] = reason; return mbo_add_ie(pos, len, reject_attr, sizeof(reject_attr)); }
u8 * hostapd_eid_mbo(struct hostapd_data *hapd, u8 *eid, size_t len) { u8 mbo[9], *mbo_pos = mbo; u8 *pos = eid; if (!hapd->conf->mbo_enabled && !OCE_STA_CFON_ENABLED(hapd) && !OCE_AP_ENABLED(hapd)) return eid; if (hapd->conf->mbo_enabled) { *mbo_pos++ = MBO_ATTR_ID_AP_CAPA_IND; *mbo_pos++ = 1; /* Not Cellular aware */ *mbo_pos++ = 0; } if (hapd->conf->mbo_enabled && hapd->mbo_assoc_disallow) { *mbo_pos++ = MBO_ATTR_ID_ASSOC_DISALLOW; *mbo_pos++ = 1; *mbo_pos++ = hapd->mbo_assoc_disallow; } if (OCE_STA_CFON_ENABLED(hapd) || OCE_AP_ENABLED(hapd)) { u8 ctrl; ctrl = OCE_RELEASE; if (OCE_STA_CFON_ENABLED(hapd) && !OCE_AP_ENABLED(hapd)) ctrl |= OCE_IS_STA_CFON; *mbo_pos++ = OCE_ATTR_ID_CAPA_IND; *mbo_pos++ = 1; *mbo_pos++ = ctrl; } pos += mbo_add_ie(pos, len, mbo, mbo_pos - mbo); return pos; }
u8 * hostapd_eid_mbo(struct hostapd_data *hapd, u8 *eid, size_t len) { u8 mbo[6], *mbo_pos = mbo; u8 *pos = eid; if (!hapd->conf->mbo_enabled) return eid; *mbo_pos++ = MBO_ATTR_ID_AP_CAPA_IND; *mbo_pos++ = 1; /* Not Cellular aware */ *mbo_pos++ = 0; if (hapd->mbo_assoc_disallow) { *mbo_pos++ = MBO_ATTR_ID_ASSOC_DISALLOW; *mbo_pos++ = 1; *mbo_pos++ = hapd->mbo_assoc_disallow; } pos += mbo_add_ie(pos, len, mbo, mbo_pos - mbo); return pos; }