diff --git a/core/net/mac/contikimac/contikimac.c b/core/net/mac/contikimac/contikimac.c index 229cfb473..7088e8e54 100644 --- a/core/net/mac/contikimac/contikimac.c +++ b/core/net/mac/contikimac/contikimac.c @@ -873,6 +873,10 @@ qsend_list(mac_callback_t sent, void *ptr, struct rdc_buf_list *buf_list) if(next != NULL) { packetbuf_set_attr(PACKETBUF_ATTR_PENDING, 1); } +#if !NETSTACK_CONF_BRIDGE_MODE + /* If NETSTACK_CONF_BRIDGE_MODE is set, assume PACKETBUF_ADDR_SENDER is already set. */ + packetbuf_set_addr(PACKETBUF_ADDR_SENDER, &linkaddr_node_addr); +#endif packetbuf_set_attr(PACKETBUF_ATTR_MAC_ACK, 1); if(NETSTACK_FRAMER.create() < 0) { PRINTF("contikimac: framer failed\n"); diff --git a/core/net/mac/framer-802154.c b/core/net/mac/framer-802154.c index 35e39cf33..86f550fd1 100644 --- a/core/net/mac/framer-802154.c +++ b/core/net/mac/framer-802154.c @@ -173,7 +173,8 @@ create_frame(int type, int do_create) * Set up the source address using only the long address mode for * phase 1. */ - linkaddr_copy((linkaddr_t *)¶ms.src_addr, &linkaddr_node_addr); + linkaddr_copy((linkaddr_t *)¶ms.src_addr, + packetbuf_addr(PACKETBUF_ADDR_SENDER)); params.payload = packetbuf_dataptr(); params.payload_len = packetbuf_datalen(); diff --git a/core/net/mac/tsch/tsch.c b/core/net/mac/tsch/tsch.c index a31d4a1ae..348406dac 100644 --- a/core/net/mac/tsch/tsch.c +++ b/core/net/mac/tsch/tsch.c @@ -910,6 +910,15 @@ send_packet(mac_callback_t sent, void *ptr) packet_count_before = tsch_queue_packet_count(addr); +#if !NETSTACK_CONF_BRIDGE_MODE + /* + * In the Contiki stack, the source address of a frame is set at the RDC + * layer. Since TSCH doesn't use any RDC protocol and bypasses the layer to + * transmit a frame, it should set the source address by itself. + */ + packetbuf_set_addr(PACKETBUF_ADDR_SENDER, &linkaddr_node_addr); +#endif + if((hdr_len = NETSTACK_FRAMER.create()) < 0) { PRINTF("TSCH:! can't send packet due to framer error\n"); ret = MAC_TX_ERR;