From 2f6775a8769ed7a2250bb90a68c5fa2617123604 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Thu, 30 Nov 2006 07:29:25 +0000 Subject: 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. --- isgps.c | 98 ++++++++++++++++++++++++++++++++--------------------------------- 1 file changed, 49 insertions(+), 49 deletions(-) (limited to 'isgps.c') diff --git a/isgps.c b/isgps.c index 11ffebbf..9e8c07a4 100644 --- a/isgps.c +++ b/isgps.c @@ -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 @*/ -- cgit v1.2.1