static int protohandlergreout(struct libalias *la, struct ip *pip, struct alias_data *ah) { if (AliasHandlePptpGreOut(la, pip) == 0) return (0); return (-1); }
int PacketAliasOut(char *ptr, /* valid IP packet */ int maxpacketsize /* How much the packet data may grow (FTP and IRC inline changes) */ ) { int iresult; struct in_addr addr_save; struct ip *pip; if (packetAliasMode & PKT_ALIAS_REVERSE) { packetAliasMode &= ~PKT_ALIAS_REVERSE; iresult = PacketAliasIn(ptr, maxpacketsize); packetAliasMode |= PKT_ALIAS_REVERSE; return iresult; } HouseKeeping(); ClearCheckNewLink(); pip = (struct ip *) ptr; /* Defense against mangled packets */ if (ntohs(pip->ip_len) > maxpacketsize || (pip->ip_hl<<2) > maxpacketsize) return PKT_ALIAS_IGNORED; addr_save = GetDefaultAliasAddress(); if (packetAliasMode & PKT_ALIAS_UNREGISTERED_ONLY) { u_long addr; int iclass; iclass = 0; addr = ntohl(pip->ip_src.s_addr); if (addr >= UNREG_ADDR_C_LOWER && addr <= UNREG_ADDR_C_UPPER) iclass = 3; else if (addr >= UNREG_ADDR_B_LOWER && addr <= UNREG_ADDR_B_UPPER) iclass = 2; else if (addr >= UNREG_ADDR_A_LOWER && addr <= UNREG_ADDR_A_UPPER) iclass = 1; if (iclass == 0) { SetDefaultAliasAddress(pip->ip_src); } } iresult = PKT_ALIAS_IGNORED; if ((ntohs(pip->ip_off) & IP_OFFMASK) == 0) { switch (pip->ip_p) { case IPPROTO_ICMP: iresult = IcmpAliasOut(pip); break; case IPPROTO_UDP: iresult = UdpAliasOut(pip); break; case IPPROTO_TCP: iresult = TcpAliasOut(pip, maxpacketsize); break; case IPPROTO_GRE: if (AliasHandlePptpGreOut(pip) == 0) iresult = PKT_ALIAS_OK; else iresult = ProtoAliasOut(pip); break; default: iresult = ProtoAliasOut(pip); break; } } else { iresult = FragmentOut(pip); } SetDefaultAliasAddress(addr_save); return(iresult); }