0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef _LINUX_SUNRPC_SVCAUTH_H_
0011 #define _LINUX_SUNRPC_SVCAUTH_H_
0012
0013 #include <linux/string.h>
0014 #include <linux/sunrpc/msg_prot.h>
0015 #include <linux/sunrpc/cache.h>
0016 #include <linux/sunrpc/gss_api.h>
0017 #include <linux/hash.h>
0018 #include <linux/stringhash.h>
0019 #include <linux/cred.h>
0020
0021 struct svc_cred {
0022 kuid_t cr_uid;
0023 kgid_t cr_gid;
0024 struct group_info *cr_group_info;
0025 u32 cr_flavor;
0026
0027
0028 char *cr_raw_principal;
0029
0030
0031 char *cr_principal;
0032 char *cr_targ_princ;
0033 struct gss_api_mech *cr_gss_mech;
0034 };
0035
0036 static inline void init_svc_cred(struct svc_cred *cred)
0037 {
0038 cred->cr_group_info = NULL;
0039 cred->cr_raw_principal = NULL;
0040 cred->cr_principal = NULL;
0041 cred->cr_targ_princ = NULL;
0042 cred->cr_gss_mech = NULL;
0043 }
0044
0045 static inline void free_svc_cred(struct svc_cred *cred)
0046 {
0047 if (cred->cr_group_info)
0048 put_group_info(cred->cr_group_info);
0049 kfree(cred->cr_raw_principal);
0050 kfree(cred->cr_principal);
0051 kfree(cred->cr_targ_princ);
0052 gss_mech_put(cred->cr_gss_mech);
0053 init_svc_cred(cred);
0054 }
0055
0056 struct svc_rqst;
0057 struct in6_addr;
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078 struct auth_domain {
0079 struct kref ref;
0080 struct hlist_node hash;
0081 char *name;
0082 struct auth_ops *flavour;
0083 struct rcu_head rcu_head;
0084 };
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126 struct auth_ops {
0127 char * name;
0128 struct module *owner;
0129 int flavour;
0130 int (*accept)(struct svc_rqst *rq);
0131 int (*release)(struct svc_rqst *rq);
0132 void (*domain_release)(struct auth_domain *);
0133 int (*set_client)(struct svc_rqst *rq);
0134 };
0135
0136 #define SVC_GARBAGE 1
0137 #define SVC_SYSERR 2
0138 #define SVC_VALID 3
0139 #define SVC_NEGATIVE 4
0140 #define SVC_OK 5
0141 #define SVC_DROP 6
0142 #define SVC_CLOSE 7
0143
0144
0145
0146 #define SVC_DENIED 8
0147 #define SVC_PENDING 9
0148 #define SVC_COMPLETE 10
0149
0150 struct svc_xprt;
0151
0152 extern int svc_authenticate(struct svc_rqst *rqstp);
0153 extern int svc_authorise(struct svc_rqst *rqstp);
0154 extern int svc_set_client(struct svc_rqst *rqstp);
0155 extern int svc_auth_register(rpc_authflavor_t flavor, struct auth_ops *aops);
0156 extern void svc_auth_unregister(rpc_authflavor_t flavor);
0157
0158 extern struct auth_domain *unix_domain_find(char *name);
0159 extern void auth_domain_put(struct auth_domain *item);
0160 extern int auth_unix_add_addr(struct net *net, struct in6_addr *addr, struct auth_domain *dom);
0161 extern struct auth_domain *auth_domain_lookup(char *name, struct auth_domain *new);
0162 extern struct auth_domain *auth_domain_find(char *name);
0163 extern struct auth_domain *auth_unix_lookup(struct net *net, struct in6_addr *addr);
0164 extern int auth_unix_forget_old(struct auth_domain *dom);
0165 extern void svcauth_unix_purge(struct net *net);
0166 extern void svcauth_unix_info_release(struct svc_xprt *xpt);
0167 extern int svcauth_unix_set_client(struct svc_rqst *rqstp);
0168
0169 extern int unix_gid_cache_create(struct net *net);
0170 extern void unix_gid_cache_destroy(struct net *net);
0171
0172
0173
0174
0175
0176 static inline unsigned long hash_str(char const *name, int bits)
0177 {
0178 return hashlen_hash(hashlen_string(NULL, name)) >> (32 - bits);
0179 }
0180
0181 static inline unsigned long hash_mem(char const *buf, int length, int bits)
0182 {
0183 return full_name_hash(NULL, buf, length) >> (32 - bits);
0184 }
0185
0186 #endif