+ let mut kiss = self.kiss_buffer.lock().unwrap();
+ let rem = kiss.buf_remaining();
+ let sz = buf.len().min(rem.len());
+ rem[0..sz].copy_from_slice(&buf[0..sz]);
+ kiss.did_write(sz);
+ while let Some(frame) = kiss.next_frame() {
+ if Ok(KissCommand::DataFrame) == frame.command() && frame.port() == Ok(PORT_STREAM) {
+ let mut payload = [0u8; 30];
+ if let Ok(len) = frame.decode_payload(&mut payload) {
+ if len == 30 {
+ let lsf = LsfFrame(payload);
+ let mut to_voice = self.rf_to_voice.lock().unwrap();
+ match &mut *to_voice {
+ Some(to_voice) => to_voice.process_lsf(lsf),
+ None => *to_voice = Some(RfToVoice::new(lsf)),
+ }
+ } else if len == 26 {
+ let frame_num_part = u16::from_be_bytes([payload[6], payload[7]]);
+ let frame = StreamFrame {
+ lich_idx: payload[5] >> 5,
+ lich_part: payload[0..5].try_into().unwrap(),
+ frame_number: frame_num_part & 0x7fff,
+ end_of_stream: frame_num_part & 0x8000 > 0,
+ stream_data: payload[8..24].try_into().unwrap(),
+ };
+ let to_voice = self.rf_to_voice.lock().unwrap();
+ if let Some(to_voice) = &*to_voice {
+ let voice = to_voice.process_stream(&frame);
+ if let Some(tx) = self.event_tx.lock().unwrap().as_ref() {
+ let _ = tx.send(TncEvent::TransmitVoice(voice));
+ }
+ }
+ }
+ };
+ } else if Ok(KissCommand::DataFrame) == frame.command()
+ && frame.port() == Ok(PORT_PACKET_BASIC)
+ {
+ // basic packets not supported for now, they will require more config
+ } else if Ok(KissCommand::DataFrame) == frame.command()
+ && frame.port() == Ok(PORT_PACKET_FULL)
+ {
+ let mut payload = [0u8; 855];
+ let Ok(len) = frame.decode_payload(&mut payload) else {
+ continue;
+ };
+ if len < 33 {
+ continue;
+ }
+ let mut lsf = LsfFrame([0u8; 30]);
+ lsf.0.copy_from_slice(&payload[0..30]);
+ if lsf.check_crc() != 0 {
+ continue;
+ }
+ let mut packet = Packet::new();
+ packet.set_link_setup_frame(&lsf);
+ packet.set_payload(&payload[30..]);
+ }
+ }
+ Ok(sz)