 // Extend Roadside Units with the ability to receive packets
 extension RoadsideUnit: PacketReceiver {
 	func receive(packet: Packet) {
-		// We should never receive packets sent by ourselves
-		assert(packet.src != id)
+		// We should never receive packets sent by ourselves on layer2
+		assert(packet.l2src != id)
+
+		// Ignore retransmissions of packets originally sent by ourselves
+		guard packet.l3src != id else { return }
 
 		// Ignore packets we've already seen
 		// Note: Packet IDs must not change during retransmissions

	// Propagation algorithm
	let getSignalStrength: (distance: Double, lineOfSight: Bool) -> Double = portoEmpiricalDataModel

	// Packet ID generator - can be made to create random IDs
	var nextPacketID: UInt = 0
	func getNextPacketID() -> UInt {
		defer { nextPacketID += 1 }


// A message packet
struct Packet {
	// A unique packet identifier in the simulation
	var id: UInt

	// Time the packet was created in the simulation
	var created: SimulationTime

	// Layer 2 Network
	var l2src: UInt
//	var l2dst	// Unimplemented, all packets are broadcast at the MAC level

	// Layer 3 Network */
	enum Destination {
		case Unicast(destinationID: UInt)
		case Broadcast(hopLimit: UInt)
		case Geocast(targetArea: AreaType)
	}
	var l3src: UInt
	var l3dst: Destination

	// The packet's payload type and payload
	var payloadType: PayloadType
	var payload: Payload
}

// A payload is a simple text field
