Found a possible solution to the SIP + RTP on the same interface issue with packet socket: Socket filters.
With the help of something like this:
{ 0x28, 0, 0, 0x0000000c },
{ 0x15, 0, 9, 0x00000800 },
{ 0x30, 0, 0, 0x00000017 },
{ 0x15, 0, 7, 0x00000011 },
{ 0x28, 0, 0, 0x00000014 },
{ 0x45, 5, 0, 0x00001fff },
{ 0xb1, 0, 0, 0x0000000e },
{ 0x48, 0, 0, 0x00000010 },
{ 0x35, 0, 2, start_port }, /* replaced: 0x00007fff */
{ 0x25, 1, 0, end_port }, /* replaced: 0x0000ffff */
{ 0x6, 0, 0, 0x00000044 },
{ 0x6, 0, 0, 0x00000000 },
only UDP packets on destination ports 32767 to 65535 will be delivered to the packet socket.
(The cryptic C code is the output of “tcpdump -dd udp dst portrange 32767-65535″)
There’s a possible problem with this solution though: no zero-copy support for socket filters on linux (still need to confirm that (FreeBSD has zero-copy bpf support in -current)).
