| 3094 | #endif /* INET6 */ |
| 3095 | |
| 3096 | int |
| 3097 | pf_socket_lookup(int direction, struct pf_pdesc *pd, struct mbuf *m) |
| 3098 | { |
| 3099 | struct pf_addr *saddr, *daddr; |
| 3100 | u_int16_t sport, dport; |
| 3101 | struct inpcbinfo *pi; |
| 3102 | struct inpcb *inp; |
| 3103 | |
| 3104 | pd->lookup.uid = UID_MAX; |
| 3105 | pd->lookup.gid = GID_MAX; |
| 3106 | |
| 3107 | switch (pd->proto) { |
| 3108 | case IPPROTO_TCP: |
| 3109 | if (pd->hdr.tcp == NULL) |
| 3110 | return (-1); |
| 3111 | sport = pd->hdr.tcp->th_sport; |
| 3112 | dport = pd->hdr.tcp->th_dport; |
| 3113 | pi = &V_tcbinfo; |
| 3114 | break; |
| 3115 | case IPPROTO_UDP: |
| 3116 | if (pd->hdr.udp == NULL) |
| 3117 | return (-1); |
| 3118 | sport = pd->hdr.udp->uh_sport; |
| 3119 | dport = pd->hdr.udp->uh_dport; |
| 3120 | pi = &V_udbinfo; |
| 3121 | break; |
| 3122 | default: |
| 3123 | return (-1); |
| 3124 | } |
| 3125 | if (direction == PF_IN) { |
| 3126 | saddr = pd->src; |
| 3127 | daddr = pd->dst; |
| 3128 | } else { |
| 3129 | u_int16_t p; |
| 3130 | |
| 3131 | p = sport; |
| 3132 | sport = dport; |
| 3133 | dport = p; |
| 3134 | saddr = pd->dst; |
| 3135 | daddr = pd->src; |
| 3136 | } |
| 3137 | switch (pd->af) { |
| 3138 | #ifdef INET |
| 3139 | case AF_INET: |
| 3140 | inp = in_pcblookup_mbuf(pi, saddr->v4, sport, daddr->v4, |
| 3141 | dport, INPLOOKUP_RLOCKPCB, NULL, m); |
| 3142 | if (inp == NULL) { |
| 3143 | inp = in_pcblookup_mbuf(pi, saddr->v4, sport, |
| 3144 | daddr->v4, dport, INPLOOKUP_WILDCARD | |
| 3145 | INPLOOKUP_RLOCKPCB, NULL, m); |
| 3146 | if (inp == NULL) |
| 3147 | return (-1); |
| 3148 | } |
| 3149 | break; |
| 3150 | #endif /* INET */ |
| 3151 | #ifdef INET6 |
| 3152 | case AF_INET6: |
| 3153 | inp = in6_pcblookup_mbuf(pi, &saddr->v6, sport, &daddr->v6, |
no test coverage detected