diff --git a/lib/aprs/aprs_kiss.rb b/lib/aprs/aprs_kiss.rb index 106414bacba6d2dfda34d6f9d8e717b39d04d393..63a935cc81ca9663f7c0e9e6713239b08429448d 100644 --- a/lib/aprs/aprs_kiss.rb +++ b/lib/aprs/aprs_kiss.rb @@ -33,7 +33,28 @@ module Aprs end end end - frame + return nil + end + + private + def self.valid_frame(raw_frame) + frame_len = raw_frame.length + + if frame_len > 16 + (0...frame_len - 2).each do |raw_slice| + # Is address field length correct? + if raw_frame[raw_slice] & 0x01 != 0 and ((raw_slice + 1) % 7) == 0 + i = (raw_slice.to_f + 1.0) / 7.0 + # Less than 2 callsigns? + if 1.0 < i and i < 11.0 + if raw_frame[raw_slice + 1] & 0x03 == 0x03 and [0xf0, 0xcf].include? raw_frame[raw_slice + 2] + return true + end + end + end + end + end + return false end private @@ -143,7 +164,9 @@ module Aprs def write(frame, *args, **kwargs) @lock.synchronize do encoded_frame = AprsKiss.encode_frame(frame) - @data_stream.write(encoded_frame, *args, **kwargs) + if AprsKiss.valid_frame(encoded_frame) + @data_stream.write(encoded_frame, *args, **kwargs) + end end end end diff --git a/test/tc_aprs_kiss.rb b/test/tc_aprs_kiss.rb index 2213e70e0ed7a661c936a6250fa408400d5e1f60..c02db7bed60622df447e3732c8cc5bc75565b47a 100644 --- a/test/tc_aprs_kiss.rb +++ b/test/tc_aprs_kiss.rb @@ -78,6 +78,7 @@ module Aprs all_raw_frames = kiss_mock.get_sent_to_interface + p all_raw_frames assert_equal 0, all_raw_frames.length end end