Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
507de1662a19e1f58736df389cf648c10e57d946
[simgrid.git] / src / surf / network_interface.hpp
1 /* Copyright (c) 2004-2015. The SimGrid Team.
2  * All rights reserved.                                                     */
3
4 /* This program is free software; you can redistribute it and/or modify it
5  * under the terms of the license (GNU LGPL) which comes with this package. */
6
7 #ifndef SURF_NETWORK_INTERFACE_HPP_
8 #define SURF_NETWORK_INTERFACE_HPP_
9
10 #include <xbt/base.h>
11
12 #include <unordered_map>
13
14 #include "src/surf/PropertyHolder.hpp"
15 #include "src/surf/surf_interface.hpp"
16 #include "xbt/fifo.h"
17
18 #include "simgrid/s4u/Link.hpp"
19
20 /***********
21  * Classes *
22  ***********/
23
24 namespace simgrid {
25   namespace surf {
26     /*********
27      * Model *
28      *********/
29
30     /** @ingroup SURF_network_interface
31      * @brief SURF network model interface class
32      * @details A model is an object which handles the interactions between its Resources and its Actions
33      */
34     class NetworkModel : public Model {
35     public:
36       /** @brief Constructor */
37       NetworkModel() : Model() { }
38
39       /** @brief Destructor */
40       ~NetworkModel() override;
41
42       /**
43        * @brief Create a Link
44        *
45        * @param name The name of the Link
46        * @param bandwidth The initial bandwidth of the Link in bytes per second
47        * @param latency The initial latency of the Link in seconds
48        * @param policy The sharing policy of the Link
49        */
50       virtual LinkImpl* createLink(const char* name, double bandwidth, double latency,
51                                    e_surf_link_sharing_policy_t policy) = 0;
52
53       /**
54        * @brief Create a communication between two hosts.
55        * @details It makes calls to the routing part, and execute the communication
56        *          between the two end points.
57        *
58        * @param src The source of the communication
59        * @param dst The destination of the communication
60        * @param size The size of the communication in bytes
61        * @param rate Allows to limit the transfer rate. Negative value means
62        * unlimited.
63        * @return The action representing the communication
64        */
65       virtual Action* communicate(simgrid::s4u::Host* src, simgrid::s4u::Host* dst, double size, double rate) = 0;
66
67       /** @brief Function pointer to the function to use to solve the lmm_system_t
68        *
69        * @param system The lmm_system_t to solve
70        */
71       void (*f_networkSolve)(lmm_system_t) = lmm_solve;
72
73       /**
74        * @brief Get the right multiplicative factor for the latency.
75        * @details Depending on the model, the effective latency when sending
76        * a message might be different from the theoretical latency of the link,
77        * in function of the message size. In order to account for this, this
78        * function gets this factor.
79        *
80        * @param size The size of the message.
81        * @return The latency factor.
82        */
83       virtual double latencyFactor(double size);
84
85       /**
86        * @brief Get the right multiplicative factor for the bandwidth.
87        * @details Depending on the model, the effective bandwidth when sending
88        * a message might be different from the theoretical bandwidth of the link,
89        * in function of the message size. In order to account for this, this
90        * function gets this factor.
91        *
92        * @param size The size of the message.
93        * @return The bandwidth factor.
94        */
95       virtual double bandwidthFactor(double size);
96
97       /**
98        * @brief Get definitive bandwidth.
99        * @details It gives the minimum bandwidth between the one that would
100        * occur if no limitation was enforced, and the one arbitrary limited.
101        * @param rate The desired maximum bandwidth.
102        * @param bound The bandwidth with only the network taken into account.
103        * @param size The size of the message.
104        * @return The new bandwidth.
105        */
106       virtual double bandwidthConstraint(double rate, double bound, double size);
107       double nextOccuringEventFull(double now) override;
108
109       LinkImpl* loopback_ = nullptr;
110     };
111
112     /************
113      * Resource *
114      ************/
115     /** @ingroup SURF_network_interface
116      * @brief SURF network link interface class
117      * @details A Link represents the link between two [hosts](\ref simgrid::surf::HostImpl)
118      */
119     class LinkImpl : public simgrid::surf::Resource, public simgrid::surf::PropertyHolder {
120     protected:
121       LinkImpl(simgrid::surf::NetworkModel* model, const char* name, lmm_constraint_t constraint);
122       ~LinkImpl() override;
123     public:
124       void destroy(); // Must be called instead of the destructor
125     private:
126       bool currentlyDestroying_ = false;
127
128     public:
129       /** @brief Public interface */
130       s4u::Link piface_;
131
132       /** @brief Get the bandwidth in bytes per second of current Link */
133       virtual double bandwidth();
134
135       /** @brief Update the bandwidth in bytes per second of current Link */
136       virtual void setBandwidth(double value) = 0;
137
138       /** @brief Get the latency in seconds of current Link */
139       virtual double latency();
140
141       /** @brief Update the latency in seconds of current Link */
142       virtual void setLatency(double value) = 0;
143
144       /** @brief The sharing policy is a @{link e_surf_link_sharing_policy_t::EType} (0: FATPIPE, 1: SHARED, 2:
145        * FULLDUPLEX) */
146       virtual int sharingPolicy();
147
148       /** @brief Check if the Link is used */
149       bool isUsed() override;
150
151       void turnOn() override;
152       void turnOff() override;
153
154       virtual void setStateTrace(tmgr_trace_t trace); /*< setup the trace file with states events (ON or OFF).
155                                                           Trace must contain boolean values. */
156       virtual void setBandwidthTrace(tmgr_trace_t trace); /*< setup the trace file with bandwidth events (peak speed changes due to external load).
157                                                               Trace must contain percentages (value between 0 and 1). */
158       virtual void setLatencyTrace(tmgr_trace_t trace); /*< setup the trace file with latency events (peak latency changes due to external load).
159                                                             Trace must contain absolute values */
160
161       tmgr_trace_iterator_t stateEvent_ = nullptr;
162       s_surf_metric_t latency_          = {1.0, 0, nullptr};
163       s_surf_metric_t bandwidth_        = {1.0, 0, nullptr};
164
165       /* User data */
166     public:
167       void *getData()        { return userData;}
168       void  setData(void *d) { userData=d;}
169     private:
170       void *userData = nullptr;
171
172       /* List of all links. FIXME: should move to the Engine */
173     private:
174       static std::unordered_map<std::string, LinkImpl*>* links;
175
176     public:
177       static LinkImpl* byName(const char* name);
178       static int linksCount();
179       static LinkImpl** linksList();
180       static void linksExit();
181     };
182
183     /**********
184      * Action *
185      **********/
186     /** @ingroup SURF_network_interface
187      * @brief SURF network action interface class
188      * @details A NetworkAction represents a communication between two [hosts](\ref HostImpl)
189      */
190     class NetworkAction : public simgrid::surf::Action {
191     public:
192       /** @brief Constructor
193        *
194        * @param model The NetworkModel associated to this NetworkAction
195        * @param cost The cost of this  NetworkAction in [TODO]
196        * @param failed [description]
197        */
198       NetworkAction(simgrid::surf::Model *model, double cost, bool failed)
199     : simgrid::surf::Action(model, cost, failed) {}
200
201       /**
202        * @brief NetworkAction constructor
203        *
204        * @param model The NetworkModel associated to this NetworkAction
205        * @param cost The cost of this  NetworkAction in [TODO]
206        * @param failed [description]
207        * @param var The lmm variable associated to this Action if it is part of a
208        * LMM component
209        */
210       NetworkAction(simgrid::surf::Model *model, double cost, bool failed, lmm_variable_t var)
211       : simgrid::surf::Action(model, cost, failed, var) {};
212
213       void setState(simgrid::surf::Action::State state) override;
214
215       double latency_;
216       double latCurrent_;
217       double weight_;
218       double rate_;
219       const char* senderLinkName_;
220       double senderSize_;
221       xbt_fifo_item_t senderFifoItem_;
222     };
223   }
224 }
225
226 #endif /* SURF_NETWORK_INTERFACE_HPP_ */
227
228