Sorry for going dark - been busy.
No obvious silver bullet yet. Here is a partial decode of the SPI transaction when the target exists:
+40.684445 984 send data fd 1, flags 0, length 12: 01 fe 01 fe 01 fe 2b d4 47 b8 03 fc
to: 02 00 23 28 c0 a8 79 33
+40.684630 985 sendto status fd 1, length 12
+40.884214 986 select command 1 0 0001 0000 0000 0.005000
+40.889480 987 select status 0000, rd 0000, wr 0000, ex 0000
+40.889565 988 send data fd 1, flags 0, length 12: 01 fe 01 fe 01 fe 2b d4 47 b8 03 fc
to: 02 00 23 28 c0 a8 79 33
+40.889744 989 sendto status fd 1, length 12
+40.890600 990 free buffers event 0:2
+41.089337 991 select command 1 0 0001 0000 0000 0.005000
+41.094598 992 select status 0000, rd 0000, wr 0000, ex 0000
+41.094683 993 send data fd 1, flags 0, length 12: 01 fe 01 fe 01 fe 2b d4 47 b8 03 fc
to: 02 00 23 28 c0 a8 79 33
+41.094869 994 sendto status fd 1, length 12
It will happily continue sending these for days. You can see the sendto() message (packet numbers 984 and 993) and the response from the CC3000 acknowledging receipt (packet numbers 985 and 994.)
The failing case (no ARP) looks like this:
+6.807132 218 send data fd 1, flags 0, length 12: 01 fe 01 fe 01 fe 2b d4 47 b8 03 fc
to: 02 00 23 28 c0 a8 79 0b
+6.807317 219 sendto status fd 1, length 12
+6.807645 220 sendto status fd 1, length 4294967238
+7.006903 221 select command 1 0 0001 0000 0000 0.005000
+7.012174 222 select status 0000, rd 0000, wr 0000, ex 0000
+7.012258 223 send data fd 1, flags 0, length 12: 01 fe 01 fe 01 fe 2b d4 47 b8 03 fc
to: 02 00 23 28 c0 a8 79 0b
+7.012444 224 sendto status fd 1, length 12
+7.012780 225 sendto status fd 1, length 4294967238
Here you can see a similar pattern, but there is an additional reply in each case (packet numbers 220 and 225), where the CC3000 is sending -58 as an errno. That’s a bit of an odd errno, but it crops up in some source code as -EDEADLK (would deadlock.)
Now, since it follows the standard replies (packet numbers 219 and 224), I think the host driver will just ignore them, which is fine - this is UDP and there are no guarantees, remember. So I have a hunch the CC3000 is trying to do the right thing.
I’m still working it, but since the CC3000 seems to stay responsive, I’m still optimistic that we can find a way to handle this.