Это длинный и сложный кусок кода, который я не хочу пытаться взломать. : -)
Посмотрите на функцию inet_csk_get_port
(в net/ipv4/inet_connection_sock.c
) для TCP и udp_lib_get_port
(в net/ipv4/udp.c
) для UDP. Это действительно, по крайней мере, для 2.6.31, хотя может отличаться для разных версий.