1/* 2 * ncp_fs_sb.h 3 * 4 * Copyright (C) 1995, 1996 by Volker Lendecke 5 * 6 */ 7 8#ifndef _NCP_FS_SB 9#define _NCP_FS_SB 10 11#include <linux/types.h> 12#include <linux/ncp_mount.h> 13#include <linux/net.h> 14#include <linux/mutex.h> 15#include <linux/backing-dev.h> 16#include <linux/workqueue.h> 17 18#define NCP_DEFAULT_OPTIONS 0 /* 2 for packet signatures */ 19 20struct sock; 21 22struct ncp_mount_data_kernel { 23 unsigned long flags; /* NCP_MOUNT_* flags */ 24 unsigned int int_flags; /* internal flags */ 25#define NCP_IMOUNT_LOGGEDIN_POSSIBLE 0x0001 26 __kernel_uid32_t mounted_uid; /* Who may umount() this filesystem? */ 27 struct pid *wdog_pid; /* Who cares for our watchdog packets? */ 28 unsigned int ncp_fd; /* The socket to the ncp port */ 29 unsigned int time_out; /* How long should I wait after 30 sending a NCP request? */ 31 unsigned int retry_count; /* And how often should I retry? */ 32 unsigned char mounted_vol[NCP_VOLNAME_LEN + 1]; 33 __kernel_uid32_t uid; 34 __kernel_gid32_t gid; 35 __kernel_mode_t file_mode; 36 __kernel_mode_t dir_mode; 37 int info_fd; 38}; 39 40struct ncp_server { 41 42 struct ncp_mount_data_kernel m; /* Nearly all of the mount data is of 43 interest for us later, so we store 44 it completely. */ 45 46 __u8 name_space[NCP_NUMBER_OF_VOLUMES + 2]; 47 48 struct file *ncp_filp; /* File pointer to ncp socket */ 49 struct socket *ncp_sock;/* ncp socket */ 50 struct file *info_filp; 51 struct socket *info_sock; 52 53 u8 sequence; 54 u8 task; 55 u16 connection; /* Remote connection number */ 56 57 u8 completion; /* Status message from server */ 58 u8 conn_status; /* Bit 4 = 1 ==> Server going down, no 59 requests allowed anymore. 60 Bit 0 = 1 ==> Server is down. */ 61 62 int buffer_size; /* Negotiated bufsize */ 63 64 int reply_size; /* Size of last reply */ 65 66 int packet_size; 67 unsigned char *packet; /* Here we prepare requests and 68 receive replies */ 69 unsigned char *txbuf; /* Storage for current request */ 70 unsigned char *rxbuf; /* Storage for reply to current request */ 71 72 int lock; /* To prevent mismatch in protocols. */ 73 struct mutex mutex; 74 75 int current_size; /* for packet preparation */ 76 int has_subfunction; 77 int ncp_reply_size; 78 79 int root_setuped; 80 struct mutex root_setup_lock; 81 82 /* info for packet signing */ 83 int sign_wanted; /* 1=Server needs signed packets */ 84 int sign_active; /* 0=don't do signing, 1=do */ 85 char sign_root[8]; /* generated from password and encr. key */ 86 char sign_last[16]; 87 88 /* Authentication info: NDS or BINDERY, username */ 89 struct { 90 int auth_type; 91 size_t object_name_len; 92 void* object_name; 93 int object_type; 94 } auth; 95 /* Password info */ 96 struct { 97 size_t len; 98 void* data; 99 } priv; 100 struct rw_semaphore auth_rwsem; 101 102 /* nls info: codepage for volume and charset for I/O */ 103 struct nls_table *nls_vol; 104 struct nls_table *nls_io; 105 106 /* maximum age in jiffies */ 107 atomic_t dentry_ttl; 108 109 /* miscellaneous */ 110 unsigned int flags; 111 112 spinlock_t requests_lock; /* Lock accesses to tx.requests, tx.creq and rcv.creq when STREAM mode */ 113 114 void (*data_ready)(struct sock* sk, int len); 115 void (*error_report)(struct sock* sk); 116 void (*write_space)(struct sock* sk); /* STREAM mode only */ 117 struct { 118 struct work_struct tq; /* STREAM/DGRAM: data/error ready */ 119 struct ncp_request_reply* creq; /* STREAM/DGRAM: awaiting reply from this request */ 120 struct mutex creq_mutex; /* DGRAM only: lock accesses to rcv.creq */ 121 122 unsigned int state; /* STREAM only: receiver state */ 123 struct { 124 __u32 magic __packed; 125 __u32 len __packed; 126 __u16 type __packed; 127 __u16 p1 __packed; 128 __u16 p2 __packed; 129 __u16 p3 __packed; 130 __u16 type2 __packed; 131 } buf; /* STREAM only: temporary buffer */ 132 unsigned char* ptr; /* STREAM only: pointer to data */ 133 size_t len; /* STREAM only: length of data to receive */ 134 } rcv; 135 struct { 136 struct list_head requests; /* STREAM only: queued requests */ 137 struct work_struct tq; /* STREAM only: transmitter ready */ 138 struct ncp_request_reply* creq; /* STREAM only: currently transmitted entry */ 139 } tx; 140 struct timer_list timeout_tm; /* DGRAM only: timeout timer */ 141 struct work_struct timeout_tq; /* DGRAM only: associated queue, we run timers from process context */ 142 int timeout_last; /* DGRAM only: current timeout length */ 143 int timeout_retries; /* DGRAM only: retries left */ 144 struct { 145 size_t len; 146 __u8 data[128]; 147 } unexpected_packet; 148 struct backing_dev_info bdi; 149}; 150 151extern void ncp_tcp_rcv_proc(struct work_struct *work); 152extern void ncp_tcp_tx_proc(struct work_struct *work); 153extern void ncpdgram_rcv_proc(struct work_struct *work); 154extern void ncpdgram_timeout_proc(struct work_struct *work); 155extern void ncpdgram_timeout_call(unsigned long server); 156extern void ncp_tcp_data_ready(struct sock* sk, int len); 157extern void ncp_tcp_write_space(struct sock* sk); 158extern void ncp_tcp_error_report(struct sock* sk); 159 160#define NCP_FLAG_UTF8 1 161 162#define NCP_CLR_FLAG(server, flag) ((server)->flags &= ~(flag)) 163#define NCP_SET_FLAG(server, flag) ((server)->flags |= (flag)) 164#define NCP_IS_FLAG(server, flag) ((server)->flags & (flag)) 165 166static inline int ncp_conn_valid(struct ncp_server *server) 167{ 168 return ((server->conn_status & 0x11) == 0); 169} 170 171static inline void ncp_invalidate_conn(struct ncp_server *server) 172{ 173 server->conn_status |= 0x01; 174} 175 176#endif 177