Changeset View
Changeset View
Standalone View
Standalone View
sys/netinet/libalias/alias.c
Show First 20 Lines • Show All 353 Lines • ▼ Show 20 Lines | */ | ||||
ic = (struct icmp *)ip_next(pip); | ic = (struct icmp *)ip_next(pip); | ||||
ip = &ic->icmp_ip; | ip = &ic->icmp_ip; | ||||
ud = (struct udphdr *)ip_next(ip); | ud = (struct udphdr *)ip_next(ip); | ||||
tc = (struct tcphdr *)ip_next(ip); | tc = (struct tcphdr *)ip_next(ip); | ||||
ic2 = (struct icmp *)ip_next(ip); | ic2 = (struct icmp *)ip_next(ip); | ||||
if (ip->ip_p == IPPROTO_UDP) | switch (ip->ip_p) { | ||||
case IPPROTO_UDP: | |||||
kp: Indent case at the same level as switch. | |||||
lnk = FindUdpTcpIn(la, ip->ip_dst, ip->ip_src, | lnk = FindUdpTcpIn(la, ip->ip_dst, ip->ip_src, | ||||
ud->uh_dport, ud->uh_sport, | ud->uh_dport, ud->uh_sport, | ||||
IPPROTO_UDP, 0); | IPPROTO_UDP, 0); | ||||
else if (ip->ip_p == IPPROTO_TCP) | break; | ||||
case IPPROTO_TCP: | |||||
lnk = FindUdpTcpIn(la, ip->ip_dst, ip->ip_src, | lnk = FindUdpTcpIn(la, ip->ip_dst, ip->ip_src, | ||||
tc->th_dport, tc->th_sport, | tc->th_dport, tc->th_sport, | ||||
IPPROTO_TCP, 0); | IPPROTO_TCP, 0); | ||||
else if (ip->ip_p == IPPROTO_ICMP) { | break; | ||||
case IPPROTO_ICMP: | |||||
if (ic2->icmp_type == ICMP_ECHO || ic2->icmp_type == ICMP_TSTAMP) | if (ic2->icmp_type == ICMP_ECHO || ic2->icmp_type == ICMP_TSTAMP) | ||||
lnk = FindIcmpIn(la, ip->ip_dst, ip->ip_src, ic2->icmp_id, 0); | lnk = FindIcmpIn(la, ip->ip_dst, ip->ip_src, ic2->icmp_id, 0); | ||||
else | else | ||||
lnk = NULL; | lnk = NULL; | ||||
} else | break; | ||||
default: | |||||
lnk = NULL; | lnk = NULL; | ||||
} | |||||
Done Inline Actionsstyle(9) insists on break; for each case. donner: style(9) insists on break; for each case. | |||||
if (lnk != NULL) { | if (lnk != NULL) { | ||||
if (ip->ip_p == IPPROTO_UDP || ip->ip_p == IPPROTO_TCP) { | switch (ip->ip_p) { | ||||
case IPPROTO_UDP: | |||||
case IPPROTO_TCP: | |||||
{ | |||||
int accumulate, accumulate2; | int accumulate, accumulate2; | ||||
struct in_addr original_address; | struct in_addr original_address; | ||||
u_short original_port; | u_short original_port; | ||||
original_address = GetOriginalAddress(lnk); | original_address = GetOriginalAddress(lnk); | ||||
original_port = GetOriginalPort(lnk); | original_port = GetOriginalPort(lnk); | ||||
/* Adjust ICMP checksum */ | /* Adjust ICMP checksum */ | ||||
accumulate = twowords(&ip->ip_src); | accumulate = twowords(&ip->ip_src); | ||||
accumulate -= twowords(&original_address); | accumulate -= twowords(&original_address); | ||||
accumulate += ud->uh_sport; | accumulate += ud->uh_sport; | ||||
accumulate -= original_port; | accumulate -= original_port; | ||||
accumulate2 = accumulate; | accumulate2 = accumulate; | ||||
accumulate2 += ip->ip_sum; | accumulate2 += ip->ip_sum; | ||||
ADJUST_CHECKSUM(accumulate, ip->ip_sum); | ADJUST_CHECKSUM(accumulate, ip->ip_sum); | ||||
accumulate2 -= ip->ip_sum; | accumulate2 -= ip->ip_sum; | ||||
ADJUST_CHECKSUM(accumulate2, ic->icmp_cksum); | ADJUST_CHECKSUM(accumulate2, ic->icmp_cksum); | ||||
/* Un-alias address in IP header */ | /* Un-alias address in IP header */ | ||||
DifferentialChecksum(&pip->ip_sum, | DifferentialChecksum(&pip->ip_sum, | ||||
&original_address, &pip->ip_dst, 2); | &original_address, &pip->ip_dst, 2); | ||||
pip->ip_dst = original_address; | pip->ip_dst = original_address; | ||||
/* Un-alias address and port number of original IP packet | /* Un-alias address and port number of original | ||||
fragment contained in ICMP data section */ | * IP packet fragment contained in ICMP data | ||||
* section */ | |||||
ip->ip_src = original_address; | ip->ip_src = original_address; | ||||
ud->uh_sport = original_port; | ud->uh_sport = original_port; | ||||
} else if (ip->ip_p == IPPROTO_ICMP) { | break; | ||||
} | |||||
case IPPROTO_ICMP: | |||||
{ | |||||
int accumulate, accumulate2; | int accumulate, accumulate2; | ||||
struct in_addr original_address; | struct in_addr original_address; | ||||
u_short original_id; | u_short original_id; | ||||
original_address = GetOriginalAddress(lnk); | original_address = GetOriginalAddress(lnk); | ||||
original_id = GetOriginalPort(lnk); | original_id = GetOriginalPort(lnk); | ||||
/* Adjust ICMP checksum */ | /* Adjust ICMP checksum */ | ||||
accumulate = twowords(&ip->ip_src); | accumulate = twowords(&ip->ip_src); | ||||
accumulate -= twowords(&original_address); | accumulate -= twowords(&original_address); | ||||
accumulate += ic2->icmp_id; | accumulate += ic2->icmp_id; | ||||
accumulate -= original_id; | accumulate -= original_id; | ||||
accumulate2 = accumulate; | accumulate2 = accumulate; | ||||
accumulate2 += ip->ip_sum; | accumulate2 += ip->ip_sum; | ||||
ADJUST_CHECKSUM(accumulate, ip->ip_sum); | ADJUST_CHECKSUM(accumulate, ip->ip_sum); | ||||
accumulate2 -= ip->ip_sum; | accumulate2 -= ip->ip_sum; | ||||
ADJUST_CHECKSUM(accumulate2, ic->icmp_cksum); | ADJUST_CHECKSUM(accumulate2, ic->icmp_cksum); | ||||
/* Un-alias address in IP header */ | /* Un-alias address in IP header */ | ||||
DifferentialChecksum(&pip->ip_sum, | DifferentialChecksum(&pip->ip_sum, | ||||
&original_address, &pip->ip_dst, 2); | &original_address, &pip->ip_dst, 2); | ||||
pip->ip_dst = original_address; | pip->ip_dst = original_address; | ||||
/* Un-alias address of original IP packet and sequence number of | /* Un-alias address of original IP packet and | ||||
embedded ICMP datagram */ | * sequence number of embedded ICMP datagram */ | ||||
ip->ip_src = original_address; | ip->ip_src = original_address; | ||||
ic2->icmp_id = original_id; | ic2->icmp_id = original_id; | ||||
break; | |||||
} | } | ||||
} | |||||
return (PKT_ALIAS_OK); | return (PKT_ALIAS_OK); | ||||
} | } | ||||
return (PKT_ALIAS_IGNORED); | return (PKT_ALIAS_IGNORED); | ||||
} | } | ||||
static int | static int | ||||
IcmpAliasIn(struct libalias *la, struct ip *pip) | IcmpAliasIn(struct libalias *la, struct ip *pip) | ||||
▲ Show 20 Lines • Show All 100 Lines • ▼ Show 20 Lines | */ | ||||
LIBALIAS_LOCK_ASSERT(la); | LIBALIAS_LOCK_ASSERT(la); | ||||
ic = (struct icmp *)ip_next(pip); | ic = (struct icmp *)ip_next(pip); | ||||
ip = &ic->icmp_ip; | ip = &ic->icmp_ip; | ||||
ud = (struct udphdr *)ip_next(ip); | ud = (struct udphdr *)ip_next(ip); | ||||
tc = (struct tcphdr *)ip_next(ip); | tc = (struct tcphdr *)ip_next(ip); | ||||
ic2 = (struct icmp *)ip_next(ip); | ic2 = (struct icmp *)ip_next(ip); | ||||
if (ip->ip_p == IPPROTO_UDP) | switch (ip->ip_p) { | ||||
case IPPROTO_UDP: | |||||
lnk = FindUdpTcpOut(la, ip->ip_dst, ip->ip_src, | lnk = FindUdpTcpOut(la, ip->ip_dst, ip->ip_src, | ||||
ud->uh_dport, ud->uh_sport, | ud->uh_dport, ud->uh_sport, | ||||
IPPROTO_UDP, 0); | IPPROTO_UDP, 0); | ||||
else if (ip->ip_p == IPPROTO_TCP) | break; | ||||
case IPPROTO_TCP: | |||||
lnk = FindUdpTcpOut(la, ip->ip_dst, ip->ip_src, | lnk = FindUdpTcpOut(la, ip->ip_dst, ip->ip_src, | ||||
tc->th_dport, tc->th_sport, | tc->th_dport, tc->th_sport, | ||||
IPPROTO_TCP, 0); | IPPROTO_TCP, 0); | ||||
else if (ip->ip_p == IPPROTO_ICMP) { | break; | ||||
case IPPROTO_ICMP: | |||||
if (ic2->icmp_type == ICMP_ECHO || ic2->icmp_type == ICMP_TSTAMP) | if (ic2->icmp_type == ICMP_ECHO || ic2->icmp_type == ICMP_TSTAMP) | ||||
lnk = FindIcmpOut(la, ip->ip_dst, ip->ip_src, ic2->icmp_id, 0); | lnk = FindIcmpOut(la, ip->ip_dst, ip->ip_src, ic2->icmp_id, 0); | ||||
else | else | ||||
lnk = NULL; | lnk = NULL; | ||||
} else | break; | ||||
default: | |||||
lnk = NULL; | lnk = NULL; | ||||
} | |||||
Not Done Inline ActionsMay I ask for a break here? donner: May I ask for a break here? | |||||
if (lnk != NULL) { | if (lnk != NULL) { | ||||
if (ip->ip_p == IPPROTO_UDP || ip->ip_p == IPPROTO_TCP) { | switch (ip->ip_p) { | ||||
case IPPROTO_UDP: | |||||
case IPPROTO_TCP: | |||||
{ | |||||
int accumulate; | int accumulate; | ||||
struct in_addr alias_address; | struct in_addr alias_address; | ||||
u_short alias_port; | u_short alias_port; | ||||
alias_address = GetAliasAddress(lnk); | alias_address = GetAliasAddress(lnk); | ||||
alias_port = GetAliasPort(lnk); | alias_port = GetAliasPort(lnk); | ||||
/* Adjust ICMP checksum */ | /* Adjust ICMP checksum */ | ||||
accumulate = twowords(&ip->ip_dst); | accumulate = twowords(&ip->ip_dst); | ||||
accumulate -= twowords(&alias_address); | accumulate -= twowords(&alias_address); | ||||
accumulate += ud->uh_dport; | accumulate += ud->uh_dport; | ||||
accumulate -= alias_port; | accumulate -= alias_port; | ||||
ADJUST_CHECKSUM(accumulate, ic->icmp_cksum); | ADJUST_CHECKSUM(accumulate, ic->icmp_cksum); | ||||
/* | /* | ||||
* Alias address in IP header if it comes from the host | * Alias address in IP header if it comes from | ||||
* the original TCP/UDP packet was destined for. | * the host the original TCP/UDP packet was | ||||
* destined for. | |||||
*/ | */ | ||||
if (pip->ip_src.s_addr == ip->ip_dst.s_addr) { | if (pip->ip_src.s_addr == ip->ip_dst.s_addr) { | ||||
DifferentialChecksum(&pip->ip_sum, | DifferentialChecksum(&pip->ip_sum, | ||||
&alias_address, &pip->ip_src, 2); | &alias_address, &pip->ip_src, 2); | ||||
pip->ip_src = alias_address; | pip->ip_src = alias_address; | ||||
} | } | ||||
/* Alias address and port number of original IP packet | /* | ||||
fragment contained in ICMP data section */ | * Alias address and port number of original | ||||
* IP packet fragment contained in ICMP data | |||||
* section | |||||
*/ | |||||
ip->ip_dst = alias_address; | ip->ip_dst = alias_address; | ||||
ud->uh_dport = alias_port; | ud->uh_dport = alias_port; | ||||
} else if (ip->ip_p == IPPROTO_ICMP) { | } | ||||
Done Inline Actionsbreak missing donner: break missing | |||||
case IPPROTO_ICMP: | |||||
{ | |||||
int accumulate; | int accumulate; | ||||
struct in_addr alias_address; | struct in_addr alias_address; | ||||
u_short alias_id; | u_short alias_id; | ||||
alias_address = GetAliasAddress(lnk); | alias_address = GetAliasAddress(lnk); | ||||
alias_id = GetAliasPort(lnk); | alias_id = GetAliasPort(lnk); | ||||
/* Adjust ICMP checksum */ | /* Adjust ICMP checksum */ | ||||
accumulate = twowords(&ip->ip_dst); | accumulate = twowords(&ip->ip_dst); | ||||
accumulate -= twowords(&alias_address); | accumulate -= twowords(&alias_address); | ||||
accumulate += ic2->icmp_id; | accumulate += ic2->icmp_id; | ||||
accumulate -= alias_id; | accumulate -= alias_id; | ||||
ADJUST_CHECKSUM(accumulate, ic->icmp_cksum); | ADJUST_CHECKSUM(accumulate, ic->icmp_cksum); | ||||
/* | /* | ||||
* Alias address in IP header if it comes from the host | * Alias address in IP header if it comes | ||||
* the original ICMP message was destined for. | * from the host the original ICMP message | ||||
* was destined for. | |||||
*/ | */ | ||||
if (pip->ip_src.s_addr == ip->ip_dst.s_addr) { | if (pip->ip_src.s_addr == ip->ip_dst.s_addr) { | ||||
DifferentialChecksum(&pip->ip_sum, | DifferentialChecksum(&pip->ip_sum, | ||||
&alias_address, &pip->ip_src, 2); | &alias_address, &pip->ip_src, 2); | ||||
pip->ip_src = alias_address; | pip->ip_src = alias_address; | ||||
} | } | ||||
/* Alias address of original IP packet and sequence number of | /* Alias address of original IP packet and | ||||
embedded ICMP datagram */ | * sequence number of embedded ICMP datagram */ | ||||
ip->ip_dst = alias_address; | ip->ip_dst = alias_address; | ||||
ic2->icmp_id = alias_id; | ic2->icmp_id = alias_id; | ||||
} | } | ||||
} | |||||
Not Done Inline Actionsdito donner: dito | |||||
return (PKT_ALIAS_OK); | return (PKT_ALIAS_OK); | ||||
} | } | ||||
return (PKT_ALIAS_IGNORED); | return (PKT_ALIAS_IGNORED); | ||||
} | } | ||||
static int | static int | ||||
IcmpAliasOut(struct libalias *la, struct ip *pip, int create) | IcmpAliasOut(struct libalias *la, struct ip *pip, int create) | ||||
▲ Show 20 Lines • Show All 960 Lines • ▼ Show 20 Lines | if (ntohs(pip->ip_len) > maxpacketsize | ||||
|| (pip->ip_hl << 2) > maxpacketsize) | || (pip->ip_hl << 2) > maxpacketsize) | ||||
goto getout; | goto getout; | ||||
ud = (struct udphdr *)ip_next(pip); | ud = (struct udphdr *)ip_next(pip); | ||||
tc = (struct tcphdr *)ip_next(pip); | tc = (struct tcphdr *)ip_next(pip); | ||||
ic = (struct icmp *)ip_next(pip); | ic = (struct icmp *)ip_next(pip); | ||||
/* Find a link */ | /* Find a link */ | ||||
if (pip->ip_p == IPPROTO_UDP) | switch (pip->ip_p) { | ||||
case IPPROTO_UDP: | |||||
lnk = FindUdpTcpIn(la, pip->ip_dst, pip->ip_src, | lnk = FindUdpTcpIn(la, pip->ip_dst, pip->ip_src, | ||||
ud->uh_dport, ud->uh_sport, | ud->uh_dport, ud->uh_sport, | ||||
IPPROTO_UDP, 0); | IPPROTO_UDP, 0); | ||||
else if (pip->ip_p == IPPROTO_TCP) | break; | ||||
case IPPROTO_TCP: | |||||
lnk = FindUdpTcpIn(la, pip->ip_dst, pip->ip_src, | lnk = FindUdpTcpIn(la, pip->ip_dst, pip->ip_src, | ||||
tc->th_dport, tc->th_sport, | tc->th_dport, tc->th_sport, | ||||
IPPROTO_TCP, 0); | IPPROTO_TCP, 0); | ||||
else if (pip->ip_p == IPPROTO_ICMP) | break; | ||||
case IPPROTO_ICMP: | |||||
lnk = FindIcmpIn(la, pip->ip_dst, pip->ip_src, ic->icmp_id, 0); | lnk = FindIcmpIn(la, pip->ip_dst, pip->ip_src, ic->icmp_id, 0); | ||||
else | break; | ||||
default: | |||||
lnk = NULL; | lnk = NULL; | ||||
} | |||||
Done Inline Actionsdito donner: dito | |||||
/* Change it from an aliased packet to an unaliased packet */ | /* Change it from an aliased packet to an unaliased packet */ | ||||
if (lnk != NULL) { | if (lnk != NULL) { | ||||
if (pip->ip_p == IPPROTO_UDP || pip->ip_p == IPPROTO_TCP) { | switch (pip->ip_p) { | ||||
case IPPROTO_UDP: | |||||
case IPPROTO_TCP: | |||||
{ | |||||
int accumulate; | int accumulate; | ||||
struct in_addr original_address; | struct in_addr original_address; | ||||
u_short original_port; | u_short original_port; | ||||
original_address = GetOriginalAddress(lnk); | original_address = GetOriginalAddress(lnk); | ||||
original_port = GetOriginalPort(lnk); | original_port = GetOriginalPort(lnk); | ||||
/* Adjust TCP/UDP checksum */ | /* Adjust TCP/UDP checksum */ | ||||
accumulate = twowords(&pip->ip_src); | accumulate = twowords(&pip->ip_src); | ||||
accumulate -= twowords(&original_address); | accumulate -= twowords(&original_address); | ||||
if (pip->ip_p == IPPROTO_UDP) { | if (pip->ip_p == IPPROTO_UDP) { | ||||
accumulate += ud->uh_sport; | accumulate += ud->uh_sport; | ||||
accumulate -= original_port; | accumulate -= original_port; | ||||
ADJUST_CHECKSUM(accumulate, ud->uh_sum); | ADJUST_CHECKSUM(accumulate, ud->uh_sum); | ||||
} else { | } else { | ||||
accumulate += tc->th_sport; | accumulate += tc->th_sport; | ||||
accumulate -= original_port; | accumulate -= original_port; | ||||
ADJUST_CHECKSUM(accumulate, tc->th_sum); | ADJUST_CHECKSUM(accumulate, tc->th_sum); | ||||
} | } | ||||
/* Adjust IP checksum */ | /* Adjust IP checksum */ | ||||
DifferentialChecksum(&pip->ip_sum, | DifferentialChecksum(&pip->ip_sum, | ||||
&original_address, &pip->ip_src, 2); | &original_address, &pip->ip_src, 2); | ||||
/* Un-alias source address and port number */ | /* Un-alias source address and port number */ | ||||
pip->ip_src = original_address; | pip->ip_src = original_address; | ||||
if (pip->ip_p == IPPROTO_UDP) | if (pip->ip_p == IPPROTO_UDP) | ||||
ud->uh_sport = original_port; | ud->uh_sport = original_port; | ||||
else | else | ||||
tc->th_sport = original_port; | tc->th_sport = original_port; | ||||
iresult = PKT_ALIAS_OK; | iresult = PKT_ALIAS_OK; | ||||
break; | |||||
} else if (pip->ip_p == IPPROTO_ICMP) { | } | ||||
case IPPROTO_ICMP: | |||||
{ | |||||
int accumulate; | int accumulate; | ||||
struct in_addr original_address; | struct in_addr original_address; | ||||
u_short original_id; | u_short original_id; | ||||
original_address = GetOriginalAddress(lnk); | original_address = GetOriginalAddress(lnk); | ||||
original_id = GetOriginalPort(lnk); | original_id = GetOriginalPort(lnk); | ||||
/* Adjust ICMP checksum */ | /* Adjust ICMP checksum */ | ||||
accumulate = twowords(&pip->ip_src); | accumulate = twowords(&pip->ip_src); | ||||
accumulate -= twowords(&original_address); | accumulate -= twowords(&original_address); | ||||
accumulate += ic->icmp_id; | accumulate += ic->icmp_id; | ||||
accumulate -= original_id; | accumulate -= original_id; | ||||
ADJUST_CHECKSUM(accumulate, ic->icmp_cksum); | ADJUST_CHECKSUM(accumulate, ic->icmp_cksum); | ||||
/* Adjust IP checksum */ | /* Adjust IP checksum */ | ||||
DifferentialChecksum(&pip->ip_sum, | DifferentialChecksum(&pip->ip_sum, | ||||
&original_address, &pip->ip_src, 2); | &original_address, &pip->ip_src, 2); | ||||
/* Un-alias source address and port number */ | /* Un-alias source address and port number */ | ||||
pip->ip_src = original_address; | pip->ip_src = original_address; | ||||
ic->icmp_id = original_id; | ic->icmp_id = original_id; | ||||
iresult = PKT_ALIAS_OK; | iresult = PKT_ALIAS_OK; | ||||
} | |||||
Done Inline Actionsdito donner: dito | |||||
} | } | ||||
} | } | ||||
getout: | getout: | ||||
LIBALIAS_UNLOCK(la); | LIBALIAS_UNLOCK(la); | ||||
return (iresult); | return (iresult); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 141 Lines • Show Last 20 Lines |
Indent case at the same level as switch.