summaryrefslogtreecommitdiffstats
path: root/fs/nfs/nfs4xdr.c
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2013-03-16 15:54:34 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2013-03-29 15:42:56 -0400
commitfb15b26f8ba3ff629a052faf3f4a4744585ca2dc (patch)
tree2218a2e577bf075170497549847d49840f296aae /fs/nfs/nfs4xdr.c
parent72f4dc117b57e05120aaac6e218b8abc09a5c350 (diff)
SUNRPC: Define rpcsec_gss_info structure
The NFSv4 SECINFO procedure returns a list of security flavors. Any GSS flavor also has a GSS tuple containing an OID, a quality-of- protection value, and a service value, which specifies a particular GSS pseudoflavor. For simplicity and efficiency, I'd like to return each GSS tuple from the NFSv4 SECINFO XDR decoder and pass it straight into the RPC client. Define a data structure that is visible to both the NFS client and the RPC client. Take structure and field names from the relevant standards to avoid confusion. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/nfs4xdr.c')
-rw-r--r--fs/nfs/nfs4xdr.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
index 0b744895b9e1..a38fd179c34f 100644
--- a/fs/nfs/nfs4xdr.c
+++ b/fs/nfs/nfs4xdr.c
@@ -5205,27 +5205,30 @@ static int decode_delegreturn(struct xdr_stream *xdr)
5205 return decode_op_hdr(xdr, OP_DELEGRETURN); 5205 return decode_op_hdr(xdr, OP_DELEGRETURN);
5206} 5206}
5207 5207
5208static int decode_secinfo_gss(struct xdr_stream *xdr, struct nfs4_secinfo_flavor *flavor) 5208static int decode_secinfo_gss(struct xdr_stream *xdr,
5209 struct nfs4_secinfo4 *flavor)
5209{ 5210{
5211 u32 oid_len;
5210 __be32 *p; 5212 __be32 *p;
5211 5213
5212 p = xdr_inline_decode(xdr, 4); 5214 p = xdr_inline_decode(xdr, 4);
5213 if (unlikely(!p)) 5215 if (unlikely(!p))
5214 goto out_overflow; 5216 goto out_overflow;
5215 flavor->gss.sec_oid4.len = be32_to_cpup(p); 5217 oid_len = be32_to_cpup(p);
5216 if (flavor->gss.sec_oid4.len > GSS_OID_MAX_LEN) 5218 if (oid_len > GSS_OID_MAX_LEN)
5217 goto out_err; 5219 goto out_err;
5218 5220
5219 p = xdr_inline_decode(xdr, flavor->gss.sec_oid4.len); 5221 p = xdr_inline_decode(xdr, oid_len);
5220 if (unlikely(!p)) 5222 if (unlikely(!p))
5221 goto out_overflow; 5223 goto out_overflow;
5222 memcpy(flavor->gss.sec_oid4.data, p, flavor->gss.sec_oid4.len); 5224 memcpy(flavor->flavor_info.oid.data, p, oid_len);
5225 flavor->flavor_info.oid.len = oid_len;
5223 5226
5224 p = xdr_inline_decode(xdr, 8); 5227 p = xdr_inline_decode(xdr, 8);
5225 if (unlikely(!p)) 5228 if (unlikely(!p))
5226 goto out_overflow; 5229 goto out_overflow;
5227 flavor->gss.qop4 = be32_to_cpup(p++); 5230 flavor->flavor_info.qop = be32_to_cpup(p++);
5228 flavor->gss.service = be32_to_cpup(p); 5231 flavor->flavor_info.service = be32_to_cpup(p);
5229 5232
5230 return 0; 5233 return 0;
5231 5234
@@ -5238,10 +5241,10 @@ out_err:
5238 5241
5239static int decode_secinfo_common(struct xdr_stream *xdr, struct nfs4_secinfo_res *res) 5242static int decode_secinfo_common(struct xdr_stream *xdr, struct nfs4_secinfo_res *res)
5240{ 5243{
5241 struct nfs4_secinfo_flavor *sec_flavor; 5244 struct nfs4_secinfo4 *sec_flavor;
5245 unsigned int i, num_flavors;
5242 int status; 5246 int status;
5243 __be32 *p; 5247 __be32 *p;
5244 int i, num_flavors;
5245 5248
5246 p = xdr_inline_decode(xdr, 4); 5249 p = xdr_inline_decode(xdr, 4);
5247 if (unlikely(!p)) 5250 if (unlikely(!p))