patch-1.3.26 linux/net/ipv4/udp.c
Next file: linux/net/ipx/af_ipx.c
Previous file: linux/net/ipv4/tcp.c
Back to the patch index
Back to the overall index
- Lines: 107
- Date:
Mon Sep 11 20:16:03 1995
- Orig file:
v1.3.25/linux/net/ipv4/udp.c
- Orig date:
Sun Sep 3 12:27:06 1995
diff -u --recursive --new-file v1.3.25/linux/net/ipv4/udp.c linux/net/ipv4/udp.c
@@ -150,33 +150,37 @@
* to find the appropriate port.
*/
-void udp_err(int err, unsigned char *header, unsigned long daddr,
- unsigned long saddr, struct inet_protocol *protocol)
+void udp_err(int type, int code, unsigned char *header, __u32 daddr,
+ __u32 saddr, struct inet_protocol *protocol)
{
- struct udphdr *th;
+ struct udphdr *uh;
struct sock *sk;
- struct iphdr *ip=(struct iphdr *)header;
-
- header += 4*ip->ihl;
/*
* Find the 8 bytes of post IP header ICMP included for us
*/
- th = (struct udphdr *)header;
+ uh = (struct udphdr *)header;
- sk = get_sock(&udp_prot, th->source, daddr, th->dest, saddr);
+ sk = get_sock(&udp_prot, uh->source, daddr, uh->dest, saddr);
if (sk == NULL)
return; /* No socket for error */
- if ((err & 0xff00) == (ICMP_SOURCE_QUENCH << 8))
+ if (type == ICMP_SOURCE_QUENCH)
{ /* Slow down! */
if (sk->cong_window > 1)
sk->cong_window = sk->cong_window/2;
return;
}
+ if (type == ICMP_PARAMETERPROB)
+ {
+ sk->err = EPROTO;
+ sk->error_report(sk);
+ return;
+ }
+
/*
* Various people wanted BSD UDP semantics. Well they've come
* back out because they slow down response to stuff like dead
@@ -189,10 +193,9 @@
/* 4.1.3.3. */
/* After the comment above, that should be no surprise. */
- err &= 0xff;
- if (err < 13 && icmp_err_convert[err].fatal)
+ if (code < 13 && icmp_err_convert[code].fatal)
{
- sk->err = icmp_err_convert[err].errno;
+ sk->err = icmp_err_convert[code].errno;
sk->error_report(sk);
}
}
@@ -218,7 +221,7 @@
* for direct user->board I/O transfers. That one will be fun.
*/
-static void udp_getfrag(const void *p, int saddr, char * to, unsigned int offset, unsigned int fraglen)
+static void udp_getfrag(const void *p, __u32 saddr, char * to, unsigned int offset, unsigned int fraglen)
{
struct udpfakehdr *ufh = (struct udpfakehdr *)p;
const char *src;
@@ -258,7 +261,7 @@
* this is a valid decision.
*/
-static void udp_getfrag_nosum(const void *p, int saddr, char * to, unsigned int offset, unsigned int fraglen)
+static void udp_getfrag_nosum(const void *p, __u32 saddr, char * to, unsigned int offset, unsigned int fraglen)
{
struct udpfakehdr *ufh = (struct udpfakehdr *)p;
const char *src;
@@ -523,7 +526,7 @@
int udp_connect(struct sock *sk, struct sockaddr_in *usin, int addr_len)
{
struct rtable *rt;
- unsigned long sa;
+ __u32 sa;
if (addr_len < sizeof(*usin))
return(-EINVAL);
@@ -535,7 +538,7 @@
if(!sk->broadcast && ip_chk_addr(usin->sin_addr.s_addr)==IS_BROADCAST)
return -EACCES; /* Must turn broadcast on first */
- rt=(sk->localroute?ip_rt_local:ip_rt_route)(usin->sin_addr.s_addr, NULL, &sa);
+ rt=(sk->localroute?ip_rt_local:ip_rt_route)((__u32)usin->sin_addr.s_addr, NULL, &sa);
if(rt==NULL)
return -ENETUNREACH;
sk->saddr = sa; /* Update source address */
@@ -567,8 +570,8 @@
*/
int udp_rcv(struct sk_buff *skb, struct device *dev, struct options *opt,
- unsigned long daddr, unsigned short len,
- unsigned long saddr, int redo, struct inet_protocol *protocol)
+ __u32 daddr, unsigned short len,
+ __u32 saddr, int redo, struct inet_protocol *protocol)
{
struct sock *sk;
struct udphdr *uh;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov
with Sam's (original) version of this