diff options
author | Eric S. Raymond <esr@thyrsus.com> | 2006-11-30 07:29:25 +0000 |
---|---|---|
committer | Eric S. Raymond <esr@thyrsus.com> | 2006-11-30 07:29:25 +0000 |
commit | 2f6775a8769ed7a2250bb90a68c5fa2617123604 (patch) | |
tree | b0a90a20de3049daf781390419172d628bb83fc0 /isgps.c | |
parent | 1c2b3463912566fa8a5841385a56ed1d966138db (diff) | |
download | gpsd-2f6775a8769ed7a2250bb90a68c5fa2617123604.tar.gz |
Split the packet-sniffer internals out of the session structure.
This is a big, super-intrusive patch but changes no logic at all --
it's all about ripping out some of the gps_device_t structure members
into a new gps_packet_t structure. Even the driver API doesn't change
at all, this is all libgpsd(3) internals being rearranged.
The motivation here is that we want to kill off the ad-hoc Python
implementation of a packet-sniffer in gpsfake. To do that we need to
be able to write a "pure" packet sniffer that uses the same C code as
the daemon's but without being welded to the rest of the libgpsd(3)
code. This is the first step towards that.
Diffstat (limited to 'isgps.c')
-rw-r--r-- | isgps.c | 98 |
1 files changed, 49 insertions, 49 deletions
@@ -175,18 +175,18 @@ static bool isgps_parityok(isgps30bits_t w) } #endif -void isgps_init(/*@out@*/struct gps_device_t *session) +void isgps_init(/*@out@*/struct gps_packet_t *session) { - session->driver.isgps.curr_word = 0; - session->driver.isgps.curr_offset = 24; /* first word */ - session->driver.isgps.locked = false; - session->driver.isgps.bufindex = 0; + session->isgps.curr_word = 0; + session->isgps.curr_offset = 24; /* first word */ + session->isgps.locked = false; + session->isgps.bufindex = 0; } /*@ -usereleased -compdef @*/ -enum isgpsstat_t isgps_decode(struct gps_device_t *session, +enum isgpsstat_t isgps_decode(struct gps_packet_t *session, bool (*preamble_match)(isgps30bits_t *), - bool (*length_check)(struct gps_device_t *), + bool (*length_check)(struct gps_packet_t *), size_t maxlen, unsigned int c) { @@ -202,106 +202,106 @@ enum isgpsstat_t isgps_decode(struct gps_device_t *session, c = reverse_bits[c & 0x3f]; /*@ -shiftnegative @*/ - if (!session->driver.isgps.locked) { - session->driver.isgps.curr_offset = -5; - session->driver.isgps.bufindex = 0; - - while (session->driver.isgps.curr_offset <= 0) { - session->driver.isgps.curr_word <<= 1; - if (session->driver.isgps.curr_offset > 0) { - session->driver.isgps.curr_word |= c << session->driver.isgps.curr_offset; + if (!session->isgps.locked) { + session->isgps.curr_offset = -5; + session->isgps.bufindex = 0; + + while (session->isgps.curr_offset <= 0) { + session->isgps.curr_word <<= 1; + if (session->isgps.curr_offset > 0) { + session->isgps.curr_word |= c << session->isgps.curr_offset; } else { - session->driver.isgps.curr_word |= c >> -(session->driver.isgps.curr_offset); + session->isgps.curr_word |= c >> -(session->isgps.curr_offset); } - gpsd_report(ISGPS_ERRLEVEL_BASE+2, "ISGPS syncing at byte %d: %0x%08x\n", session->char_counter, session->driver.isgps.curr_word); + gpsd_report(ISGPS_ERRLEVEL_BASE+2, "ISGPS syncing at byte %d: %0x%08x\n", session->char_counter, session->isgps.curr_word); - if (preamble_match(&session->driver.isgps.curr_word)) { - if (isgps_parityok(session->driver.isgps.curr_word)) { + if (preamble_match(&session->isgps.curr_word)) { + if (isgps_parityok(session->isgps.curr_word)) { gpsd_report(ISGPS_ERRLEVEL_BASE+1, "ISGPS preamble ok, parity ok -- locked\n"); - session->driver.isgps.locked = true; - /* session->driver.isgps.curr_offset; XXX - testing */ + session->isgps.locked = true; + /* session->isgps.curr_offset; XXX - testing */ break; } gpsd_report(ISGPS_ERRLEVEL_BASE+1, "ISGPS preamble ok, parity fail\n"); } - session->driver.isgps.curr_offset++; + session->isgps.curr_offset++; } /* end while */ } - if (session->driver.isgps.locked) { + if (session->isgps.locked) { res = ISGPS_SYNC; - if (session->driver.isgps.curr_offset > 0) { - session->driver.isgps.curr_word |= c << session->driver.isgps.curr_offset; + if (session->isgps.curr_offset > 0) { + session->isgps.curr_word |= c << session->isgps.curr_offset; } else { - session->driver.isgps.curr_word |= c >> -(session->driver.isgps.curr_offset); + session->isgps.curr_word |= c >> -(session->isgps.curr_offset); } - if (session->driver.isgps.curr_offset <= 0) { + if (session->isgps.curr_offset <= 0) { /* weird-assed inversion */ - if (session->driver.isgps.curr_word & P_30_MASK) - session->driver.isgps.curr_word ^= W_DATA_MASK; + if (session->isgps.curr_word & P_30_MASK) + session->isgps.curr_word ^= W_DATA_MASK; - if (isgps_parityok(session->driver.isgps.curr_word)) { + if (isgps_parityok(session->isgps.curr_word)) { #if 0 /* * Don't clobber the buffer just because we spot * another preamble pattern in the data stream. -wsr */ - if (preamble_match(&session->driver.isgps.curr_word)) { + if (preamble_match(&session->isgps.curr_word)) { gpsd_report(ISGPS_ERRLEVEL_BASE+2, "ISGPS preamble spotted (index: %u)\n", - session->driver.isgps.bufindex); - session->driver.isgps.bufindex = 0; + session->isgps.bufindex); + session->isgps.bufindex = 0; } #endif gpsd_report(ISGPS_ERRLEVEL_BASE+2, "ISGPS processing word %u (offset %d)\n", - session->driver.isgps.bufindex, session->driver.isgps.curr_offset); + session->isgps.bufindex, session->isgps.curr_offset); { /* * Guard against a buffer overflow attack. Just wait for * the next PREAMBLE_PATTERN and go on from there. */ - if (session->driver.isgps.bufindex >= (unsigned)maxlen){ - session->driver.isgps.bufindex = 0; + if (session->isgps.bufindex >= (unsigned)maxlen){ + session->isgps.bufindex = 0; gpsd_report(ISGPS_ERRLEVEL_BASE+1, "ISGPS buffer overflowing -- resetting\n"); return ISGPS_NO_SYNC; } - session->driver.isgps.buf[session->driver.isgps.bufindex] = session->driver.isgps.curr_word; + session->isgps.buf[session->isgps.bufindex] = session->isgps.curr_word; - if ((session->driver.isgps.bufindex == 0) && - !preamble_match((isgps30bits_t *)session->driver.isgps.buf)) { + if ((session->isgps.bufindex == 0) && + !preamble_match((isgps30bits_t *)session->isgps.buf)) { gpsd_report(ISGPS_ERRLEVEL_BASE+1, "ISGPS word 0 not a preamble- punting\n"); return ISGPS_NO_SYNC; } - session->driver.isgps.bufindex++; + session->isgps.bufindex++; if (length_check(session)) { /* jackpot, we have a complete packet*/ - session->driver.isgps.bufindex = 0; + session->isgps.bufindex = 0; res = ISGPS_MESSAGE; } } - session->driver.isgps.curr_word <<= 30; /* preserve the 2 low bits */ - session->driver.isgps.curr_offset += 30; - if (session->driver.isgps.curr_offset > 0) { - session->driver.isgps.curr_word |= c << session->driver.isgps.curr_offset; + session->isgps.curr_word <<= 30; /* preserve the 2 low bits */ + session->isgps.curr_offset += 30; + if (session->isgps.curr_offset > 0) { + session->isgps.curr_word |= c << session->isgps.curr_offset; } else { - session->driver.isgps.curr_word |= c >> -(session->driver.isgps.curr_offset); + session->isgps.curr_word |= c >> -(session->isgps.curr_offset); } } else { gpsd_report(ISGPS_ERRLEVEL_BASE+0, "ISGPS parity failure, lost lock\n"); - session->driver.isgps.locked = false; + session->isgps.locked = false; } } - session->driver.isgps.curr_offset -= 6; - gpsd_report(ISGPS_ERRLEVEL_BASE+2, "residual %d\n", session->driver.isgps.curr_offset); + session->isgps.curr_offset -= 6; + gpsd_report(ISGPS_ERRLEVEL_BASE+2, "residual %d\n", session->isgps.curr_offset); return res; } /*@ +shiftnegative @*/ |