OT_WEAK void dll_beacon_applet(m2session* active) { /// Beaconing is a Request-TX operation, and the value for Tc is the amount of /// time to spend in CSMA before quitting the beacon. ot_queue beacon_queue; ot_u8 b_params; ot_u8 cmd_ext; ot_u8 cmd_code; b_params = active->extra; active->extra = 0; /// Start building the beacon packet: /// <LI> Calling m2np_header() will write most of the front of the frame </LI> /// <LI> Add the command byte and optional command-extension byte </LI> m2np_header(active, M2RT_BROADCAST, M2FI_FRDIALOG); cmd_ext = (b_params & 0x06); // Normal extension bits cmd_ext |= (dll.netconf.btemp[2] == 0) << 6; // Announcement No-File bit cmd_code = 0x20 | (b_params & 1) | ((cmd_ext!=0) << 7); q_writebyte(&txq, cmd_code); if (cmd_code) { q_writebyte(&txq, cmd_ext); } /// Setup the comm parameters, if the channel is available: /// <LI> dll.comm values tx_eirp, cs_rssi, and cca_rssi must be set by the /// radio module during the CSMA-CA process -- don't set them here. /// The DASH7 spec requires it to happen in this order. </LI> /// <LI> Set CSMA-CA parameters, which are used by the radio module </LI> /// <LI> Set number of redundant TX's we would like to transmit </LI> /// <LI> Set rx_timeout for Default-Tg or 0, if beacon has no response </LI> dll_set_defaults(active); dll.comm.tc = TI2CLK(M2_PARAM_BEACON_TCA); dll.comm.rx_timeout = (b_params & 0x02) ? \ 0 : rm2_default_tgd(active->channel); dll.comm.csmaca_params |= (b_params & 0x04) | M2_CSMACA_NA2P | M2_CSMACA_MACCA; dll.comm.redundants = dll.netconf.b_attempts; q_writebyte(&txq, (ot_u8)dll.comm.rx_timeout); /// Add the announcement file data if the specified return data != 0 bytes. /// If the beacon data is missing or otherwise not accessible by the GUEST /// user, dump the session (thus killing the beacon) and go back to idle. if (dll.netconf.btemp[2] != 0) { q_init(&beacon_queue, &dll.netconf.btemp[2], 4); if (m2qp_isf_call((b_params & 1), &beacon_queue, AUTH_GUEST) < 0) { session_pop(); dll_idle(); return; } } /// Final step to any packet generation: add footer m2np_footer(); }
OT_WEAK ot_u16 otapi_put_isf_return(ot_u8* status, isfcall_tmpl* isfcall) { ot_queue local_q; ot_u8 lq_data[4]; q_init(&local_q, lq_data, 4); q_writebyte(&local_q, (ot_u8)isfcall->max_return); q_writebyte(&local_q, (ot_u8)isfcall->isf_id); sub_put_isf_offset(isfcall->is_series, isfcall->offset); ///@note user_id is set to NULL here. This stipulates that the API is not /// ever going to be called by a non root user. So, the application /// layer should perform proper authentication of the user if neeeded. *status = (m2qp_isf_call(isfcall->is_series, &local_q, NULL) >= 0); return q_length(&txq); }