diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-03-17 00:25:34 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-03-17 00:25:34 +0000 |
commit | c806f47ab3d2552e20670bef078392e0dd96eb7f (patch) | |
tree | d804b0e2d827efc2e2d2ed6c7255ba7c813dc124 /nuttx/fs/nfs/nfs_socket.c | |
parent | 7bfcfe92cfcefc051348012db2ee0a79956a1a82 (diff) | |
download | px4-nuttx-c806f47ab3d2552e20670bef078392e0dd96eb7f.tar.gz px4-nuttx-c806f47ab3d2552e20670bef078392e0dd96eb7f.tar.bz2 px4-nuttx-c806f47ab3d2552e20670bef078392e0dd96eb7f.zip |
NFS update; fix STM32 enabling of CAN2 clock
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4494 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/fs/nfs/nfs_socket.c')
-rw-r--r-- | nuttx/fs/nfs/nfs_socket.c | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/nuttx/fs/nfs/nfs_socket.c b/nuttx/fs/nfs/nfs_socket.c new file mode 100644 index 000000000..b6810fded --- /dev/null +++ b/nuttx/fs/nfs/nfs_socket.c @@ -0,0 +1,230 @@ +/* + * copyright (c) 2004 + * the regents of the university of michigan + * all rights reserved + * + * permission is granted to use, copy, create derivative works and redistribute + * this software and such derivative works for any purpose, so long as the name + * of the university of michigan is not used in any advertising or publicity + * pertaining to the use or distribution of this software without specific, + * written prior authorization. if the above copyright notice or any other + * identification of the university of michigan is included in any copy of any + * portion of this software, then the disclaimer below must also be included. + * + * this software is provided as is, without representation from the university + * of michigan as to its fitness for any purpose, and without warranty by the + * university of michigan of any kind, either express or implied, including + * without limitation the implied warranties of merchantability and fitness for + * a particular purpose. the regents of the university of michigan shall not be + * liable for any damages, including special, indirect, incidental, or + * consequential damages, with respect to any claim arising out of or in + * connection with the use of the software, even if it has been or is hereafter + * advised of the possibility of such damages. + */ + +/* wrappers around rpcclnt */ + +/* XXX add tryagain code in nfs_request_xx */ + +/* + * Socket operations for use by nfs + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/malloc.h> +#include <sys/mbuf.h> +#include <sys/mount.h> +#include <sys/socket.h> + +#include "rpc_clnt.h" +#include "rpc_v2.h" +#include "nfs_proto.h +#include "nfs.h" +#include "xdr_subs.h" +#include "nfsmount.h" +//#include <nfsx/nfs_common.h> +#include "nfs_socket.h" + +/* Flag translations */ +#define nfsmnt_to_rpcclnt(nf, rf, name) do { \ + if (nf & NFSMNT_##name)) { \ + rf |= RPCCLNT_##name \ + } \ +} while(0) + +static struct rpc_program nfs2_program = +{ + NFS_PROG, NFS_VER2, "NFSv2" +}; + +static struct rpc_program nfs3_program = +{ + NFS_PROG, NFS_VER3, "NFSv3" +}; + +static struct rpc_program nfs4_program = +{ + NFS_PROG, NFS_VER4, "NFSv4" +}; + +/* XXXMARIUS: name collision */ +int nfsx_connect(struct nfsmount *nmp) +{ + struct rpcclnt *rpc; + int error = 0; + + if (nmp == NULL) + return EFAULT; + + rpc = &nmp->nm_rpcclnt; + + rpc->rc_prog = &nfs3_program; + + printf("nfsxconnect!\n"); + + /* translate nfsmnt flags -> rpcclnt flags */ + rpc->rc_flag = 0; + nfsmnt_to_rpcclnt(nmp->nm_flag, rpc->rc_flag, SOFT); + nfsmnt_to_rpcclnt(nmp->nm_flag, rpc->rc_flag, INT); + nfsmnt_to_rpcclnt(nmp->nm_flag, rpc->rc_flag, NOCONN); + nfsmnt_to_rpcclnt(nmp->nm_flag, rpc->rc_flag, DUMBTIMR); + + rpc->rc_flag |= RPCCLNT_REDIRECT; /* Make this a mount option. */ + + rpc->rc_authtype = RPCAUTH_NULL; /* for now */ + rpc->rc_servername = nmp->nm_mountp->mnt_stat.f_mntfromname; + rpc->rc_name = (struct sockaddr *)nmp->nm_nam; + + rpc->rc_sotype = nmp->nm_sotype; + rpc->rc_soproto = nmp->nm_soproto; + rpc->rc_rsize = (nmp->nm_rsize > nmp->nm_readdirsize) ? + nmp->nm_rsize : nmp->nm_readdirsize; + rpc->rc_wsize = nmp->nm_wsize; + rpc->rc_deadthresh = nmp->nm_deadthresh; + rpc->rc_timeo = nmp->nm_timeo; + rpc->rc_retry = nmp->nm_retry; + + /* XXX v2,3 need to use this */ + rpc->rc_proctlen = 0; + rpc->rc_proct = NULL; + + if (error) + return error; + + return rpcclnt_connect(rpc); +} + +/* NFS disconnect. Clean up and unlink. */ + +/* XXXMARIUS: name collision */ + +void nfsx_disconnect(struct nfsmount *nmp) +{ + rpcclnt_disconnect(&nmp->nm_rpcclnt); +} + +#ifdef CONFIG_NFS_TCPIP +void nfsx_safedisconnect(struct nfsmount *nmp) +{ + rpcclnt_safedisconnect(&nmp->nm_rpcclnt); +} +#endif + +int +nfsx_request_xx(struct nfsmount *nm, struct vnode *vp, struct mbuf *mrest, + int procnum, cthread_t * td, struct ucred *cred, + struct mbuf **mrp, struct mbuf **mdp, caddr_t * dposp) +{ + int error; + u_int32_t *tl; + struct nfsmount *nmp; + struct rpcclnt *clnt; + struct mbuf *md, *mrep; + caddr_t dpos; + struct rpc_reply reply; +#if 0 + int t1; +#endif /* 0 */ + + if (vp != NULL) + nmp = VFSTONFS(vp->v_mount); + else + nmp = nm; + + clnt = &nmp->nm_rpcclnt; + +#if 0 +tryagain: +#endif + + memset(&reply, 0, sizeof(reply)); + + if ((error = rpcclnt_request(clnt, mrest, procnum, td, cred, &reply)) != 0) + goto out; + + mrep = reply.mrep; + md = reply.result_md; + dpos = reply.result_dpos; + + tl = nfsm_dissect(u_int32_t *, NFSX_UNSIGNED); + if (*tl != 0) + { + error = fxdr_unsigned(int, *tl); +#if 0 + if ((nmp->nm_flag & NFSMNT_NFSV3) && error == NFSERR_TRYLATER) + { + m_freem(mrep); + error = 0; + waituntil = time_second + trylater_delay; + while (time_second < waituntil) + (void)tsleep(&lbolt, PSOCK, "nqnfstry", 0); + trylater_delay *= nfs_backoff[trylater_cnt]; + if (trylater_cnt < NFS_NBACKOFF - 1) + trylater_cnt++; + goto tryagain; + } +#endif + + /* + ** If the File Handle was stale, invalidate the + ** lookup cache, just in case. + **/ + if (error == ESTALE) + if (vp != NULL) + cache_purge(vp); + else + printf("%s: ESTALE on mount from server %s\n", + nmp->nm_rpcclnt.rc_prog->prog_name, + nmp->nm_rpcclnt.rc_servername); + else + printf("%s: unknown error %d from server %s\n", + nmp->nm_rpcclnt.rc_prog->prog_name, error, + nmp->nm_rpcclnt.rc_servername); + goto out; + } + + m_freem(mrest); + + *mrp = mrep; + *mdp = md; + *dposp = dpos; + return (0); +nfsmout: +out: + /* XXX: don't free mrest if an error occured, to allow caller to retry */ + m_freem(mrest); + m_freem(reply.mrep); + *mrp = NULL; + *mdp = NULL; + + return (error); +} + +/* terminate any outstanding RPCs. */ + +int nfsx_nmcancelreqs(struct nfsmount *nmp) +{ + return rpcclnt_cancelreqs(&nmp->nm_rpcclnt); +} |