XRootD
Loading...
Searching...
No Matches
XrdXrootdProtocol.hh
Go to the documentation of this file.
1#ifndef __XROOTD_PROTOCOL_H__
2#define __XROOTD_PROTOCOL_H__
3/******************************************************************************/
4/* */
5/* X r d X r o o t d P r o t o c o l . h h */
6/* */
7/* (c) 2004 by the Board of Trustees of the Leland Stanford, Jr., University */
8/* Produced by Andrew Hanushevsky for Stanford University under contract */
9/* DE-AC02-76-SFO0515 with the Department of Energy */
10/* */
11/* This file is part of the XRootD software suite. */
12/* */
13/* XRootD is free software: you can redistribute it and/or modify it under */
14/* the terms of the GNU Lesser General Public License as published by the */
15/* Free Software Foundation, either version 3 of the License, or (at your */
16/* option) any later version. */
17/* */
18/* XRootD is distributed in the hope that it will be useful, but WITHOUT */
19/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
20/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */
21/* License for more details. */
22/* */
23/* You should have received a copy of the GNU Lesser General Public License */
24/* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */
25/* COPYING (GPL license). If not, see <http://www.gnu.org/licenses/>. */
26/* */
27/* The copyright holder's institutional names and contributor's names may not */
28/* be used to endorse or promote products derived from this software without */
29/* specific prior written permission of the institution or contributor. */
30/******************************************************************************/
31
32#include <cstdlib>
33#include <unistd.h>
34#include <sys/types.h>
35
36#include "XrdNet/XrdNetPMark.hh"
37#include "XrdSys/XrdSysError.hh"
41#include "XrdSfs/XrdSfsDio.hh"
43
44#include "Xrd/XrdObject.hh"
45#include "Xrd/XrdProtocol.hh"
50
51/******************************************************************************/
52/* D e f i n e s */
53/******************************************************************************/
54
55#define ROOTD_PQ 2012
56
57#define XRD_LOGGEDIN 1
58#define XRD_NEED_AUTH 2
59#define XRD_BOUNDPATH 8
60
61#ifndef __GNUC__
62#define __attribute__(x)
63#endif
64
65/******************************************************************************/
66/* x r d _ P r o t o c o l _ X R o o t d */
67/******************************************************************************/
68
69class XrdNetSocket;
70class XrdOucEnv;
71class XrdOucErrInfo;
72class XrdOucReqID;
73class XrdOucStream;
74class XrdOucTList;
75class XrdOucTokenizer;
76class XrdSecProtect;
77class XrdSecProtector;
78class XrdSfsDirectory;
80class XrdSecProtocol;
81class XrdBuffer;
82class XrdLink;
83class XrdTlsContext;
84class XrdXrootdFile;
87class XrdXrootdJob;
89class XrdXrootdPgwCtl;
90class XrdXrootdPio;
92class XrdXrootdStats;
93class XrdXrootdXPath;
94
95struct XrdSfsFACtl;
96struct XrdXrootdWVInfo;
97
98/******************************************************************************/
99/* N a m e s p a c e X r d X r o o t d */
100/******************************************************************************/
101
102namespace XrdXrootd
103{
104struct netInfo;
105
106/******************************************************************************/
107/* g d C a l l B a c k */
108/******************************************************************************/
109
110class gdCallBack // Used for new style getData() with callback
111{
112public:
113
114// Called when getData with a buffer successfully completed with a suspension.
115// A direct return is made if there was no suspension. Return values and action:
116// >1 If getData with a buffer was called while in the callback, the operation
117// is performed with a subsequent callback. Otherwise, a fatal error results.
118// =0 Variable discard holds the number of bytes to be discarded from the
119// from the socket (default 0). Return is made to link-level.
120// <0 Considered a fatal link error.
121//
122virtual int gdDone() = 0;
123
124// Called when a fatal link error occurs during reading.
125//
126virtual void gdFail() {} // Called when a link failure occurs
127
129virtual ~gdCallBack() {}
130};
131
132/******************************************************************************/
133/* I O P a r m s */
134/******************************************************************************/
135
137{
139union {
140long long Offset;
141long long WVBytes;
142int EInfo[2];
143 };
145unsigned short Flags;
147char Mode;
148static const int useBasic = 0;
149static const int useMMap = 1;
150static const int useSF = 2;
151};
152}
153
154/******************************************************************************/
155/* C l a s s X r d X r o o t d P r o t o c o l */
156/******************************************************************************/
157
159 public XrdSfsDio, public XrdSfsXio
160{
161friend class XrdXrootdAdmin;
162public:
163
164 void aioUpdate(int val) {srvrAioOps += val;}
165
166 void aioUpdReq(int val) {linkAioReq += val;}
167
168static char *Buffer(XrdSfsXioHandle h, int *bsz); // XrdSfsXio
169
170XrdSfsXioHandle Claim(const char *buff, int datasz, int minasz=0) override;// XrdSfsXio
171
172static int Configure(char *parms, XrdProtocol_Config *pi);
173
174 void DoIt() override {(*this.*Resume)();}
175
177
178 int getData(gdCallBack *gdcbP, const char *dtype,
179 char *buff, int blen);
180
181 int getData(gdCallBack *gdcbP, const char *dtype,
182 struct iovec *iov, int iovn);
183
184 int getDump(const char *dtype, int dlen);
185
186 int getPathID() {return PathID;}
187
188 XrdProtocol *Match(XrdLink *lp) override;
189
190 int Process(XrdLink *lp) override; // Sync: Job->Link.DoIt->Process
191
192 int Process2();
193
194 int ProcSig();
195
196 void Recycle(XrdLink *lp, int consec, const char *reason) override;
197
198static void Reclaim(XrdSfsXioHandle h); // XrdSfsXio
199
200 int SendFile(int fildes) override; // XrdSfsDio
201
202 int SendFile(XrdOucSFVec *sfvec, int sfvnum) override; // XrdSfsDio
203
204 void SetFD(int fildes) override; // XrdSfsDio
205
206 int Stats(char *buff, int blen, int do_sync=0) override;
207
208 void StreamNOP();
209
210XrdSfsXioHandle Swap(const char *buff, XrdSfsXioHandle h=0) override; // XrdSfsXio
211
212XrdXrootdProtocol *VerifyStream(int &rc, int pID, bool lok=true);
213
216 ~XrdXrootdProtocol() {Cleanup();}
217
218static const int maxStreams = 16;
219
220// async configuration values (referenced outside this class)
221//
222static int as_maxperlnk; // Max async requests per link
223static int as_maxperreq; // Max async ops per request
224static int as_maxpersrv; // Max async ops per server
225static int as_miniosz; // Min async request size
226static int as_minsfsz; // Min sendf request size
227static int as_seghalf;
228static int as_segsize; // Aio quantum (optimal)
229static int as_maxstalls; // Maximum stalls we will tolerate
230static short as_okstutter; // Allowable stutters per transfer unit
231static short as_timeout; // request timeout (usually < stream timeout)
232static bool as_force; // aio to be forced
233static bool as_aioOK; // aio is enabled
234static bool as_nosf; // sendfile is disabled
235static bool as_syncw; // writes to be synchronous
236
237private:
238
239// Note that Route[] structure (below) must have RD_Num elements!
240//
241enum RD_func {RD_chmod = 0, RD_chksum, RD_dirlist, RD_locate, RD_mkdir,
242 RD_mv, RD_prepare, RD_prepstg, RD_rm, RD_rmdir,
243 RD_stat, RD_trunc, RD_ovld, RD_client,
244 RD_openw, RD_open1, RD_open2, RD_open3, RD_open4,
245 RD_Num};
246
247 int do_Auth();
248 int do_Bind();
249 int do_ChkPnt();
250 int do_ChkPntXeq();
251 int do_Chmod();
252 int do_CKsum(int canit);
253 int do_CKsum(char *algT, const char *Path, char *Opaque);
254 int do_Clone();
255 int do_Close();
256 int do_Dirlist();
257 int do_DirStat(XrdSfsDirectory *dp, char *pbuff, char *opaque);
258 int do_Endsess();
259 int do_FAttr();
260 int do_gpFile();
261 int do_Login();
262 int do_Locate();
263 int do_Mkdir();
264 int do_Mv();
265 int do_Offload(int (XrdXrootdProtocol::*Invoke)(), int pathID);
266 int do_OffloadIO();
267 int do_Open();
268 bool do_PgClose(XrdXrootdFile *fP, int &rc);
269 int do_PgRead();
270 int do_PgRIO();
271 int do_PgWrite();
272 bool do_PgWAIO(int &rc);
273 int do_PgWIO();
274 int do_PgWIO(bool isFresh);
275 bool do_PgWIORetry(int &rc);
276 bool do_PgWIOSetup(XrdXrootdPgwCtl *pgwCtl);
277 int do_Ping();
278 int do_Prepare(bool isQuery=false);
279 int do_Protocol();
280 int do_Qconf();
281 int do_QconfCX(XrdOucTokenizer &qcargs, char *val);
282 int do_Qfh();
283 int do_Qopaque(short);
284 int do_Qspace();
285 int do_Query();
286 int do_Qxattr();
287 int do_Read();
288 int do_ReadV();
289 int do_ReadAll();
290 int do_ReadNone(int &retc, int &pathID);
291 int do_Rm();
292 int do_Rmdir();
293 int do_Set();
294 int do_Set_Cache(XrdOucTokenizer &setargs);
295 int do_Set_Mon(XrdOucTokenizer &setargs);
296 int do_Stat();
297 int do_Statx();
298 int do_Sync();
299 int do_Truncate();
300 int do_Write();
301 int do_WriteAio();
302 int do_WriteAll();
303 int do_WriteCont();
304 int do_WriteNone();
305 int do_WriteNone(int pathid, XErrorCode ec=kXR_noErrorYet,
306 const char *emsg=0);
307 int do_WriteNoneMsg();
308 int do_WriteV();
309 int do_WriteVec();
310
311 int gdDone() override {return do_PgWIO(false);}
312
313 void Assign(const XrdXrootdProtocol &rhs);
314static int CheckSum(XrdOucStream *, char **, int);
315 void Cleanup();
316static int Config(const char *fn);
317static bool ConfigMon(XrdProtocol_Config *pi, XrdOucEnv &xrootdEnv);
318static int ConfigSecurity(XrdOucEnv &xEnv, const char *cfn);
319 int fsError(int rc, char opc, XrdOucErrInfo &myError,
320 const char *Path, char *Cgi);
321 int fsOvrld(char opc, const char *Path, char *Cgi);
322 int fsRedirNoEnt(const char *eMsg, char *Cgi, int popt);
323XrdXrootd::
324 netInfo* fsRedirIP(const char *trg, int port);
325 int fsRedirPI(const char *trg, int port, int trglen);
326 int getBuff(const int isRead, int Quantum);
327 char *getCksType(char *opaque, char *cspec=0, int cslen=0);
328 int getData(const char *dtype, char *buff, int blen);
329 int getDataCont();
330 int getDataIovCont();
331 int getDumpCont();
332 bool logLogin(bool xauth=false);
333static int mapMode(int mode);
334 void Reset();
335static int rpCheck(char *fn, char **opaque);
336 int rpEmsg(const char *op, char *fn);
337 int vpEmsg(const char *op, char *fn);
338static int CheckTLS(const char *tlsProt);
339static bool ConfigFS(XrdOucEnv &xEnv, const char *cfn);
340static bool ConfigFS(const char *path, XrdOucEnv &xEnv, const char *cfn);
341static bool ConfigGStream(XrdOucEnv &myEnv, XrdOucEnv *urEnv);
342static bool ConfigRedirPI(const char*, XrdOucEnv&, const char*, const char*);
343static int Squash(char *);
344 int StatGen(struct stat &buf, char *xxBuff, int xxLen, bool xa=false);
345static int xapath(XrdOucStream &Config);
346static int xasync(XrdOucStream &Config);
347static int xcksum(XrdOucStream &Config);
348static int xbif(XrdOucStream &Config);
349static int xdig(XrdOucStream &Config);
350static int xexp(XrdOucStream &Config);
351static int xexpdo(char *path, int popt=0);
352static int xfsl(XrdOucStream &Config);
353static int xfsL(XrdOucStream &Config, char *val, int lix);
354static int xfso(XrdOucStream &Config);
355static int xgpf(XrdOucStream &Config);
356static int xprep(XrdOucStream &Config);
357static int xlog(XrdOucStream &Config);
358static int xmon(XrdOucStream &Config);
359static char *xmondest(const char *what, char *val);
360static int xmongs(XrdOucStream &Config);
361static bool xmongsend(XrdOucStream &Config, char *val, char *&dest,
362 int &opt, int &fmt, int &hdr);
363static int xrdl(XrdOucStream &Config);
364static char* xrdlopt(XrdOucStream &Config, char* val);
365static int xred(XrdOucStream &Config);
366static int xred_clnt(XrdOucStream &Config, char *hP[2], int rPort[2]);
367static bool xred_php(char *val, char *hP[2], int rPort[2], const char *what,
368 bool optport=false);
369static void xred_set(RD_func func, char *rHost[2], int rPort[2]);
370static bool xred_xok(int func, char *rHost[2], int rPort[2]);
371static int xsecl(XrdOucStream &Config);
372static int xtls(XrdOucStream &Config);
373static int xtlsr(XrdOucStream &Config);
374static int xtrace(XrdOucStream &Config);
375static int xlimit(XrdOucStream &Config);
376
377 int ProcFAttr(char *faPath, char *faCgi, char *faArgs,
378 int faALen, int faCode, bool doAChk);
379 int XeqFADel(XrdSfsFACtl &ctl, char *faVars, int faVLen);
380 int XeqFAGet(XrdSfsFACtl &ctl, char *faVars, int faVLen);
381 int XeqFALsd(XrdSfsFACtl &ctl);
382 int XeqFALst(XrdSfsFACtl &ctl);
383 int XeqFASet(XrdSfsFACtl &ctl, char *faVars, int faVLen);
384
385static XrdObjectQ<XrdXrootdProtocol> ProtStack;
386XrdObject<XrdXrootdProtocol> ProtLink;
387
388protected:
389
390static unsigned int getSID();
391
392 void MonAuth();
393 int SetSF(kXR_char *fhandle, bool seton=false);
394
395 static bool CloseRequestCb(void *cbarg);
396 bool RequestClose();
397
398static XrdXrootdXPath RPList; // Redirected paths
399static XrdXrootdXPath RQList; // Redirected paths for ENOENT
400static XrdXrootdXPath XPList; // Exported paths
401static XrdSfsFileSystem *osFS; // The filesystem
402static XrdSfsFileSystem *digFS; // The filesystem (digFS)
403static XrdSecService *CIA; // Authentication Server
404static XrdSecProtector *DHS; // Protection Server
405static XrdTlsContext *tlsCtx; // Protection Server TLS available
406static XrdXrootdFileLock *Locker; // File lock handler
407static XrdScheduler *Sched; // System scheduler
408static XrdBuffManager *BPool; // Buffer manager
409static XrdSysError &eDest; // Error message handler
410static XrdNetPMark *PMark; // Packet marking API
411static XrdXrootdRedirPI *RedirPI; // Redirect plugin
412static const char *myInst;
413static const char *TraceID;
414static int RQLxist; // Something is present in RQList
415static int myPID;
416static int myRole; // Role for kXR_protocol (>= 2.9.7)
417static int myRolf; // Role for kXR_protocol (< 2.9.7)
418
419static gid_t myGID;
420static uid_t myUID;
421static int myGNLen;
422static int myUNLen;
423static const char *myGName;
424static const char *myUName;
425static time_t keepT;
426
427// Admin control area
428//
430
431// Processing configuration values
432//
433static int hailWait;
434static int readWait;
435static int Port;
436static int Window;
437static int tlsPort;
438static int redirIPHold;
439static char *Notify;
440static const char *myCName;
441static int myCNlen;
442static char isRedir;
443static char JobLCL;
444static char JobCKCGI;
446static char *JobCKT;
449static uint64_t fsFeatures;
450
451// Static redirection
452//
453static struct RD_Table {char *Host[2];
454 unsigned short Port[2];
455 short RDSz[2];} Route[RD_Num];
456
457static struct RC_Table {char *Domain[4];
458 short DomCnt;
459 bool pvtIP;
461
462static int OD_Stall;
463static bool OD_Bypass;
464static bool OD_Redir;
465
466static bool CL_Redir;
467
468static bool isProxy;
469
470// Extended attributes
471//
472static int usxMaxNsz;
473static int usxMaxVsz;
474static char *usxParms;
475
476// TLS configuration
477//
478static const char Req_TLSData = 0x01;
479static const char Req_TLSGPFile= 0x02;
480static const char Req_TLSLogin = 0x04;
481static const char Req_TLSSess = 0x08;
482static const char Req_TLSTPC = 0x10;
483
484static char tlsCap; // TLS requirements for capable clients
485static char tlsNot; // TLS requirements for incapable clients
486
487// Buffer configuration
488//
489static int maxBuffsz; // Maximum buffer size we can have
490static int maxTransz; // Maximum transfer size we can have
491static int maxReadv_ior; // Maximum readv element length
492
493// Statistical area
494//
496int numReads; // Count for kXR_read
497int numReadP; // Count for kXR_read pre-preads
498int numReadV; // Count for kkR_readv
499int numSegsV; // Count for kkR_readv segmens
500int numWritV; // Count for kkR_write
501int numSegsW; // Count for kkR_writev segmens
502int numWrites; // Count
503int numFiles; // Count
504
505int cumReads; // Count less numReads
506int cumReadP; // Count less numReadP
507int cumReadV; // Count less numReadV
508int cumSegsV; // Count less numSegsV
509int cumWritV; // Count less numWritV
510int cumSegsW; // Count less numSegsW
511int cumWrites; // Count less numWrites
512int myStalls; // Number of stalls
513long long totReadP; // Bytes
514
515// Data local to each protocol/link combination
516//
522int clientPV; // Protocol version + capabilities
523int clientRN; // Release as maj.min.patch (1 byte each).
524bool pmDone; // Packet marking has been enabled
525char reserved[3];
526short rdType;
528unsigned char CapVer;
530
531// Authentication area
532//
538
539// Request signing area
540//
541ClientRequest sigReq2Ver; // Request to verify
542SecurityRequest sigReq; // Signature request
543char sigBuff[64]; // Signature payload SHA256 + blowfish
544bool sigNeed; // Signature target present
545bool sigHere; // Signature request present
546bool sigRead; // Signature being read
547bool sigWarn; // Once for unneeded signature
548
549// Async I/O area, these need to be atomic
550//
551RAtomic_int linkAioReq; // Aio requests inflight for link
552static RAtomic_int srvrAioOps; // Aio operations inflight for server
553
554// Buffer information, used to drive getData(), and (*Resume)()
555//
557char *myBuff;
560
562{
565union {int iovAdj;
566 int BuffLen;
567 int DumpLen;
568 };
569bool useCB;
571unsigned char stalls;
573union {struct iovec *iovVec;
574 char *Buffer;
575 };
576const char *ioDType;
578
579static const int inNone = 0;
580static const int inCallBk = 1;
581static const int inData = 2;
582static const int inDataIov = 3;
583static const int inDump = 4;
584
585static const int Active = 1; // linkWait: thread is waiting for link
586static const int Terminate = 3; // linkWait: thread should immediately exit
587
589
591int (XrdXrootdProtocol::*ResumePio)(); //Used by Offload
594
595// Buffer resize control area
596//
597static int hcMax;
600 int hcNow;
602
603// This area is used for parallel streams
604//
605XrdSysMutex unbindMutex; // If locked always before streamMutex
611unsigned int mySID;
614bool isNOP;
615
616static const int maxPio = 4;
620
621short PathID; // Path for this protocol object
622bool newPio; // True when initially scheduled
623unsigned char rvSeq;
624unsigned char wvSeq;
625
626char doTLS; // TLS requirements for client
627bool ableTLS; // T->Client is able to use TLS
628bool isTLS; // T->Client using TLS on control stream
629
630// Track usage limts.
631//
632static bool PrepareAlt; // Use alternate prepare handling
633static bool LimitError; // Indicates that hitting a limit should result in an error response.
634 // If false, when possible, silently ignore errors.
636static int PrepareLimit;
637
638// Buffers to handle client requests
639//
643};
644#endif
XErrorCode
@ kXR_noErrorYet
unsigned char kXR_char
Definition XPtypes.hh:65
#define stat(a, b)
Definition XrdPosix.hh:101
XrdOucString Path
#define eMsg(x)
int emsg(int rc, char *msg)
class XrdBuffer * XrdSfsXioHandle
Definition XrdSfsXio.hh:46
XrdSys::RAtomic< unsigned char > RAtomic_uchar
XrdSys::RAtomic< int > RAtomic_int
friend class XrdScheduler
Definition XrdJob.hh:44
XrdProtocol(const char *jname)
XrdSfsDio()
Constructor and destructor.
Definition XrdSfsDio.hh:103
XrdSfsXio(XrdSfsXioImpl &xioimpl)
Definition XrdSfsXio.cc:52
static XrdXrootdStats * SI
static const char * myInst
int SendFile(int fildes) override
XrdXrootdProtocol * VerifyStream(int &rc, int pID, bool lok=true)
static XrdSfsFileSystem * digFS
int SetSF(kXR_char *fhandle, bool seton=false)
XrdSecProtect * Protect
int getData(gdCallBack *gdcbP, const char *dtype, struct iovec *iov, int iovn)
XrdNetPMark::Handle * pmHandle
static XrdNetPMark * PMark
XrdXrootdProtocol * Stream[maxStreams]
XrdXrootd::IOParms IO
static XrdXrootdXPath RPList
static XrdNetSocket * AdminSock
friend class XrdXrootdAdmin
static const char Req_TLSGPFile
XrdProtocol * Match(XrdLink *lp) override
struct XrdXrootdProtocol::GetDataCtl gdCtl
static bool CloseRequestCb(void *cbarg)
void SetFD(int fildes) override
static const char Req_TLSSess
XrdXrootdWVInfo * wvInfo
XrdXrootdPgwCtl * pgwCtl
static void Reclaim(XrdSfsXioHandle h)
XrdSysSemaphore * reTry
XrdXrootdFileTable * FTab
static XrdXrootdJob * JobCKS
static XrdSysError & eDest
static unsigned int getSID()
XrdSecProtocol * AuthProt
int getData(gdCallBack *gdcbP, const char *dtype, char *buff, int blen)
XrdSfsXioHandle Claim(const char *buff, int datasz, int minasz=0) override
XrdXrootdMonitor::User Monitor
static XrdXrootdRedirPI * RedirPI
static const char * myCName
static const char Req_TLSData
XrdSfsXioHandle Swap(const char *buff, XrdSfsXioHandle h=0) override
static XrdXrootdFileLock * Locker
static const int maxPio
SecurityRequest sigReq
int(XrdXrootdProtocol::* Resume)()
static const char Req_TLSTPC
static XrdTlsContext * tlsCtx
static XrdXrootdXPath XPList
static XrdScheduler * Sched
static struct XrdXrootdProtocol::RC_Table RouteClient
int Process(XrdLink *lp) override
void Recycle(XrdLink *lp, int consec, const char *reason) override
static char * Buffer(XrdSfsXioHandle h, int *bsz)
static const char * myUName
static const char Req_TLSLogin
XrdXrootdResponse Response
int(XrdXrootdProtocol::* ResumePio)()
static const char * TraceID
static int Configure(char *parms, XrdProtocol_Config *pi)
int Stats(char *buff, int blen, int do_sync=0) override
static const int maxStreams
int getDump(const char *dtype, int dlen)
static XrdOucTList * JobCKTLST
static XrdXrootdXPath RQList
static struct XrdXrootdProtocol::RD_Table Route[RD_Num]
static XrdSecProtector * DHS
static XrdBuffManager * BPool
XrdSysSemaphore * boundRecycle
static XrdSecService * CIA
static RAtomic_int srvrAioOps
static const char * myGName
static uint64_t fsFeatures
static XrdOucReqID * PrepID
XrdXrootdPio * pioFirst
XrdSysCondVar2 * endNote
static XrdSfsFileSystem * osFS
XrdXrootdProtocol operator=(const XrdXrootdProtocol &rhs)=delete
virtual int gdDone()=0
XrdXrootd::gdCallBack * CallBack
static const int useSF
static const int useBasic
static const int useMMap