This is how I fixed it. I did similar things for EXTRACT_32BITS and EXTRACT_64BITS.
static inline u_int16_t EXTRACT_16BITS(const void *p) { #if defined(__arm__) && defined(__rtems__) if(((uint32_t)p % 2) != 0) { u_int16_t value; u_int8_t *ptr = (u_int8_t *)&value; ptr[0] = ((const u_int8_t *)p)[0]; ptr[1] = ((const u_int8_t *)p)[1]; p = &value; } #endif /* __rtems__ */ return ((u_int16_t)ntohs(*(const u_int16_t *)(p))); } Kevin Kirspel Electrical Engineer - Sr. Staff Idexx Roswell 235 Hembree Park Drive Roswell GA 30076 Tel: (770)-510-4444 ext. 81642 Direct: (770)-688-1642 Fax: (770)-510-4445 From: Joel Sherrill [mailto:j...@rtems.org] Sent: Saturday, July 01, 2017 11:39 AM To: Gedare Bloom <ged...@rtems.org> Cc: rtems-de...@rtems.org <devel@rtems.org>; Kirspel, Kevin <kevin-kirs...@idexx.com> Subject: Re: LIBBSD TCPDUMP On Jul 1, 2017 10:34 AM, "Gedare Bloom" <ged...@rtems.org<mailto:ged...@rtems.org>> wrote: On Sat, Jul 1, 2017 at 10:01 AM, Kirspel, Kevin <kevin-kirs...@idexx.com<mailto:kevin-kirs...@idexx.com>> wrote: > I get a crash when running the tcpdump command in LIBBSD. It is due to the > following structure > > > > struct stp_bpdu_ { > > u_int8_t protocol_id[2]; > > u_int8_t protocol_version; > > u_int8_t bpdu_type; > > u_int8_t flags; > > u_int8_t root_id[8]; > > u_int8_t root_path_cost[4]; > > u_int8_t bridge_id[8]; > > u_int8_t port_id[2]; > > u_int8_t message_age[2]; > > u_int8_t max_age[2]; > > u_int8_t hello_time[2]; > > u_int8_t forward_delay[2]; > > u_int8_t v1_length; > > }; > > > > In the code, there is an access to the port_id field as follows: > EXTRACT_16BITS(&stp_bpdu->port_id). EXTRACT_16BITS calls ntohs() . Since > the address of “&stp_bpdu->port_id” is at an odd word (16 bit) boundary, an > exception is generated. What is the correct way to fix this? I was going > to update EXTRACT_16BITS to check for an odd boundary and fix it up before > calling ntohs(). > That would probably be a more portable fix than allowing unaligned accesses. I think the alignment should be made to the CPU_ALIGNMENT macro. Can't you also just pull it out a byte at a time, form the net version and then ntohs()? That's what I coded recently in some marahalling code. > > > Kevin Kirspel > > Electrical Engineer - Sr. Staff > > Idexx Roswell > > 235 Hembree Park Drive > > Roswell GA 30076 > > Tel: (770)-510-4444 ext. 81642<tel:%28770%29-510-4444%20ext.%2081642> > > Direct: (770)-688-1642<tel:%28770%29-688-1642> > > Fax: (770)-510-4445<tel:%28770%29-510-4445> > > > > > _______________________________________________ > devel mailing list > devel@rtems.org<mailto:devel@rtems.org> > http://lists.rtems.org/mailman/listinfo/devel<https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.rtems.org_mailman_listinfo_devel&d=DwMFaQ&c=2do6VJGs3LvEOe4OFFM1bA&r=HDiJ93ANMEQ32G5JGdpyUxbdebuwKHBbeiHMr3RbR74&m=DfsZaORruX70gPrZk3-vjldOIsh4IFQ9ZRHVCZMKJ_o&s=Xx_hsbQ3vmD8L038yTJmDbvtePgAQkCJ7YBI_A6FR-Y&e=> _______________________________________________ devel mailing list devel@rtems.org<mailto:devel@rtems.org> http://lists.rtems.org/mailman/listinfo/devel<https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.rtems.org_mailman_listinfo_devel&d=DwMFaQ&c=2do6VJGs3LvEOe4OFFM1bA&r=HDiJ93ANMEQ32G5JGdpyUxbdebuwKHBbeiHMr3RbR74&m=DfsZaORruX70gPrZk3-vjldOIsh4IFQ9ZRHVCZMKJ_o&s=Xx_hsbQ3vmD8L038yTJmDbvtePgAQkCJ7YBI_A6FR-Y&e=>
_______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel