static int protohandlergrein(struct libalias *la, struct ip *pip, struct alias_data *ah) { if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY || AliasHandlePptpGreIn(la, pip) == 0) return (0); return (-1); }
int PacketAliasIn(char *ptr, int maxpacketsize) { struct in_addr alias_addr; struct ip *pip; int iresult; if (packetAliasMode & PKT_ALIAS_REVERSE) { packetAliasMode &= ~PKT_ALIAS_REVERSE; iresult = PacketAliasOut(ptr, maxpacketsize); packetAliasMode |= PKT_ALIAS_REVERSE; return iresult; } HouseKeeping(); ClearCheckNewLink(); pip = (struct ip *) ptr; alias_addr = pip->ip_dst; /* Defense against mangled packets */ if (ntohs(pip->ip_len) > maxpacketsize || (pip->ip_hl<<2) > maxpacketsize) return PKT_ALIAS_IGNORED; iresult = PKT_ALIAS_IGNORED; if ( (ntohs(pip->ip_off) & IP_OFFMASK) == 0 ) { switch (pip->ip_p) { case IPPROTO_ICMP: iresult = IcmpAliasIn(pip); break; case IPPROTO_UDP: iresult = UdpAliasIn(pip); break; case IPPROTO_TCP: iresult = TcpAliasIn(pip); break; case IPPROTO_GRE: if (packetAliasMode & PKT_ALIAS_PROXY_ONLY || AliasHandlePptpGreIn(pip) == 0) iresult = PKT_ALIAS_OK; else iresult = ProtoAliasIn(pip); break; default: iresult = ProtoAliasIn(pip); break; } if (ntohs(pip->ip_off) & IP_MF) { struct alias_link *link; link = FindFragmentIn1(pip->ip_src, alias_addr, pip->ip_id); if (link != NULL) { iresult = PKT_ALIAS_FOUND_HEADER_FRAGMENT; SetFragmentAddr(link, pip->ip_dst); } else { iresult = PKT_ALIAS_ERROR; } } } else { iresult = FragmentIn(pip); } return(iresult); }