summaryrefslogtreecommitdiffstats
path: root/sys/nfsclient/bootp_subr.c
diff options
context:
space:
mode:
authortegge <tegge@FreeBSD.org>1997-06-12 14:08:20 +0000
committertegge <tegge@FreeBSD.org>1997-06-12 14:08:20 +0000
commitf8fabab00256f975a49438e7d272c08b92a4394e (patch)
tree1a39aa5bd42f7939f4100b56bc90fa1ebe89633e /sys/nfsclient/bootp_subr.c
parentadc55c1f8b546487381d05170174c11cc7583f8a (diff)
downloadFreeBSD-src-f8fabab00256f975a49438e7d272c08b92a4394e.zip
FreeBSD-src-f8fabab00256f975a49438e7d272c08b92a4394e.tar.gz
Move commonly used code into static functions in order to reduce kernel bloat.
Diffstat (limited to 'sys/nfsclient/bootp_subr.c')
-rw-r--r--sys/nfsclient/bootp_subr.c232
1 files changed, 93 insertions, 139 deletions
diff --git a/sys/nfsclient/bootp_subr.c b/sys/nfsclient/bootp_subr.c
index da94bd9..3d0f587 100644
--- a/sys/nfsclient/bootp_subr.c
+++ b/sys/nfsclient/bootp_subr.c
@@ -1,4 +1,4 @@
-/* $Id: bootp_subr.c,v 1.2 1997/05/11 18:05:39 tegge Exp $ */
+/* $Id: bootp_subr.c,v 1.3 1997/05/14 01:31:54 tegge Exp $ */
/*
* Copyright (c) 1995 Gordon Ross, Adam Glass
@@ -116,6 +116,10 @@ static int setfs __P((struct sockaddr_in *addr, char *path, char *p));
static int getdec __P((char **ptr));
static char *substr __P((char *a,char *b));
static void mountopts __P((struct nfs_args *args, char *p));
+static int xdr_opaque_decode __P((struct mbuf **ptr,u_char *buf,
+ int len));
+static int xdr_int_decode __P((struct mbuf **ptr,int *iptr));
+static void printip __P((char *prefix,struct in_addr addr));
#ifdef BOOTP_DEBUG
void bootpboot_p_sa(struct sockaddr *sa,struct sockaddr *ma);
@@ -558,19 +562,6 @@ bootpc_adjust_interface(struct ifreq *ireq,struct socket *so,
return error;
}
-#if 0
- olddst.sin_addr.s_addr = INADDR_BROADCAST;
-
- error = rtrequest(RTM_DELETE,
- (struct sockaddr *) &olddst,
- (struct sockaddr *) &oldgw,
- (struct sockaddr *) NULL,
- (RTF_UP | RTF_HOST | RTF_STATIC), NULL);
- if (error) {
- printf("nfs_boot: del broadcast route, error=%d\n", error);
- }
-#endif
-
/*
* Do enough of ifconfig(8) so that the chosen interface
* can talk to the servers. (just set the address)
@@ -608,21 +599,6 @@ bootpc_adjust_interface(struct ifreq *ireq,struct socket *so,
return error;
}
-#if 0
- /* Remove default gateway arp entry. This is a kludge, but
- somehow the arp entry is added without an arp request
- being sent, causing outgoing packets to be dropped onto the floor */
-
- error = rtrequest(RTM_DELETE,
- (struct sockaddr *) gw,
- (struct sockaddr *) NULL,
- (struct sockaddr *) NULL,
- (RTF_UP | RTF_HOST | RTF_STATIC), NULL);
- if (error) {
- printf("nfs_boot: del default gateway linklevel route, error=%d\n", error);
- }
-#endif
-
return 0;
}
@@ -714,6 +690,51 @@ static void mountopts(args,p)
args->sotype = SOCK_STREAM;
}
+static int xdr_opaque_decode(mptr,buf,len)
+ struct mbuf **mptr;
+ u_char *buf;
+ int len;
+{
+ struct mbuf *m;
+ int alignedlen;
+
+ m = *mptr;
+ alignedlen = ( len + 3 ) & ~3;
+
+ if (m->m_len < alignedlen) {
+ m = m_pullup(m,alignedlen);
+ if (m == NULL) {
+ *mptr = NULL;
+ return EBADRPC;
+ }
+ }
+ bcopy(mtod(m,u_char *),buf,len);
+ m_adj(m,alignedlen);
+ *mptr = m;
+ return 0;
+}
+
+static int xdr_int_decode(mptr,iptr)
+ struct mbuf **mptr;
+ int *iptr;
+{
+ u_int32_t i;
+ if (xdr_opaque_decode(mptr,(u_char *) &i,sizeof(u_int32_t)))
+ return EBADRPC;
+ *iptr = fxdr_unsigned(u_int32_t,i);
+ return 0;
+}
+
+static void printip(char *prefix,struct in_addr addr)
+{
+ unsigned int ip;
+
+ ip = ntohl(addr.s_addr);
+
+ printf("%s is %d.%d.%d.%d\n",prefix,
+ ip >> 24, (ip >> 16) & 255 ,(ip >> 8) & 255 ,ip & 255 );
+}
+
void
bootpc_init(void)
{
@@ -796,7 +817,7 @@ bootpc_init(void)
if (sdl->sdl_alen != EALEN )
panic("bootpc: HW address len is %d, expected value is %d",
sdl->sdl_alen,EALEN);
-#if 1
+
printf("bootpc hw address is ");
delim="";
for (j=0;j<sdl->sdl_alen;j++) {
@@ -804,7 +825,6 @@ bootpc_init(void)
delim=":";
}
printf("\n");
-#endif
#if 0
bootpboot_p_iflist();
@@ -871,21 +891,15 @@ bootpc_init(void)
myaddr.sin_addr = reply.yiaddr;
ip = ntohl(myaddr.sin_addr.s_addr);
- printf("My ip address is %d.%d.%d.%d\n",
- ip >> 24, (ip >> 16) & 255 ,(ip >> 8) & 255 ,ip & 255 );
-
sprintf(lookup_path,"swap.%d.%d.%d.%d",
ip >> 24, (ip >> 16) & 255 ,(ip >> 8) & 255 ,ip & 255 );
- ip = ntohl(reply.siaddr.s_addr);
- printf("Server ip address is %d.%d.%d.%d\n",
- ip >> 24, (ip >> 16) & 255 ,(ip >> 8) & 255 ,ip & 255 );
+ printip("My ip address",myaddr.sin_addr);
- ip = ntohl(reply.giaddr.s_addr);
- printf("Gateway ip address is %d.%d.%d.%d\n",
- ip >> 24, (ip >> 16) & 255 ,(ip >> 8) & 255 ,ip & 255 );
+ printip("Server ip address",reply.siaddr);
gw.sin_addr = reply.giaddr;
+ printip("Gateway ip address",reply.giaddr);
if (reply.sname[0])
printf("Server name is %s\n",reply.sname);
@@ -918,12 +932,10 @@ bootpc_init(void)
panic("bootpc: subnet mask len is %d",len);
bcopy(&reply.vend[j],&netmask.sin_addr,4);
gotnetmask=1;
- printf("Subnet mask is %d.%d.%d.%d\n",
- reply.vend[j],
- reply.vend[j+1],
- reply.vend[j+2],
- reply.vend[j+3]);
+ printip("Subnet mask",netmask.sin_addr);
break;
+ case 6: /* Domain Name servers. Unused */
+ case 16: /* Swap server IP address. unused */
case 2:
/* Time offset */
break;
@@ -933,19 +945,9 @@ bootpc_init(void)
panic("bootpc: Router Len is %d",len);
if (len > 0) {
bcopy(&reply.vend[j],&gw.sin_addr,4);
+ printip("Router",gw.sin_addr);
gotgw=1;
}
- for (i=0;i<len;i+=4) {
- printf("Router is %d.%d.%d.%d\n",
- reply.vend[j+i],
- reply.vend[j+i+1],
- reply.vend[j+i+2],
- reply.vend[j+i+3]);
- }
- break;
- case 6:/* Domain Name servers. Unused */
- break;
- case 16: /* Swap server IP address. unused */
break;
case 17:
if (setfs(&nd->root_saddr, nd->root_hostnam, p)) {
@@ -1001,12 +1003,12 @@ bootpc_init(void)
#endif
if (!gotnetmask) {
- if (IN_CLASSA(myaddr.sin_addr.s_addr))
- netmask.sin_addr.s_addr = IN_CLASSA_NET;
- else if (IN_CLASSB(myaddr.sin_addr.s_addr))
- netmask.sin_addr.s_addr = IN_CLASSB_NET;
+ if (IN_CLASSA(ntohl(myaddr.sin_addr.s_addr)))
+ netmask.sin_addr.s_addr = htonl(IN_CLASSA_NET);
+ else if (IN_CLASSB(ntohl(myaddr.sin_addr.s_addr)))
+ netmask.sin_addr.s_addr = htonl(IN_CLASSB_NET);
else
- netmask.sin_addr.s_addr = IN_CLASSC_NET;
+ netmask.sin_addr.s_addr = htonl(IN_CLASSC_NET);
}
if (!gotgw) {
/* Use proxyarp */
@@ -1120,59 +1122,31 @@ md_mount(mdsin, path, fhp, fhsizep, args, procp)
}
#endif
- if (m->m_len < sizeof(u_int32_t)) {
- m = m_pullup(m, sizeof(u_int32_t));
- if (m == NULL)
- goto bad;
- }
- error = fxdr_unsigned(u_int32_t, *mtod(m,u_int32_t *));
- if (error)
+ if (xdr_int_decode(&m,&error) || error)
goto bad;
- m_adj(m,sizeof(u_int32_t));
if (args->flags & NFSMNT_NFSV3) {
- if (m->m_len < sizeof(u_int32_t)) {
- m = m_pullup(m, sizeof(u_int32_t));
- if (m == NULL)
- goto bad;
- }
- *fhsizep = fxdr_unsigned(u_int32_t, *mtod(m,u_int32_t *));
- if (*fhsizep > NFSX_V3FHMAX || *fhsizep <= 0 )
+ if (xdr_int_decode(&m,fhsizep) ||
+ *fhsizep > NFSX_V3FHMAX || *fhsizep <= 0 )
goto bad;
- m_adj(m,sizeof(u_int32_t));
} else
*fhsizep = NFSX_V2FH;
- if (m->m_len < (((*fhsizep)+3)&~3)) {
- m = m_pullup(m,(((*fhsizep)+3)&~3));
- if (m == NULL)
- goto bad;
- }
- bcopy(mtod(m,u_char *), fhp, *fhsizep);
- m_adj(m,(((*fhsizep)+3)&~3));
+ if (xdr_opaque_decode(&m,fhp,*fhsizep))
+ goto bad;
if (args->flags & NFSMNT_NFSV3) {
- if (m->m_len < sizeof(u_int32_t)) {
- m = m_pullup(m, sizeof(u_int32_t));
- if (m == NULL)
- goto bad;
- }
- authcount = fxdr_unsigned(u_int32_t, *mtod(m,u_int32_t *));
+ if (xdr_int_decode(&m,&authcount))
+ goto bad;
authunixok = 0;
- m_adj(m,sizeof(u_int32_t));
if (authcount<0 || authcount>100)
goto bad;
while (authcount>0) {
- if (m->m_len < sizeof(u_int32_t)) {
- m = m_pullup(m, sizeof(u_int32_t));
- if (m == NULL)
- goto bad;
- }
- authver = fxdr_unsigned(u_int32_t, *mtod(m,u_int32_t *));
+ if (xdr_int_decode(&m,&authver))
+ goto bad;
if (authver == RPCAUTH_UNIX)
authunixok = 1;
authcount--;
- m_adj(m,sizeof(u_int32_t));
}
if (!authunixok)
goto bad;
@@ -1193,6 +1167,7 @@ out:
return error;
}
+
static int md_lookup_swap(mdsin, path, fhp, fhsizep, args, procp)
struct sockaddr_in *mdsin; /* mountd server address */
char *path;
@@ -1206,6 +1181,10 @@ static int md_lookup_swap(mdsin, path, fhp, fhsizep, args, procp)
int size = -1;
int attribs_present;
int status;
+ union {
+ u_int32_t v2[17];
+ u_int32_t v3[21];
+ } fattribs;
m = m_get(M_WAIT,MT_DATA);
if (!m)
@@ -1236,62 +1215,37 @@ static int md_lookup_swap(mdsin, path, fhp, fhsizep, args, procp)
if (error)
return error; /* message already freed */
- if (m->m_len < sizeof(u_int32_t)) {
- m = m_pullup(m, sizeof(u_int32_t));
- if (m == NULL)
- goto bad;
- }
- status = fxdr_unsigned(u_int32_t, *mtod(m,u_int32_t *));
- m_adj(m,sizeof(u_int32_t));
+ if (xdr_int_decode(&m,&status))
+ goto bad;
if (status) {
error = ENOENT;
goto out;
}
if (args->flags & NFSMNT_NFSV3) {
- if (m->m_len < sizeof(u_int32_t)) {
- m = m_pullup(m, sizeof(u_int32_t));
- if (m == NULL)
- goto bad;
- }
- *fhsizep = fxdr_unsigned(u_int32_t, *mtod(m,u_int32_t *));
- if (*fhsizep > NFSX_V3FHMAX || *fhsizep <= 0 )
+ if (xdr_int_decode(&m,fhsizep) ||
+ *fhsizep > NFSX_V3FHMAX || *fhsizep <= 0 )
goto bad;
- m_adj(m,sizeof(u_int32_t));
} else
*fhsizep = NFSX_V2FH;
- if (m->m_len < (((*fhsizep)+3)&~3)) {
- m = m_pullup(m,(((*fhsizep)+3)&~3));
- if (m == NULL)
- goto bad;
- }
- bcopy(mtod(m,u_char *), fhp, *fhsizep);
- m_adj(m,(((*fhsizep)+3)&~3));
+ if (xdr_opaque_decode(&m, fhp, *fhsizep))
+ goto bad;
if (args->flags & NFSMNT_NFSV3) {
- if (m->m_len < sizeof(u_int32_t)) {
- m = m_pullup(m, sizeof(u_int32_t));
- if (m == NULL)
- goto bad;
- }
- attribs_present = fxdr_unsigned(u_int32_t, *mtod(m,u_int32_t *));
- m_adj(m,sizeof(u_int32_t));
+ if (xdr_int_decode(&m,&attribs_present))
+ goto bad;
if (attribs_present) {
- if (m->m_len < sizeof(u_int32_t)*21) {
- m = m_pullup(m, sizeof(u_int32_t)*21);
- if (m == NULL)
- goto bad;
- }
- size = fxdr_unsigned(u_int32_t, mtod(m,u_int32_t *)[6]);
- }
- } else {
- if (m->m_len < sizeof(u_int32_t)*17) {
- m = m_pullup(m, sizeof(u_int32_t)*17);
- if (m == NULL)
+ if (xdr_opaque_decode(&m,(u_char *) &fattribs.v3,
+ sizeof(u_int32_t)*21))
goto bad;
+ size = fxdr_unsigned(u_int32_t, fattribs.v3[6]);
}
- size = fxdr_unsigned(u_int32_t, mtod(m,u_int32_t *)[5]);
+ } else {
+ if (xdr_opaque_decode(&m,(u_char *) &fattribs.v2,
+ sizeof(u_int32_t)*17))
+ goto bad;
+ size = fxdr_unsigned(u_int32_t, fattribs.v2[5]);
}
if (!nfsv3_diskless.swap_nblks && size!= -1) {
OpenPOWER on IntegriCloud