Introduce inline {ip,udp,tcp}_next() functions which take a pointer to an

{ip,udp,tcp} header and return a void * pointing to the payload (i.e. the
first byte past the end of the header and any required padding).  Use them
consistently throughout libalias to a) reduce code duplication, b) improve
code legibility, c) get rid of a bunch of alignment warnings.
This commit is contained in:
Dag-Erling Smørgrav 2004-07-06 12:13:28 +00:00
parent d0540ed535
commit 9fa0fd2682
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=131699
24 changed files with 154 additions and 104 deletions

View File

@ -173,7 +173,7 @@ TcpMonitorIn(struct ip *pip, struct alias_link *lnk)
{
struct tcphdr *tc;
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
switch (GetStateIn(lnk)) {
case ALIAS_TCP_STATE_NOT_CONNECTED:
@ -194,7 +194,7 @@ TcpMonitorOut(struct ip *pip, struct alias_link *lnk)
{
struct tcphdr *tc;
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
switch (GetStateOut(lnk)) {
case ALIAS_TCP_STATE_NOT_CONNECTED:
@ -283,7 +283,7 @@ IcmpAliasIn1(struct libalias *la, struct ip *pip)
struct alias_link *lnk;
struct icmp *ic;
ic = (struct icmp *)((char *)pip + (pip->ip_hl << 2));
ic = (struct icmp *)ip_next(pip);
/* Get source address from ICMP data field and restore original data */
lnk = FindIcmpIn(la, pip->ip_src, pip->ip_dst, ic->icmp_id, 1);
@ -329,12 +329,12 @@ IcmpAliasIn2(struct libalias *la, struct ip *pip)
struct tcphdr *tc;
struct alias_link *lnk;
ic = (struct icmp *)((char *)pip + (pip->ip_hl << 2));
ic = (struct icmp *)ip_next(pip);
ip = &ic->icmp_ip;
ud = (struct udphdr *)((char *)ip + (ip->ip_hl << 2));
tc = (struct tcphdr *)ud;
ic2 = (struct icmp *)ud;
ud = (struct udphdr *)ip_next(ip);
tc = (struct tcphdr *)ip_next(ip);
ic2 = (struct icmp *)ip_next(ip);
if (ip->ip_p == IPPROTO_UDP)
lnk = FindUdpTcpIn(la, ip->ip_dst, ip->ip_src,
@ -426,7 +426,7 @@ IcmpAliasIn(struct libalias *la, struct ip *pip)
if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY)
return (PKT_ALIAS_OK);
ic = (struct icmp *)((char *)pip + (pip->ip_hl << 2));
ic = (struct icmp *)ip_next(pip);
iresult = PKT_ALIAS_IGNORED;
switch (ic->icmp_type) {
@ -461,7 +461,7 @@ IcmpAliasOut1(struct libalias *la, struct ip *pip)
struct alias_link *lnk;
struct icmp *ic;
ic = (struct icmp *)((char *)pip + (pip->ip_hl << 2));
ic = (struct icmp *)ip_next(pip);
/* Save overwritten data for when echo packet returns */
lnk = FindIcmpOut(la, pip->ip_src, pip->ip_dst, ic->icmp_id, 1);
@ -508,12 +508,12 @@ IcmpAliasOut2(struct libalias *la, struct ip *pip)
struct tcphdr *tc;
struct alias_link *lnk;
ic = (struct icmp *)((char *)pip + (pip->ip_hl << 2));
ic = (struct icmp *)ip_next(pip);
ip = &ic->icmp_ip;
ud = (struct udphdr *)((char *)ip + (ip->ip_hl << 2));
tc = (struct tcphdr *)ud;
ic2 = (struct icmp *)ud;
ud = (struct udphdr *)ip_next(ip);
tc = (struct tcphdr *)ip_next(ip);
ic2 = (struct icmp *)ip_next(ip);
if (ip->ip_p == IPPROTO_UDP)
lnk = FindUdpTcpOut(la, ip->ip_dst, ip->ip_src,
@ -607,7 +607,7 @@ IcmpAliasOut(struct libalias *la, struct ip *pip, int create)
if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY)
return (PKT_ALIAS_OK);
ic = (struct icmp *)((char *)pip + (pip->ip_hl << 2));
ic = (struct icmp *)ip_next(pip);
iresult = PKT_ALIAS_IGNORED;
switch (ic->icmp_type) {
@ -707,7 +707,7 @@ UdpAliasIn(struct libalias *la, struct ip *pip)
if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY)
return (PKT_ALIAS_OK);
ud = (struct udphdr *)((char *)pip + (pip->ip_hl << 2));
ud = (struct udphdr *)ip_next(pip);
lnk = FindUdpTcpIn(la, pip->ip_src, pip->ip_dst,
ud->uh_sport, ud->uh_dport,
@ -771,7 +771,7 @@ UdpAliasOut(struct libalias *la, struct ip *pip, int create)
if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY)
return (PKT_ALIAS_OK);
ud = (struct udphdr *)((char *)pip + (pip->ip_hl << 2));
ud = (struct udphdr *)ip_next(pip);
lnk = FindUdpTcpOut(la, pip->ip_src, pip->ip_dst,
ud->uh_sport, ud->uh_dport,
@ -835,7 +835,7 @@ TcpAliasIn(struct libalias *la, struct ip *pip)
struct tcphdr *tc;
struct alias_link *lnk;
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
lnk = FindUdpTcpIn(la, pip->ip_src, pip->ip_dst,
tc->th_sport, tc->th_dport,
@ -926,7 +926,7 @@ TcpAliasOut(struct libalias *la, struct ip *pip, int maxpacketsize, int create)
struct tcphdr *tc;
struct alias_link *lnk;
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
proxy_type = ProxyCheck(la, pip, &proxy_server_address, &proxy_server_port);
@ -969,7 +969,7 @@ TcpAliasOut(struct libalias *la, struct ip *pip, int maxpacketsize, int create)
SetProxyPort(lnk, dest_port);
SetProxyAddress(lnk, dest_address);
ProxyModify(la, lnk, pip, maxpacketsize, proxy_type);
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
}
/* Get alias address and port */
alias_port = GetAliasPort(lnk);
@ -1346,9 +1346,9 @@ LibAliasUnaliasOut(struct libalias *la, char *ptr, /* valid IP packet */
|| (pip->ip_hl << 2) > maxpacketsize)
return (iresult);
ud = (struct udphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ud;
ic = (struct icmp *)ud;
ud = (struct udphdr *)ip_next(pip);
tc = (struct tcphdr *)ip_next(pip);
ic = (struct icmp *)ip_next(pip);
/* Find a link */
if (pip->ip_p == IPPROTO_UDP)

View File

@ -70,14 +70,13 @@ struct client_info {
void
AliasHandleCUSeeMeOut(struct libalias *la, struct ip *pip, struct alias_link *lnk)
{
struct udphdr *ud;
struct udphdr *ud = ip_next(pip);
ud = (struct udphdr *)((char *)pip + (pip->ip_hl << 2));
if (ntohs(ud->uh_ulen) - sizeof(struct udphdr) >= sizeof(struct cu_header)) {
struct cu_header *cu;
struct alias_link *cu_lnk;
cu = (struct cu_header *)(ud + 1);
cu = udp_next(ud);
if (cu->addr)
cu->addr = (u_int32_t) GetAliasAddress(lnk).s_addr;
@ -104,8 +103,8 @@ AliasHandleCUSeeMeIn(struct libalias *la, struct ip *pip, struct in_addr origina
(void)la;
alias_addr.s_addr = pip->ip_dst.s_addr;
ud = (struct udphdr *)((char *)pip + (pip->ip_hl << 2));
cu = (struct cu_header *)(ud + 1);
ud = ip_next(pip);
cu = udp_next(ud);
oc = (struct oc_header *)(cu + 1);
ci = (struct client_info *)(oc + 1);
end = (char *)ud + ntohs(ud->uh_ulen);

View File

@ -1908,7 +1908,7 @@ packet size was altered is searched.
int delta, ack_diff_min;
u_long ack;
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = ip_next(pip);
ack = tc->th_ack;
delta = 0;
@ -1952,7 +1952,7 @@ packet size was altered is searched.
int delta, seq_diff_min;
u_long seq;
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = ip_next(pip);
seq = tc->th_seq;
delta = 0;
@ -1996,7 +1996,7 @@ been altered, then this list will begin to overwrite itself.
int hlen, tlen, dlen;
int i;
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = ip_next(pip);
hlen = (pip->ip_hl + tc->th_off) << 2;
tlen = ntohs(pip->ip_len);

View File

@ -114,7 +114,7 @@ AliasHandleFtpOut(
int ftp_message_type;
/* Calculate data length of TCP packet */
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
hlen = (pip->ip_hl + tc->th_off) << 2;
tlen = ntohs(pip->ip_len);
dlen = tlen - hlen;
@ -578,7 +578,7 @@ NewFtpMessage(struct libalias *la, struct ip *pip,
#endif
/* Calculate data length of TCP packet */
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
hlen = (pip->ip_hl + tc->th_off) << 2;
tlen = ntohs(pip->ip_len);
dlen = tlen - hlen;

View File

@ -80,7 +80,7 @@ AliasHandleIrcOut(struct libalias *la,
int i; /* Iterator through the source */
/* Calculate data length of TCP packet */
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
hlen = (pip->ip_hl + tc->th_off) << 2;
tlen = ntohs(pip->ip_len);
dlen = tlen - hlen;

View File

@ -324,6 +324,32 @@ enum alias_tcp_state {
ALIAS_TCP_STATE_DISCONNECTED
};
#if defined(_NETINET_IP_H_)
static __inline void *
ip_next(struct ip *iphdr)
{
char *p = (char *)iphdr;
return (&p[iphdr->ip_hl * 4]);
}
#endif
#if defined(_NETINET_TCP_H_)
static __inline void *
tcp_next(struct tcphdr *tcphdr)
{
char *p = (char *)tcphdr;
return (&p[tcphdr->th_off * 4]);
}
#endif
#if defined(_NETINET_UDP_H_)
static __inline void *
udp_next(struct udphdr *udphdr)
{
return ((void *)(udphdr + 1));
}
#endif
/*lint -restore */
#endif /* !_ALIAS_LOCAL_H_ */

View File

@ -218,10 +218,10 @@ AliasHandleUdpNbt(
(void)lnk;
/* Calculate data length of UDP packet */
uh = (struct udphdr *)((char *)pip + (pip->ip_hl << 2));
uh = (struct udphdr *)ip_next(pip);
pmax = (char *)uh + ntohs(uh->uh_ulen);
ndh = (NbtDataHeader *) ((char *)uh + (sizeof(struct udphdr)));
ndh = (NbtDataHeader *)udp_next(uh);
if ((char *)(ndh + 1) > pmax)
return (-1);
#ifdef DEBUG
@ -654,9 +654,9 @@ AliasHandleUdpNbtNS(
nbtarg.newport = *original_port;
/* Calculate data length of UDP packet */
uh = (struct udphdr *)((char *)pip + (pip->ip_hl << 2));
uh = (struct udphdr *)ip_next(pip);
nbtarg.uh_sum = &(uh->uh_sum);
nsh = (NbtNSHeader *) ((char *)uh + (sizeof(struct udphdr)));
nsh = (NbtNSHeader *)udp_next(uh);
p = (u_char *) (nsh + 1);
pmax = (char *)uh + ntohs(uh->uh_ulen);

View File

@ -193,7 +193,7 @@ AliasHandlePptpOut(struct libalias *la,
cptr->cid1 = GetAliasPort(pptp_lnk);
/* Compute TCP checksum for revised packet */
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
accumulate -= cptr->cid1;
ADJUST_CHECKSUM(accumulate, tc->th_sum);
@ -265,7 +265,7 @@ AliasHandlePptpIn(struct libalias *la,
*pcall_id = GetOriginalPort(pptp_lnk);
/* Compute TCP checksum for modified packet */
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
accumulate -= *pcall_id;
ADJUST_CHECKSUM(accumulate, tc->th_sum);
@ -290,7 +290,7 @@ AliasVerifyPptp(struct ip *pip, u_int16_t * ptype)
struct tcphdr *tc;
/* Calculate some lengths */
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
hlen = (pip->ip_hl + tc->th_off) << 2;
tlen = ntohs(pip->ip_len);
dlen = tlen - hlen;
@ -300,7 +300,7 @@ AliasVerifyPptp(struct ip *pip, u_int16_t * ptype)
return (NULL);
/* Move up to PPTP message header */
hptr = (PptpMsgHead) (((char *)pip) + hlen);
hptr = (PptpMsgHead) ip_next(pip);
/* Return the control message type */
*ptype = ntohs(hptr->type);
@ -326,7 +326,7 @@ AliasHandlePptpGreOut(struct libalias *la, struct ip *pip)
GreHdr *gr;
struct alias_link *lnk;
gr = (GreHdr *) ((char *)pip + (pip->ip_hl << 2));
gr = (GreHdr *) ip_next(pip);
/* Check GRE header bits. */
if ((ntohl(*((u_int32_t *) gr)) & PPTP_INIT_MASK) != PPTP_INIT_VALUE)
@ -351,7 +351,7 @@ AliasHandlePptpGreIn(struct libalias *la, struct ip *pip)
GreHdr *gr;
struct alias_link *lnk;
gr = (GreHdr *) ((char *)pip + (pip->ip_hl << 2));
gr = (GreHdr *) ip_next(pip);
/* Check GRE header bits. */
if ((ntohl(*((u_int32_t *) gr)) & PPTP_INIT_MASK) != PPTP_INIT_VALUE)

View File

@ -283,7 +283,7 @@ ProxyEncodeTcpStream(struct alias_link *lnk,
struct tcphdr *tc;
/* Compute pointer to tcp header */
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
/* Don't modify if once already modified */
@ -392,7 +392,7 @@ ProxyEncodeIpHeader(struct ip *pip,
memcpy(&option[2], (u_char *) & pip->ip_dst, 4);
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
memcpy(&option[6], (u_char *) & tc->th_sport, 2);
memcpy(ptr, option, 8);
@ -451,7 +451,7 @@ ProxyCheck(struct libalias *la, struct ip *pip,
src_addr = pip->ip_src;
dst_addr = pip->ip_dst;
dst_port = ((struct tcphdr *)((char *)pip + (pip->ip_hl << 2)))
dst_port = ((struct tcphdr *)ip_next(pip))
->th_dport;
ptr = la->proxyList;

View File

@ -223,12 +223,12 @@ AliasHandleSkinny(struct libalias *la, struct ip *pip, struct alias_link *lnk)
int orig_len, skinny_hdr_len = sizeof(struct skinny_header);
ConvDirection direction;
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
hlen = (pip->ip_hl + tc->th_off) << 2;
tlen = ntohs(pip->ip_len);
dlen = tlen - hlen;
sd = (struct skinny_header *)((char *)pip + hlen);
sd = (struct skinny_header *)ip_next(pip);
/*
* XXX This direction is reserved for future use. I still need to

View File

@ -155,7 +155,7 @@ alias_rtsp_out(struct libalias *la, struct ip *pip,
struct in_addr null_addr;
/* Calculate data length of TCP packet */
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
hlen = (pip->ip_hl + tc->th_off) << 2;
tlen = ntohs(pip->ip_len);
dlen = tlen - hlen;
@ -359,7 +359,7 @@ alias_pna_out(struct libalias *la, struct ip *pip,
/* Punch hole in firewall */
PunchFWHole(pna_links);
#endif
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
alias_port = GetAliasPort(pna_links);
memcpy(work, &alias_port, 2);
@ -387,7 +387,7 @@ AliasHandleRtspOut(struct libalias *la, struct ip *pip, struct alias_link *lnk,
(void)maxpacketsize;
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
hlen = (pip->ip_hl + tc->th_off) << 2;
tlen = ntohs(pip->ip_len);
dlen = tlen - hlen;

View File

@ -102,7 +102,7 @@ TcpChecksum(struct ip *pip)
nhdr = pip->ip_hl << 2;
ntcp = ntohs(pip->ip_len) - nhdr;
tc = (struct tcphdr *)((char *)pip + nhdr);
tc = (struct tcphdr *)ip_next(pip);
ptr = (u_short *) tc;
/* Add up TCP header and data */

View File

@ -173,7 +173,7 @@ TcpMonitorIn(struct ip *pip, struct alias_link *lnk)
{
struct tcphdr *tc;
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
switch (GetStateIn(lnk)) {
case ALIAS_TCP_STATE_NOT_CONNECTED:
@ -194,7 +194,7 @@ TcpMonitorOut(struct ip *pip, struct alias_link *lnk)
{
struct tcphdr *tc;
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
switch (GetStateOut(lnk)) {
case ALIAS_TCP_STATE_NOT_CONNECTED:
@ -283,7 +283,7 @@ IcmpAliasIn1(struct libalias *la, struct ip *pip)
struct alias_link *lnk;
struct icmp *ic;
ic = (struct icmp *)((char *)pip + (pip->ip_hl << 2));
ic = (struct icmp *)ip_next(pip);
/* Get source address from ICMP data field and restore original data */
lnk = FindIcmpIn(la, pip->ip_src, pip->ip_dst, ic->icmp_id, 1);
@ -329,12 +329,12 @@ IcmpAliasIn2(struct libalias *la, struct ip *pip)
struct tcphdr *tc;
struct alias_link *lnk;
ic = (struct icmp *)((char *)pip + (pip->ip_hl << 2));
ic = (struct icmp *)ip_next(pip);
ip = &ic->icmp_ip;
ud = (struct udphdr *)((char *)ip + (ip->ip_hl << 2));
tc = (struct tcphdr *)ud;
ic2 = (struct icmp *)ud;
ud = (struct udphdr *)ip_next(ip);
tc = (struct tcphdr *)ip_next(ip);
ic2 = (struct icmp *)ip_next(ip);
if (ip->ip_p == IPPROTO_UDP)
lnk = FindUdpTcpIn(la, ip->ip_dst, ip->ip_src,
@ -426,7 +426,7 @@ IcmpAliasIn(struct libalias *la, struct ip *pip)
if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY)
return (PKT_ALIAS_OK);
ic = (struct icmp *)((char *)pip + (pip->ip_hl << 2));
ic = (struct icmp *)ip_next(pip);
iresult = PKT_ALIAS_IGNORED;
switch (ic->icmp_type) {
@ -461,7 +461,7 @@ IcmpAliasOut1(struct libalias *la, struct ip *pip)
struct alias_link *lnk;
struct icmp *ic;
ic = (struct icmp *)((char *)pip + (pip->ip_hl << 2));
ic = (struct icmp *)ip_next(pip);
/* Save overwritten data for when echo packet returns */
lnk = FindIcmpOut(la, pip->ip_src, pip->ip_dst, ic->icmp_id, 1);
@ -508,12 +508,12 @@ IcmpAliasOut2(struct libalias *la, struct ip *pip)
struct tcphdr *tc;
struct alias_link *lnk;
ic = (struct icmp *)((char *)pip + (pip->ip_hl << 2));
ic = (struct icmp *)ip_next(pip);
ip = &ic->icmp_ip;
ud = (struct udphdr *)((char *)ip + (ip->ip_hl << 2));
tc = (struct tcphdr *)ud;
ic2 = (struct icmp *)ud;
ud = (struct udphdr *)ip_next(ip);
tc = (struct tcphdr *)ip_next(ip);
ic2 = (struct icmp *)ip_next(ip);
if (ip->ip_p == IPPROTO_UDP)
lnk = FindUdpTcpOut(la, ip->ip_dst, ip->ip_src,
@ -607,7 +607,7 @@ IcmpAliasOut(struct libalias *la, struct ip *pip, int create)
if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY)
return (PKT_ALIAS_OK);
ic = (struct icmp *)((char *)pip + (pip->ip_hl << 2));
ic = (struct icmp *)ip_next(pip);
iresult = PKT_ALIAS_IGNORED;
switch (ic->icmp_type) {
@ -707,7 +707,7 @@ UdpAliasIn(struct libalias *la, struct ip *pip)
if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY)
return (PKT_ALIAS_OK);
ud = (struct udphdr *)((char *)pip + (pip->ip_hl << 2));
ud = (struct udphdr *)ip_next(pip);
lnk = FindUdpTcpIn(la, pip->ip_src, pip->ip_dst,
ud->uh_sport, ud->uh_dport,
@ -771,7 +771,7 @@ UdpAliasOut(struct libalias *la, struct ip *pip, int create)
if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY)
return (PKT_ALIAS_OK);
ud = (struct udphdr *)((char *)pip + (pip->ip_hl << 2));
ud = (struct udphdr *)ip_next(pip);
lnk = FindUdpTcpOut(la, pip->ip_src, pip->ip_dst,
ud->uh_sport, ud->uh_dport,
@ -835,7 +835,7 @@ TcpAliasIn(struct libalias *la, struct ip *pip)
struct tcphdr *tc;
struct alias_link *lnk;
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
lnk = FindUdpTcpIn(la, pip->ip_src, pip->ip_dst,
tc->th_sport, tc->th_dport,
@ -926,7 +926,7 @@ TcpAliasOut(struct libalias *la, struct ip *pip, int maxpacketsize, int create)
struct tcphdr *tc;
struct alias_link *lnk;
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
proxy_type = ProxyCheck(la, pip, &proxy_server_address, &proxy_server_port);
@ -969,7 +969,7 @@ TcpAliasOut(struct libalias *la, struct ip *pip, int maxpacketsize, int create)
SetProxyPort(lnk, dest_port);
SetProxyAddress(lnk, dest_address);
ProxyModify(la, lnk, pip, maxpacketsize, proxy_type);
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
}
/* Get alias address and port */
alias_port = GetAliasPort(lnk);
@ -1346,9 +1346,9 @@ LibAliasUnaliasOut(struct libalias *la, char *ptr, /* valid IP packet */
|| (pip->ip_hl << 2) > maxpacketsize)
return (iresult);
ud = (struct udphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ud;
ic = (struct icmp *)ud;
ud = (struct udphdr *)ip_next(pip);
tc = (struct tcphdr *)ip_next(pip);
ic = (struct icmp *)ip_next(pip);
/* Find a link */
if (pip->ip_p == IPPROTO_UDP)

View File

@ -70,14 +70,13 @@ struct client_info {
void
AliasHandleCUSeeMeOut(struct libalias *la, struct ip *pip, struct alias_link *lnk)
{
struct udphdr *ud;
struct udphdr *ud = ip_next(pip);
ud = (struct udphdr *)((char *)pip + (pip->ip_hl << 2));
if (ntohs(ud->uh_ulen) - sizeof(struct udphdr) >= sizeof(struct cu_header)) {
struct cu_header *cu;
struct alias_link *cu_lnk;
cu = (struct cu_header *)(ud + 1);
cu = udp_next(ud);
if (cu->addr)
cu->addr = (u_int32_t) GetAliasAddress(lnk).s_addr;
@ -104,8 +103,8 @@ AliasHandleCUSeeMeIn(struct libalias *la, struct ip *pip, struct in_addr origina
(void)la;
alias_addr.s_addr = pip->ip_dst.s_addr;
ud = (struct udphdr *)((char *)pip + (pip->ip_hl << 2));
cu = (struct cu_header *)(ud + 1);
ud = ip_next(pip);
cu = udp_next(ud);
oc = (struct oc_header *)(cu + 1);
ci = (struct client_info *)(oc + 1);
end = (char *)ud + ntohs(ud->uh_ulen);

View File

@ -1908,7 +1908,7 @@ packet size was altered is searched.
int delta, ack_diff_min;
u_long ack;
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = ip_next(pip);
ack = tc->th_ack;
delta = 0;
@ -1952,7 +1952,7 @@ packet size was altered is searched.
int delta, seq_diff_min;
u_long seq;
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = ip_next(pip);
seq = tc->th_seq;
delta = 0;
@ -1996,7 +1996,7 @@ been altered, then this list will begin to overwrite itself.
int hlen, tlen, dlen;
int i;
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = ip_next(pip);
hlen = (pip->ip_hl + tc->th_off) << 2;
tlen = ntohs(pip->ip_len);

View File

@ -114,7 +114,7 @@ AliasHandleFtpOut(
int ftp_message_type;
/* Calculate data length of TCP packet */
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
hlen = (pip->ip_hl + tc->th_off) << 2;
tlen = ntohs(pip->ip_len);
dlen = tlen - hlen;
@ -578,7 +578,7 @@ NewFtpMessage(struct libalias *la, struct ip *pip,
#endif
/* Calculate data length of TCP packet */
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
hlen = (pip->ip_hl + tc->th_off) << 2;
tlen = ntohs(pip->ip_len);
dlen = tlen - hlen;

View File

@ -80,7 +80,7 @@ AliasHandleIrcOut(struct libalias *la,
int i; /* Iterator through the source */
/* Calculate data length of TCP packet */
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
hlen = (pip->ip_hl + tc->th_off) << 2;
tlen = ntohs(pip->ip_len);
dlen = tlen - hlen;

View File

@ -324,6 +324,32 @@ enum alias_tcp_state {
ALIAS_TCP_STATE_DISCONNECTED
};
#if defined(_NETINET_IP_H_)
static __inline void *
ip_next(struct ip *iphdr)
{
char *p = (char *)iphdr;
return (&p[iphdr->ip_hl * 4]);
}
#endif
#if defined(_NETINET_TCP_H_)
static __inline void *
tcp_next(struct tcphdr *tcphdr)
{
char *p = (char *)tcphdr;
return (&p[tcphdr->th_off * 4]);
}
#endif
#if defined(_NETINET_UDP_H_)
static __inline void *
udp_next(struct udphdr *udphdr)
{
return ((void *)(udphdr + 1));
}
#endif
/*lint -restore */
#endif /* !_ALIAS_LOCAL_H_ */

View File

@ -218,10 +218,10 @@ AliasHandleUdpNbt(
(void)lnk;
/* Calculate data length of UDP packet */
uh = (struct udphdr *)((char *)pip + (pip->ip_hl << 2));
uh = (struct udphdr *)ip_next(pip);
pmax = (char *)uh + ntohs(uh->uh_ulen);
ndh = (NbtDataHeader *) ((char *)uh + (sizeof(struct udphdr)));
ndh = (NbtDataHeader *)udp_next(uh);
if ((char *)(ndh + 1) > pmax)
return (-1);
#ifdef DEBUG
@ -654,9 +654,9 @@ AliasHandleUdpNbtNS(
nbtarg.newport = *original_port;
/* Calculate data length of UDP packet */
uh = (struct udphdr *)((char *)pip + (pip->ip_hl << 2));
uh = (struct udphdr *)ip_next(pip);
nbtarg.uh_sum = &(uh->uh_sum);
nsh = (NbtNSHeader *) ((char *)uh + (sizeof(struct udphdr)));
nsh = (NbtNSHeader *)udp_next(uh);
p = (u_char *) (nsh + 1);
pmax = (char *)uh + ntohs(uh->uh_ulen);

View File

@ -193,7 +193,7 @@ AliasHandlePptpOut(struct libalias *la,
cptr->cid1 = GetAliasPort(pptp_lnk);
/* Compute TCP checksum for revised packet */
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
accumulate -= cptr->cid1;
ADJUST_CHECKSUM(accumulate, tc->th_sum);
@ -265,7 +265,7 @@ AliasHandlePptpIn(struct libalias *la,
*pcall_id = GetOriginalPort(pptp_lnk);
/* Compute TCP checksum for modified packet */
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
accumulate -= *pcall_id;
ADJUST_CHECKSUM(accumulate, tc->th_sum);
@ -290,7 +290,7 @@ AliasVerifyPptp(struct ip *pip, u_int16_t * ptype)
struct tcphdr *tc;
/* Calculate some lengths */
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
hlen = (pip->ip_hl + tc->th_off) << 2;
tlen = ntohs(pip->ip_len);
dlen = tlen - hlen;
@ -300,7 +300,7 @@ AliasVerifyPptp(struct ip *pip, u_int16_t * ptype)
return (NULL);
/* Move up to PPTP message header */
hptr = (PptpMsgHead) (((char *)pip) + hlen);
hptr = (PptpMsgHead) ip_next(pip);
/* Return the control message type */
*ptype = ntohs(hptr->type);
@ -326,7 +326,7 @@ AliasHandlePptpGreOut(struct libalias *la, struct ip *pip)
GreHdr *gr;
struct alias_link *lnk;
gr = (GreHdr *) ((char *)pip + (pip->ip_hl << 2));
gr = (GreHdr *) ip_next(pip);
/* Check GRE header bits. */
if ((ntohl(*((u_int32_t *) gr)) & PPTP_INIT_MASK) != PPTP_INIT_VALUE)
@ -351,7 +351,7 @@ AliasHandlePptpGreIn(struct libalias *la, struct ip *pip)
GreHdr *gr;
struct alias_link *lnk;
gr = (GreHdr *) ((char *)pip + (pip->ip_hl << 2));
gr = (GreHdr *) ip_next(pip);
/* Check GRE header bits. */
if ((ntohl(*((u_int32_t *) gr)) & PPTP_INIT_MASK) != PPTP_INIT_VALUE)

View File

@ -283,7 +283,7 @@ ProxyEncodeTcpStream(struct alias_link *lnk,
struct tcphdr *tc;
/* Compute pointer to tcp header */
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
/* Don't modify if once already modified */
@ -392,7 +392,7 @@ ProxyEncodeIpHeader(struct ip *pip,
memcpy(&option[2], (u_char *) & pip->ip_dst, 4);
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
memcpy(&option[6], (u_char *) & tc->th_sport, 2);
memcpy(ptr, option, 8);
@ -451,7 +451,7 @@ ProxyCheck(struct libalias *la, struct ip *pip,
src_addr = pip->ip_src;
dst_addr = pip->ip_dst;
dst_port = ((struct tcphdr *)((char *)pip + (pip->ip_hl << 2)))
dst_port = ((struct tcphdr *)ip_next(pip))
->th_dport;
ptr = la->proxyList;

View File

@ -223,12 +223,12 @@ AliasHandleSkinny(struct libalias *la, struct ip *pip, struct alias_link *lnk)
int orig_len, skinny_hdr_len = sizeof(struct skinny_header);
ConvDirection direction;
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
hlen = (pip->ip_hl + tc->th_off) << 2;
tlen = ntohs(pip->ip_len);
dlen = tlen - hlen;
sd = (struct skinny_header *)((char *)pip + hlen);
sd = (struct skinny_header *)ip_next(pip);
/*
* XXX This direction is reserved for future use. I still need to

View File

@ -155,7 +155,7 @@ alias_rtsp_out(struct libalias *la, struct ip *pip,
struct in_addr null_addr;
/* Calculate data length of TCP packet */
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
hlen = (pip->ip_hl + tc->th_off) << 2;
tlen = ntohs(pip->ip_len);
dlen = tlen - hlen;
@ -359,7 +359,7 @@ alias_pna_out(struct libalias *la, struct ip *pip,
/* Punch hole in firewall */
PunchFWHole(pna_links);
#endif
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
alias_port = GetAliasPort(pna_links);
memcpy(work, &alias_port, 2);
@ -387,7 +387,7 @@ AliasHandleRtspOut(struct libalias *la, struct ip *pip, struct alias_link *lnk,
(void)maxpacketsize;
tc = (struct tcphdr *)((char *)pip + (pip->ip_hl << 2));
tc = (struct tcphdr *)ip_next(pip);
hlen = (pip->ip_hl + tc->th_off) << 2;
tlen = ntohs(pip->ip_len);
dlen = tlen - hlen;

View File

@ -102,7 +102,7 @@ TcpChecksum(struct ip *pip)
nhdr = pip->ip_hl << 2;
ntcp = ntohs(pip->ip_len) - nhdr;
tc = (struct tcphdr *)((char *)pip + nhdr);
tc = (struct tcphdr *)ip_next(pip);
ptr = (u_short *) tc;
/* Add up TCP header and data */