PERFORCE change 138565 for review
Paolo Pisati
piso at FreeBSD.org
Tue Mar 25 23:08:03 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=138565
Change 138565 by piso at piso_newluxor on 2008/03/25 23:07:05
Teach LibAliasIn() & LibAliasOut() about mbuf while in kernel land.
Affected files ...
.. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.c#73 edit
.. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.h#21 edit
Differences ...
==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.c#73 (text+ko) ====
@@ -256,13 +256,14 @@
/* Local prototypes */
-static int IcmpAliasIn1(struct libalias *, struct ip *);
-static int IcmpAliasIn2(struct libalias *, struct ip *);
-static int IcmpAliasIn(struct libalias *, struct ip *);
+static int IcmpAliasIn1(struct libalias *, struct ip *, struct icmp *);
+static int IcmpAliasIn2(struct libalias *, pkt_t);
+static int IcmpAliasIn(struct libalias *, pkt_t);
-static int IcmpAliasOut1(struct libalias *, struct ip *, int create);
-static int IcmpAliasOut2(struct libalias *, struct ip *);
-static int IcmpAliasOut(struct libalias *, struct ip *, int create);
+static int IcmpAliasOut1(struct libalias *, struct ip *, struct icmp *,
+ int create);
+static int IcmpAliasOut2(struct libalias *, pkt_t);
+static int IcmpAliasOut(struct libalias *, pkt_t, int create);
static int ProtoAliasIn(struct libalias *la, struct in_addr ip_src,
struct in_addr *ip_dst, u_char ip_p, u_short *ip_sum);
@@ -270,15 +271,15 @@
struct in_addr ip_dst, u_char ip_p, u_short *ip_sum,
int create);
-static int UdpAliasIn(struct libalias *, struct ip *);
-static int UdpAliasOut(struct libalias *, struct ip *, int create);
+static int UdpAliasIn(struct libalias *, pkt_t);
+static int UdpAliasOut(struct libalias *, pkt_t, int create);
-static int TcpAliasIn(struct libalias *, struct ip *);
-static int TcpAliasOut(struct libalias *, struct ip *, int, int create);
+static int TcpAliasIn(struct libalias *, pkt_t);
+static int TcpAliasOut(struct libalias *, pkt_t, int, int create);
static int
-IcmpAliasIn1(struct libalias *la, struct ip *pip)
+IcmpAliasIn1(struct libalias *la, struct ip *pip, struct icmp *ic)
{
LIBALIAS_LOCK_ASSERT(la);
@@ -287,10 +288,7 @@
Alias incoming echo and timestamp requests.
*/
struct alias_link *lnk;
- struct icmp *ic;
- 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);
if (lnk != NULL) {
@@ -323,7 +321,7 @@
}
static int
-IcmpAliasIn2(struct libalias *la, struct ip *pip)
+IcmpAliasIn2(struct libalias *la, pkt_t ptr)
{
LIBALIAS_LOCK_ASSERT(la);
@@ -331,12 +329,13 @@
Alias incoming ICMP error messages containing
IP header and first 64 bits of datagram.
*/
- struct ip *ip;
+ struct ip *ip, *pip;
struct icmp *ic, *ic2;
struct udphdr *ud;
struct tcphdr *tc;
struct alias_link *lnk;
+ PULLUP_ICMPIP64HDR(pip, ptr);
ic = (struct icmp *)ip_next(pip);
ip = &ic->icmp_ip;
@@ -425,9 +424,10 @@
static int
-IcmpAliasIn(struct libalias *la, struct ip *pip)
+IcmpAliasIn(struct libalias *la, pkt_t ptr)
{
int iresult;
+ struct ip *pip;
struct icmp *ic;
LIBALIAS_LOCK_ASSERT(la);
@@ -435,6 +435,7 @@
if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY)
return (PKT_ALIAS_OK);
+ PULLUP_ICMPHDR(pip, ptr);
ic = (struct icmp *)ip_next(pip);
iresult = PKT_ALIAS_IGNORED;
@@ -442,18 +443,18 @@
case ICMP_ECHOREPLY:
case ICMP_TSTAMPREPLY:
if (ic->icmp_code == 0) {
- iresult = IcmpAliasIn1(la, pip);
+ iresult = IcmpAliasIn1(la, pip, ic);
}
break;
case ICMP_UNREACH:
case ICMP_SOURCEQUENCH:
case ICMP_TIMXCEED:
case ICMP_PARAMPROB:
- iresult = IcmpAliasIn2(la, pip);
+ iresult = IcmpAliasIn2(la, ptr);
break;
case ICMP_ECHO:
case ICMP_TSTAMP:
- iresult = IcmpAliasIn1(la, pip);
+ iresult = IcmpAliasIn1(la, pip, ic);
break;
}
return (iresult);
@@ -461,17 +462,15 @@
static int
-IcmpAliasOut1(struct libalias *la, struct ip *pip, int create)
+IcmpAliasOut1(struct libalias *la, struct ip *pip, struct icmp *ic, int create)
{
/*
Alias outgoing echo and timestamp requests.
De-alias outgoing echo and timestamp replies.
*/
struct alias_link *lnk;
- struct icmp *ic;
LIBALIAS_LOCK_ASSERT(la);
- 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, create);
@@ -506,19 +505,20 @@
static int
-IcmpAliasOut2(struct libalias *la, struct ip *pip)
+IcmpAliasOut2(struct libalias *la, pkt_t ptr)
{
/*
Alias outgoing ICMP error messages containing
IP header and first 64 bits of datagram.
*/
- struct ip *ip;
+ struct ip *ip, *pip;
struct icmp *ic, *ic2;
struct udphdr *ud;
struct tcphdr *tc;
struct alias_link *lnk;
LIBALIAS_LOCK_ASSERT(la);
+ PULLUP_ICMPIP64HDR(pip, ptr);
ic = (struct icmp *)ip_next(pip);
ip = &ic->icmp_ip;
@@ -607,9 +607,10 @@
static int
-IcmpAliasOut(struct libalias *la, struct ip *pip, int create)
+IcmpAliasOut(struct libalias *la, pkt_t ptr, int create)
{
int iresult;
+ struct ip *pip;
struct icmp *ic;
LIBALIAS_LOCK_ASSERT(la);
@@ -619,6 +620,7 @@
if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY)
return (PKT_ALIAS_OK);
+ PULLUP_ICMPHDR(pip, ptr);
ic = (struct icmp *)ip_next(pip);
iresult = PKT_ALIAS_IGNORED;
@@ -626,18 +628,18 @@
case ICMP_ECHO:
case ICMP_TSTAMP:
if (ic->icmp_code == 0) {
- iresult = IcmpAliasOut1(la, pip, create);
+ iresult = IcmpAliasOut1(la, pip, ic, create);
}
break;
case ICMP_UNREACH:
case ICMP_SOURCEQUENCH:
case ICMP_TIMXCEED:
case ICMP_PARAMPROB:
- iresult = IcmpAliasOut2(la, pip);
+ iresult = IcmpAliasOut2(la, ptr);
break;
case ICMP_ECHOREPLY:
case ICMP_TSTAMPREPLY:
- iresult = IcmpAliasOut1(la, pip, create);
+ iresult = IcmpAliasOut1(la, pip, ic, create);
}
return (iresult);
}
@@ -711,8 +713,9 @@
static int
-UdpAliasIn(struct libalias *la, struct ip *pip)
+UdpAliasIn(struct libalias *la, pkt_t ptr)
{
+ struct ip *pip;
struct udphdr *ud;
struct alias_link *lnk;
@@ -721,6 +724,7 @@
if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY)
return (PKT_ALIAS_OK);
+ PULLUP_UDPHDR(pip, ptr);
ud = (struct udphdr *)ip_next(pip);
lnk = FindUdpTcpIn(la, pip->ip_src, pip->ip_dst,
@@ -776,8 +780,9 @@
}
static int
-UdpAliasOut(struct libalias *la, struct ip *pip, int create)
+UdpAliasOut(struct libalias *la, pkt_t ptr, int create)
{
+ struct ip *pip;
struct udphdr *ud;
struct alias_link *lnk;
int error;
@@ -787,6 +792,7 @@
if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY)
return (PKT_ALIAS_OK);
+ PULLUP_UDPHDR(pip, ptr);
ud = (struct udphdr *)ip_next(pip);
lnk = FindUdpTcpOut(la, pip->ip_src, pip->ip_dst,
@@ -838,12 +844,14 @@
static int
-TcpAliasIn(struct libalias *la, struct ip *pip)
+TcpAliasIn(struct libalias *la, pkt_t ptr)
{
+ struct ip *pip;
struct tcphdr *tc;
struct alias_link *lnk;
LIBALIAS_LOCK_ASSERT(la);
+ PULLUP_TCPHDR(pip, ptr);
tc = (struct tcphdr *)ip_next(pip);
lnk = FindUdpTcpIn(la, pip->ip_src, pip->ip_dst,
@@ -960,17 +968,19 @@
}
static int
-TcpAliasOut(struct libalias *la, struct ip *pip, int maxpacketsize, int create)
+TcpAliasOut(struct libalias *la, pkt_t ptr, int maxpacketsize, int create)
{
int proxy_type, error;
u_short dest_port;
u_short proxy_server_port;
struct in_addr dest_address;
struct in_addr proxy_server_address;
+ struct ip *pip;
struct tcphdr *tc;
struct alias_link *lnk;
LIBALIAS_LOCK_ASSERT(la);
+ PULLUP_TCPHDR(pip, ptr);
tc = (struct tcphdr *)ip_next(pip);
if (create)
@@ -1221,14 +1231,14 @@
/* Local prototypes */
static int
-LibAliasOutLocked(struct libalias *la, char *ptr,
- int maxpacketsize, int create);
+LibAliasOutLocked(struct libalias *la, pkt_t ptr,
+ int maxpacketsize, int create);
static int
-LibAliasInLocked(struct libalias *la, char *ptr,
- int maxpacketsize);
+LibAliasInLocked(struct libalias *la, pkt_t ptr,
+ int maxpacketsize);
int
-LibAliasIn(struct libalias *la, char *ptr, int maxpacketsize)
+LibAliasIn(struct libalias *la, pkt_t ptr, int maxpacketsize)
{
int res;
@@ -1239,7 +1249,7 @@
}
static int
-LibAliasInLocked(struct libalias *la, char *ptr, int maxpacketsize)
+LibAliasInLocked(struct libalias *la, pkt_t ptr, int maxpacketsize)
{
struct in_addr alias_addr;
struct ip *pip;
@@ -1253,6 +1263,7 @@
}
HouseKeeping(la);
ClearCheckNewLink(la);
+ PULLUP_IPHDR(pip, ptr);
pip = (struct ip *)ptr;
alias_addr = pip->ip_dst;
@@ -1267,13 +1278,13 @@
if ((ntohs(pip->ip_off) & IP_OFFMASK) == 0) {
switch (pip->ip_p) {
case IPPROTO_ICMP:
- iresult = IcmpAliasIn(la, pip);
+ iresult = IcmpAliasIn(la, ptr);
break;
case IPPROTO_UDP:
- iresult = UdpAliasIn(la, pip);
+ iresult = UdpAliasIn(la, ptr);
break;
case IPPROTO_TCP:
- iresult = TcpAliasIn(la, pip);
+ iresult = TcpAliasIn(la, ptr);
break;
case IPPROTO_GRE: {
int error;
@@ -1339,7 +1350,7 @@
#define UNREG_ADDR_C_UPPER 0xc0a8ffff
int
-LibAliasOut(struct libalias *la, char *ptr, int maxpacketsize)
+LibAliasOut(struct libalias *la, pkt_t ptr, int maxpacketsize)
{
int res;
@@ -1350,7 +1361,7 @@
}
int
-LibAliasOutTry(struct libalias *la, char *ptr, int maxpacketsize, int create)
+LibAliasOutTry(struct libalias *la, pkt_t ptr, int maxpacketsize, int create)
{
int res;
@@ -1361,7 +1372,7 @@
}
static int
-LibAliasOutLocked(struct libalias *la, char *ptr, /* valid IP packet */
+LibAliasOutLocked(struct libalias *la, pkt_t ptr, /* valid IP packet */
int maxpacketsize, /* How much the packet data may grow (FTP
* and IRC inline changes) */
int create /* Create new entries ? */
@@ -1379,7 +1390,7 @@
}
HouseKeeping(la);
ClearCheckNewLink(la);
- pip = (struct ip *)ptr;
+ PULLUP_IPHDR(pip, ptr);
/* Defense against mangled packets */
if (ntohs(pip->ip_len) > maxpacketsize
@@ -1412,13 +1423,13 @@
if ((ntohs(pip->ip_off) & IP_OFFMASK) == 0) {
switch (pip->ip_p) {
case IPPROTO_ICMP:
- iresult = IcmpAliasOut(la, pip, create);
+ iresult = IcmpAliasOut(la, ptr, create);
break;
case IPPROTO_UDP:
- iresult = UdpAliasOut(la, pip, create);
+ iresult = UdpAliasOut(la, ptr, create);
break;
case IPPROTO_TCP:
- iresult = TcpAliasOut(la, pip, maxpacketsize, create);
+ iresult = TcpAliasOut(la, ptr, maxpacketsize, create);
break;
case IPPROTO_GRE: {
int error;
@@ -1433,6 +1444,7 @@
};
/* Walk out chain. */
error = find_handler(OUT, IP, la, pip, &ad);
+ error = 0;
if (error == 0)
iresult = PKT_ALIAS_OK;
else
==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.h#21 (text+ko) ====
@@ -118,13 +118,24 @@
pip = mtod(*ptr, struct ip *); \
PULLUP_SIZE(pip, ptr, (pip->ip_hl << 2) + sizeof(struct icmp)); \
} while (0)
+
+#define PULLUP_ICMPIP64HDR(pip, ptr) do { \
+ int s; \
+ struct icmp *ic; \
+ pip = mtod(*ptr, struct ip *); \
+ ic = (struct icmp *)&(((char *)pip)[pip->ip_hl << 2]); \
+ s = (pip->ip_hl << 2) + sizeof(struct icmp) + \
+ (ic->icmp_ip.ip_hl << 2) - sizeof(struct ip) + 8; \
+ PULLUP_SIZE(pip, ptr, s); \
+} while (0)
#else
typedef char * pkt_t;
#define PULLUP_IPHDR(pip, ptr) pip = (struct ip *)ptr
-#define PULLUP_UDPHDR(pip, ptr)
-#define PULLUP_TCPHDR(pip, ptr)
-#define PULLUP_ICMPHDR(pip, ptr)
+#define PULLUP_UDPHDR(pip, ptr) pip = (struct ip *)ptr
+#define PULLUP_TCPHDR(pip, ptr) pip = (struct ip *)ptr
+#define PULLUP_ICMPHDR(pip, ptr) pip = (struct ip *)ptr
+#define PULLUP_ICMPIP64HDR(pip, ptr) pip = (struct ip *)ptr
#endif
/* Initialization and control functions. */
@@ -137,13 +148,17 @@
void LibAliasUninit(struct libalias *);
/* Packet Handling functions. */
-int LibAliasIn (struct libalias *, char *_ptr, int _maxpacketsize);
-int LibAliasOut(struct libalias *, char *_ptr, int _maxpacketsize);
-int LibAliasOutTry(struct libalias *, char *_ptr, int _maxpacketsize, int _create);
#ifdef _KERNEL
+int LibAliasIn (struct libalias *, struct mbuf **_ptr, int _maxpacketsize);
+int LibAliasOut(struct libalias *, struct mbuf **_ptr, int _maxpacketsize);
+int LibAliasOutTry(struct libalias *, struct mbuf **_ptr,
+ int _maxpacketsize, int _create);
int LibAliasUnaliasOut(struct libalias *, struct mbuf **_ptr,
int _maxpacketsize);
#else
+int LibAliasIn (struct libalias *, char *_ptr, int _maxpacketsize);
+int LibAliasOut(struct libalias *, char *_ptr, int _maxpacketsize);
+int LibAliasOutTry(struct libalias *, char *_ptr, int _maxpacketsize, int _create);
int LibAliasUnaliasOut(struct libalias *, char *_ptr, int _maxpacketsize);
#endif
More information about the p4-projects
mailing list