pf keep updating the dreaded ip checksum. which is entirely pointless
(except the quoted ip packet and its csum inside an icmp err) since we
uncondtionally recalculate the checksum anyway in ip_output as well as
in the bridge and the *&^%$(* pf route-to. so don't.
Index: pf.c
===================================================================
RCS file: /cvs/src/sys/net/pf.c,v
retrieving revision 1.730
diff -u -p -r1.730 pf.c
--- pf.c 24 Mar 2011 20:09:44 -0000 1.730
+++ pf.c 2 Apr 2011 14:20:19 -0000
@@ -145,8 +145,8 @@ void pf_add_threshold(struct
pf_thres
int pf_check_threshold(struct pf_threshold *);
void pf_change_ap(struct pf_addr *, u_int16_t *,
- u_int16_t *, u_int16_t *, struct pf_addr *,
- u_int16_t, u_int8_t, sa_family_t);
+ u_int16_t *, struct pf_addr *, u_int16_t,
+ u_int8_t, sa_family_t);
int pf_modulate_sack(struct mbuf *, int, struct pf_pdesc *,
struct tcphdr *, struct pf_state_peer *);
#ifdef INET6
@@ -158,7 +158,7 @@ int pf_icmp_mapping(struct pf_pdesc *
void pf_change_icmp(struct pf_addr *, u_int16_t *,
struct pf_addr *, struct pf_addr *, u_int16_t,
u_int16_t *, u_int16_t *, u_int16_t *,
- u_int16_t *, u_int8_t, sa_family_t);
+ u_int8_t, sa_family_t);
void pf_send_tcp(const struct pf_rule *, sa_family_t,
const struct pf_addr *, const struct pf_addr *,
u_int16_t, u_int16_t, u_int32_t, u_int32_t,
@@ -1523,7 +1523,7 @@ pf_cksum_fixup(u_int16_t cksum, u_int16_
}
void
-pf_change_ap(struct pf_addr *a, u_int16_t *p, u_int16_t *ic, u_int16_t *pc,
+pf_change_ap(struct pf_addr *a, u_int16_t *p, u_int16_t *pc,
struct pf_addr *an, u_int16_t pn, u_int8_t u, sa_family_t af)
{
struct pf_addr ao;
@@ -1536,10 +1536,6 @@ pf_change_ap(struct pf_addr *a, u_int16_
switch (af) {
#ifdef INET
case AF_INET:
- *ic = pf_cksum_fixup(pf_cksum_fixup(*ic,
- ao.addr16[0], an->addr16[0], 0),
- ao.addr16[1], an->addr16[1], 0);
- *p = pn;
*pc = pf_cksum_fixup(pf_cksum_fixup(pf_cksum_fixup(*pc,
ao.addr16[0], an->addr16[0], u),
ao.addr16[1], an->addr16[1], u),
@@ -1574,8 +1570,9 @@ pf_change_a(void *a, u_int16_t *c, u_int
memcpy(&ao, a, sizeof(ao));
memcpy(a, &an, sizeof(u_int32_t));
- *c = pf_cksum_fixup(pf_cksum_fixup(*c, ao / 65536, an / 65536, u),
- ao % 65536, an % 65536, u);
+ if (c != NULL)
+ *c = pf_cksum_fixup(pf_cksum_fixup(*c, ao / 65536, an / 65536,
+ u), ao % 65536, an % 65536, u);
}
#ifdef INET6
@@ -1790,7 +1787,7 @@ pf_icmp_mapping(struct pf_pdesc *pd, u_i
void
pf_change_icmp(struct pf_addr *ia, u_int16_t *ip, struct pf_addr *oa,
struct pf_addr *na, u_int16_t np, u_int16_t *pc, u_int16_t *h2c,
- u_int16_t *ic, u_int16_t *hc, u_int8_t u, sa_family_t af)
+ u_int16_t *ic, u_int8_t u, sa_family_t af)
{
struct pf_addr oia, ooa;
@@ -1819,6 +1816,7 @@ pf_change_icmp(struct pf_addr *ia, u_int
case AF_INET: {
u_int32_t oh2c = *h2c;
+ /* XXX just in_cksum() */
*h2c = pf_cksum_fixup(pf_cksum_fixup(*h2c,
oia.addr16[0], ia->addr16[0], 0),
oia.addr16[1], ia->addr16[1], 0);
@@ -1845,19 +1843,11 @@ pf_change_icmp(struct pf_addr *ia, u_int
break;
#endif /* INET6 */
}
- /* Outer ip address, fix outer ip or icmpv6 checksum, if necessary. */
+ /* Outer ip address, fix outer icmpv6 checksum, if necessary. */
if (oa) {
PF_ACPY(oa, na, af);
- switch (af) {
-#ifdef INET
- case AF_INET:
- *hc = pf_cksum_fixup(pf_cksum_fixup(*hc,
- ooa.addr16[0], oa->addr16[0], 0),
- ooa.addr16[1], oa->addr16[1], 0);
- break;
-#endif /* INET */
#ifdef INET6
- case AF_INET6:
+ if (af == AF_INET6)
*ic = pf_cksum_fixup(pf_cksum_fixup(pf_cksum_fixup(
pf_cksum_fixup(pf_cksum_fixup(pf_cksum_fixup(
pf_cksum_fixup(pf_cksum_fixup(*ic,
@@ -1869,9 +1859,7 @@ pf_change_icmp(struct pf_addr *ia, u_int
ooa.addr16[5], oa->addr16[5], u),
ooa.addr16[6], oa->addr16[6], u),
ooa.addr16[7], oa->addr16[7], u);
- break;
#endif /* INET6 */
- }
}
}
@@ -3271,26 +3259,26 @@ pf_translate(struct pf_pdesc *pd, struct
switch (pd->proto) {
case IPPROTO_TCP:
if (PF_ANEQ(saddr, pd->src, pd->af) || *pd->sport != sport) {
- pf_change_ap(pd->src, pd->sport, pd->ip_sum,
- &pd->hdr.tcp->th_sum, saddr, sport, 0, pd->af);
+ pf_change_ap(pd->src, pd->sport, &pd->hdr.tcp->th_sum,
+ saddr, sport, 0, pd->af);
rewrite = 1;
}
if (PF_ANEQ(daddr, pd->dst, pd->af) || *pd->dport != dport) {
- pf_change_ap(pd->dst, pd->dport, pd->ip_sum,
- &pd->hdr.tcp->th_sum, daddr, dport, 0, pd->af);
+ pf_change_ap(pd->dst, pd->dport, &pd->hdr.tcp->th_sum,
+ daddr, dport, 0, pd->af);
rewrite = 1;
}
break;
case IPPROTO_UDP:
if (PF_ANEQ(saddr, pd->src, pd->af) || *pd->sport != sport) {
- pf_change_ap(pd->src, pd->sport, pd->ip_sum,
- &pd->hdr.udp->uh_sum, saddr, sport, 1, pd->af);
+ pf_change_ap(pd->src, pd->sport, &pd->hdr.udp->uh_sum,
+ saddr, sport, 1, pd->af);
rewrite = 1;
}
if (PF_ANEQ(daddr, pd->dst, pd->af) || *pd->dport != dport) {
- pf_change_ap(pd->dst, pd->dport, pd->ip_sum,
- &pd->hdr.udp->uh_sum, daddr, dport, 1, pd->af);
+ pf_change_ap(pd->dst, pd->dport, &pd->hdr.udp->uh_sum,
+ daddr, dport, 1, pd->af);
rewrite = 1;
}
break;
@@ -3302,12 +3290,12 @@ pf_translate(struct pf_pdesc *pd, struct
return (0);
if (PF_ANEQ(saddr, pd->src, pd->af)) {
- pf_change_a(&pd->src->v4.s_addr, pd->ip_sum,
+ pf_change_a(&pd->src->v4.s_addr, NULL,
saddr->v4.s_addr, 0);
rewrite = 1;
}
if (PF_ANEQ(daddr, pd->dst, pd->af)) {
- pf_change_a(&pd->dst->v4.s_addr, pd->ip_sum,
+ pf_change_a(&pd->dst->v4.s_addr, NULL,
daddr->v4.s_addr, 0);
rewrite = 1;
}
@@ -3349,12 +3337,12 @@ pf_translate(struct pf_pdesc *pd, struct
#ifdef INET
case AF_INET:
if (PF_ANEQ(saddr, pd->src, pd->af)) {
- pf_change_a(&pd->src->v4.s_addr, pd->ip_sum,
+ pf_change_a(&pd->src->v4.s_addr, NULL,
saddr->v4.s_addr, 0);
rewrite = 1;
}
if (PF_ANEQ(daddr, pd->dst, pd->af)) {
- pf_change_a(&pd->dst->v4.s_addr, pd->ip_sum,
+ pf_change_a(&pd->dst->v4.s_addr, NULL,
daddr->v4.s_addr, 0);
rewrite = 1;
}
@@ -3363,11 +3351,11 @@ pf_translate(struct pf_pdesc *pd, struct
#ifdef INET6
case AF_INET6:
if (PF_ANEQ(saddr, pd->src, pd->af)) {
- pf_change_a6(pd->src, pd->ip_sum, saddr, 0);
+ pf_change_a6(pd->src, NULL, saddr, 0);
rewrite = 1;
}
if (PF_ANEQ(daddr, pd->dst, pd->af)) {
- pf_change_a6(pd->dst, pd->ip_sum, daddr, 0);
+ pf_change_a6(pd->dst, NULL, daddr, 0);
rewrite = 1;
}
break;
@@ -4008,18 +3996,15 @@ pf_test_state_tcp(struct pf_state **stat
if (PF_ANEQ(pd->src, &nk->addr[pd->sidx], pd->af) ||
nk->port[pd->sidx] != th->th_sport)
- pf_change_ap(pd->src, &th->th_sport, pd->ip_sum,
- &th->th_sum, &nk->addr[pd->sidx],
- nk->port[pd->sidx], 0, pd->af);
-
+ pf_change_ap(pd->src, &th->th_sport, &th->th_sum,
+ &nk->addr[pd->sidx], nk->port[pd->sidx], 0, pd->af);
if (PF_ANEQ(pd->dst, &nk->addr[pd->didx], pd->af) ||
pd->rdomain != nk->rdomain)
pd->destchg = 1;
if (PF_ANEQ(pd->dst, &nk->addr[pd->didx], pd->af) ||
nk->port[pd->didx] != th->th_dport)
- pf_change_ap(pd->dst, &th->th_dport, pd->ip_sum,
- &th->th_sum, &nk->addr[pd->didx],
- nk->port[pd->didx], 0, pd->af);
+ pf_change_ap(pd->dst, &th->th_dport, &th->th_sum,
+ &nk->addr[pd->didx], nk->port[pd->didx], 0, pd->af);
m->m_pkthdr.rdomain = nk->rdomain;
copyback = 1;
}
@@ -4083,18 +4068,15 @@ pf_test_state_udp(struct pf_state **stat
if (PF_ANEQ(pd->src, &nk->addr[pd->sidx], pd->af) ||
nk->port[pd->sidx] != uh->uh_sport)
- pf_change_ap(pd->src, &uh->uh_sport, pd->ip_sum,
- &uh->uh_sum, &nk->addr[pd->sidx],
- nk->port[pd->sidx], 1, pd->af);
-
+ pf_change_ap(pd->src, &uh->uh_sport, &uh->uh_sum,
+ &nk->addr[pd->sidx], nk->port[pd->sidx], 1, pd->af);
if (PF_ANEQ(pd->dst, &nk->addr[pd->didx], pd->af) ||
pd->rdomain != nk->rdomain)
pd->destchg = 1;
if (PF_ANEQ(pd->dst, &nk->addr[pd->didx], pd->af) ||
nk->port[pd->didx] != uh->uh_dport)
- pf_change_ap(pd->dst, &uh->uh_dport, pd->ip_sum,
- &uh->uh_sum, &nk->addr[pd->didx],
- nk->port[pd->didx], 1, pd->af);
+ pf_change_ap(pd->dst, &uh->uh_dport, &uh->uh_sum,
+ &nk->addr[pd->didx], nk->port[pd->didx], 1, pd->af);
m->m_pkthdr.rdomain = nk->rdomain;
m_copyback(m, off, sizeof(*uh), uh, M_NOWAIT);
}
@@ -4223,14 +4205,12 @@ pf_test_state_icmp(struct pf_state **sta
case AF_INET:
if (PF_ANEQ(pd->src,
&nk->addr[pd->sidx], AF_INET))
- pf_change_a(&saddr->v4.s_addr,
- pd->ip_sum,
+ pf_change_a(&saddr->v4.s_addr, NULL,
nk->addr[pd->sidx].v4.s_addr, 0);
if (PF_ANEQ(pd->dst, &nk->addr[pd->didx],
AF_INET)) {
- pf_change_a(&daddr->v4.s_addr,
- pd->ip_sum,
+ pf_change_a(&daddr->v4.s_addr, NULL,
nk->addr[pd->didx].v4.s_addr, 0);
pd->destchg = 1;
}
@@ -4474,8 +4454,7 @@ pf_test_state_icmp(struct pf_state **sta
pf_change_icmp(pd2.src, &th.th_sport,
daddr, &nk->addr[pd2.sidx],
nk->port[pd2.sidx], NULL,
- pd2.ip_sum, icmpsum,
- pd->ip_sum, 0, pd2.af);
+ pd2.ip_sum, icmpsum, 0, pd2.af);
if (PF_ANEQ(pd2.dst, &nk->addr[pd2.didx],
pd2.af) || pd2.rdomain != nk->rdomain)
@@ -4488,8 +4467,7 @@ pf_test_state_icmp(struct pf_state **sta
pf_change_icmp(pd2.dst, &th.th_dport,
saddr, &nk->addr[pd2.didx],
nk->port[pd2.didx], NULL,
- pd2.ip_sum, icmpsum,
- pd->ip_sum, 0, pd2.af);
+ pd2.ip_sum, icmpsum, 0, pd2.af);
copyback = 1;
}
@@ -4551,8 +4529,7 @@ pf_test_state_icmp(struct pf_state **sta
pf_change_icmp(pd2.src, &uh.uh_sport,
daddr, &nk->addr[pd2.sidx],
nk->port[pd2.sidx], &uh.uh_sum,
- pd2.ip_sum, icmpsum,
- pd->ip_sum, 1, pd2.af);
+ pd2.ip_sum, icmpsum, 1, pd2.af);
if (PF_ANEQ(pd2.dst, &nk->addr[pd2.didx],
pd2.af) || pd2.rdomain != nk->rdomain)
@@ -4565,8 +4542,7 @@ pf_test_state_icmp(struct pf_state **sta
pf_change_icmp(pd2.dst, &uh.uh_dport,
saddr, &nk->addr[pd2.didx],
nk->port[pd2.didx], &uh.uh_sum,
- pd2.ip_sum, icmpsum,
- pd->ip_sum, 1, pd2.af);
+ pd2.ip_sum, icmpsum, 1, pd2.af);
switch (pd2.af) {
#ifdef INET
@@ -4629,8 +4605,7 @@ pf_test_state_icmp(struct pf_state **sta
daddr, &nk->addr[pd2.sidx],
(virtual_type == htons(ICMP_ECHO)) ?
nk->port[iidx] : 0, NULL,
- pd2.ip_sum, icmpsum,
- pd->ip_sum, 0, AF_INET);
+ pd2.ip_sum, icmpsum, 0, AF_INET);
if (PF_ANEQ(pd2.dst, &nk->addr[pd2.didx],
pd2.af) || pd2.rdomain != nk->rdomain)
@@ -4641,8 +4616,7 @@ pf_test_state_icmp(struct pf_state **sta
&nk->addr[pd2.didx], pd2.af))
pf_change_icmp(pd2.dst, NULL, saddr,
&nk->addr[pd2.didx], 0, NULL,
- pd2.ip_sum, icmpsum,
- pd->ip_sum, 0, AF_INET);
+ pd2.ip_sum, icmpsum, 0, AF_INET);
m_copyback(m, off, ICMP_MINLEN, pd->hdr.icmp,
M_NOWAIT);
@@ -4704,8 +4678,7 @@ pf_test_state_icmp(struct pf_state **sta
(virtual_type ==
htons(ICMP6_ECHO_REQUEST))
? nk->port[iidx] : 0, NULL,
- pd2.ip_sum, icmpsum,
- pd->ip_sum, 0, AF_INET6);
+ pd2.ip_sum, icmpsum, 0, AF_INET6);
if (PF_ANEQ(pd2.dst, &nk->addr[pd2.didx],
pd2.af) || pd2.rdomain != nk->rdomain)
@@ -4716,8 +4689,7 @@ pf_test_state_icmp(struct pf_state **sta
&nk->addr[pd2.didx], pd2.af))
pf_change_icmp(pd2.dst, NULL, saddr,
&nk->addr[pd2.didx], 0, NULL,
- pd2.ip_sum, icmpsum,
- pd->ip_sum, 0, AF_INET6);
+ pd2.ip_sum, icmpsum, 0, AF_INET6);
m_copyback(m, off, sizeof(struct icmp6_hdr),
pd->hdr.icmp6, M_NOWAIT);
@@ -4750,8 +4722,7 @@ pf_test_state_icmp(struct pf_state **sta
&nk->addr[pd2.sidx], pd2.af))
pf_change_icmp(pd2.src, NULL, daddr,
&nk->addr[pd2.sidx], 0, NULL,
- pd2.ip_sum, icmpsum,
- pd->ip_sum, 0, pd2.af);
+ pd2.ip_sum, icmpsum, 0, pd2.af);
if (PF_ANEQ(pd2.dst, &nk->addr[pd2.didx],
pd2.af) || pd2.rdomain != nk->rdomain)
@@ -4762,8 +4733,7 @@ pf_test_state_icmp(struct pf_state **sta
&nk->addr[pd2.didx], pd2.af))
pf_change_icmp(pd2.dst, NULL, saddr,
&nk->addr[pd2.didx], 0, NULL,
- pd2.ip_sum, icmpsum,
- pd->ip_sum, 0, pd2.af);
+ pd2.ip_sum, icmpsum, 0, pd2.af);
switch (pd2.af) {
#ifdef INET
@@ -4848,13 +4818,11 @@ pf_test_state_other(struct pf_state **st
#ifdef INET
case AF_INET:
if (PF_ANEQ(pd->src, &nk->addr[pd->sidx], AF_INET))
- pf_change_a(&pd->src->v4.s_addr,
- pd->ip_sum,
+ pf_change_a(&pd->src->v4.s_addr, NULL,
nk->addr[pd->sidx].v4.s_addr,
0);
if (PF_ANEQ(pd->dst, &nk->addr[pd->didx], AF_INET)) {
- pf_change_a(&pd->dst->v4.s_addr,
- pd->ip_sum,
+ pf_change_a(&pd->dst->v4.s_addr, NULL,
nk->addr[pd->didx].v4.s_addr,
0);
pd->destchg = 1;
--
Henning Brauer, [email protected], [email protected]
BS Web Services, http://bsws.de
Full-Service ISP - Secure Hosting, Mail and DNS Services
Dedicated Servers, Rootservers, Application Hosting