XRootD
XrdHttpTpcPMarkManager.hh
Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // This file is part of XrdHttpTpcTPC
3 //
4 // Copyright (c) 2023 by European Organization for Nuclear Research (CERN)
5 // Author: Cedric Caffy <ccaffy@cern.ch>
6 // File Date: Oct 2023
7 //------------------------------------------------------------------------------
8 // XRootD is free software: you can redistribute it and/or modify
9 // it under the terms of the GNU Lesser General Public License as published by
10 // the Free Software Foundation, either version 3 of the License, or
11 // (at your option) any later version.
12 //
13 // XRootD is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 // GNU General Public License for more details.
17 //
18 // You should have received a copy of the GNU Lesser General Public License
19 // along with XRootD. If not, see <http://www.gnu.org/licenses/>.
20 //------------------------------------------------------------------------------
21 #ifndef XROOTD_PMARKMANAGER_HH
22 #define XROOTD_PMARKMANAGER_HH
23 
24 #include "XrdNet/XrdNetPMark.hh"
25 #include "XrdSec/XrdSecEntity.hh"
26 #include "XrdNet/XrdNetAddrInfo.hh"
27 #include "XrdNet/XrdNetAddr.hh"
29 
30 #include <map>
31 #include <memory>
32 #include <queue>
33 
34 namespace TPC {
35  enum class TpcType;
36 }
37 
50 namespace XrdHttpTpc
51 {
52 class PMarkManager {
53 public:
54 
62  class SocketInfo {
63  public:
64  SocketInfo(int fd, const struct sockaddr * sockP);
67  };
68 
69  PMarkManager(XrdHttpExtReq &req, const TPC::TpcType type);
70 
71  PMarkManager(XrdNetPMark *pmark, int sciTag, const TPC::TpcType type);
72 
86  bool connect(int fd, const struct sockaddr * sockP, size_t sockPLen, uint32_t timeout_sec, std::stringstream & err);
87 
92  bool isEnabled() const;
93 
99  void startTransfer();
100 
106  void beginPMarks();
107 
114  void endPmark(int fd);
115 
116  virtual ~PMarkManager() = default;
117 private:
126  void addFd(int fd, const struct sockaddr * sockP);
127 
128  // The queue of socket information from which we will create the packet marking handles
129  std::queue<SocketInfo> mSocketInfos;
130  // The map of socket FD and packet marking handles
131  std::map<int,std::unique_ptr<XrdNetPMark::Handle>> mPmarkHandles;
132  // The instance of the packet marking functionality
133  XrdNetPMark *mPmark;
134  // SciTag provided by the user; extracted from the request
135  int mSciTag;
136  // Path to the resource
137  const char *mResource;
138  // Is true when startTransfer(...) has been called
139  bool mTransferWillStart;
140  // Is true if this transfer is a HTTP TPC PULL transfer, false otherwise
141  // by default is true
142  TPC::TpcType mTpcType;
143 };
144 } // namespace XrdHttpTpc
145 
146 #endif //XROOTD_PMARKMANAGER_HH
SocketInfo(int fd, const struct sockaddr *sockP)
bool connect(int fd, const struct sockaddr *sockP, size_t sockPLen, uint32_t timeout_sec, std::stringstream &err)
PMarkManager(XrdHttpExtReq &req, const TPC::TpcType type)
virtual ~PMarkManager()=default