Main Page | Modules | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals | Related Pages

core/bsched.h File Reference


Detailed Description

Bandwidth scheduling.

Author:
Raphael Manfredi
Date:
2002-2003

#include "common.h"
#include "sockets.h"
#include "lib/inputevt.h"
#include "lib/tm.h"
#include "if/core/hosts.h"
#include "if/core/nodes.h"
#include "if/core/bsched.h"

Go to the source code of this file.

Data Structures

struct  sendfile_ctx

Typedefs

typedef sendfile_ctx sendfile_ctx_t

Functions

void bsched_early_init (void)
void bsched_init (void)
 Initialize global bandwidth schedulers.
void bsched_shutdown (void)
 Shutdowning program.
void bsched_close (void)
 Discard global bandwidth schedulers.
void bsched_set_peermode (node_peer_t mode)
 Adapt the overall Gnet/HTTP bandwidth repartition depending on the current peermode.
void bsched_enable (bsched_bws_t bs)
 Enable scheduling, marks the start of the period.
void bsched_disable (bsched_bws_t bs)
 Disable scheduling.
void bsched_enable_all (void)
 Enable all known bandwidth schedulers.
bio_source_tbsched_source_add (bsched_bws_t bs, wrap_io_t *wio, guint32 flags, inputevt_handler_t callback, gpointer arg)
 Declare fd as a new source for the scheduler.
void bsched_source_remove (bio_source_t *bio)
 Remove bio_source object from the scheduler.
void bsched_set_bandwidth (bsched_bws_t bs, gint bandwidth)
 On-the-fly changing of the allowed bandwidth.
void bio_add_callback (bio_source_t *bio, inputevt_handler_t callback, gpointer arg)
 Add I/O callback to a "passive" I/O source.
void bio_remove_callback (bio_source_t *bio)
 Remove I/O callback from I/O source.
ssize_t bio_write (bio_source_t *bio, gconstpointer data, size_t len)
 Write at most `len' bytes from `buf' to source's fd, as bandwidth permits.
ssize_t bio_writev (bio_source_t *bio, struct iovec *iov, gint iovcnt)
 Write at most `len' bytes from `iov' to source's fd, as bandwidth permits, `len' being determined by the size of the supplied I/O vector.
ssize_t bio_sendto (bio_source_t *bio, const gnet_host_t *to, gconstpointer data, size_t len)
 Send UDP datagram to specified destination `to'.
ssize_t bio_sendfile (sendfile_ctx_t *ctx, bio_source_t *bio, gint in_fd, off_t *offset, size_t len)
 Write at most `len' bytes to source's fd, as bandwidth permits.
ssize_t bio_read (bio_source_t *bio, gpointer data, size_t len)
 Read at most `len' bytes from `buf' from source's fd, as bandwidth permits.
ssize_t bio_readv (bio_source_t *bio, struct iovec *iov, gint iovcnt)
 XXX: This is copy-paste bullshit:.
ssize_t bws_write (bsched_bws_t bs, wrap_io_t *wio, gconstpointer data, size_t len)
 Write at most `len' bytes from `buf' to specified fd, and account the bandwidth used.
ssize_t bws_read (bsched_bws_t bs, wrap_io_t *wio, gpointer data, size_t len)
 Read at most `len' bytes from `buf' from specified fd, and account the bandwidth used.
void bsched_timer (void)
 Periodic timer.
void bws_sock_connect (enum socket_type type)
 Record that we're issuing a TCP/IP connection of a particular type.
void bws_sock_connected (enum socket_type type)
 Record that the connection attempt succeeded.
void bws_sock_accepted (enum socket_type type)
 We accepted an incoming connection of `type'.
void bws_sock_connect_timeout (enum socket_type type)
 A connection attempt of `type' timed out.
void bws_sock_connect_failed (enum socket_type type)
 Record that the connection attempt failed.
void bws_sock_closed (enum socket_type type, gboolean remote)
 The connection was closed, remotely if `remote' is true.
gboolean bws_can_connect (enum socket_type type)
 Do we have the bandwidth to issue a new TCP/IP connection of `type'?
void bws_udp_count_written (gint len)
 Account for written data to UDP.
void bws_udp_count_read (gint len)
 Account for read data from UDP.
gboolean bsched_enough_up_bandwidth (void)
 Needs very short description so that doxygen can parse the following list properly.
gboolean bsched_saturated (bsched_bws_t bws)
gulong bsched_bps (bsched_bws_t bws)
gulong bsched_avg_bps (bsched_bws_t bws)
gulong bsched_pct (bsched_bws_t bws)
gulong bsched_avg_pct (bsched_bws_t bws)
gulong bsched_bw_per_second (bsched_bws_t bws)
void bsched_config_steal_http_gnet (void)
 Allow cross-stealing of unused bandwidth between HTTP/gnet.
void bsched_config_steal_gnet (void)
 Allow cross-stealing of unused bandwidth between TCP and UDP gnet only.


Typedef Documentation

typedef struct sendfile_ctx sendfile_ctx_t
 


Function Documentation

void bio_add_callback bio_source_t bio,
inputevt_handler_t  callback,
gpointer  arg
 

Add I/O callback to a "passive" I/O source.

ssize_t bio_read bio_source_t bio,
gpointer  data,
size_t  len
 

Read at most `len' bytes from `buf' from source's fd, as bandwidth permits.

Returns:
-1 with errno set to EAGAIN, if we cannot read anything due to bandwidth constraints.

ssize_t bio_readv bio_source_t bio,
struct iovec *  iov,
gint  iovcnt
 

XXX: This is copy-paste bullshit:.

Read at most `len' bytes from `iov' to source's fd, as bandwidth permits, `len' being determined by the size of the supplied I/O vector. If we cannot write anything due to bandwidth constraints, return -1 with errno set to EAGAIN.

void bio_remove_callback bio_source_t bio  ) 
 

Remove I/O callback from I/O source.

ssize_t bio_sendfile sendfile_ctx_t ctx,
bio_source_t bio,
gint  in_fd,
off_t *  offset,
size_t  len
 

Write at most `len' bytes to source's fd, as bandwidth permits.

Bytes are read from `offset' in the in_fd file descriptor, and the value is updated in place by the kernel.

Returns:
-1 with errno set to EAGAIN, if we cannot write anything due to bandwidth constraints.

ssize_t bio_sendto bio_source_t bio,
const gnet_host_t to,
gconstpointer  data,
size_t  len
 

Send UDP datagram to specified destination `to'.

Returns:
-1 with errno set to EAGAIN, if we cannot write anything due to bandwidth constraints.

ssize_t bio_write bio_source_t bio,
gconstpointer  data,
size_t  len
 

Write at most `len' bytes from `buf' to source's fd, as bandwidth permits.

If we cannot write anything due to bandwidth constraints, return -1 with errno set to EAGAIN.

ssize_t bio_writev bio_source_t bio,
struct iovec *  iov,
gint  iovcnt
 

Write at most `len' bytes from `iov' to source's fd, as bandwidth permits, `len' being determined by the size of the supplied I/O vector.

If we cannot write anything due to bandwidth constraints, return -1 with errno set to EAGAIN.

gulong bsched_avg_bps bsched_bws_t  bws  ) 
 

gulong bsched_avg_pct bsched_bws_t  bws  ) 
 

gulong bsched_bps bsched_bws_t  bws  ) 
 

gulong bsched_bw_per_second bsched_bws_t  bws  ) 
 

void bsched_close void   ) 
 

Discard global bandwidth schedulers.

void bsched_config_steal_gnet void   ) 
 

Allow cross-stealing of unused bandwidth between TCP and UDP gnet only.

void bsched_config_steal_http_gnet void   ) 
 

Allow cross-stealing of unused bandwidth between HTTP/gnet.

void bsched_disable bsched_bws_t  bs  ) 
 

Disable scheduling.

void bsched_early_init void   ) 
 

void bsched_enable bsched_bws_t  bs  ) 
 

Enable scheduling, marks the start of the period.

void bsched_enable_all void   ) 
 

Enable all known bandwidth schedulers.

gboolean bsched_enough_up_bandwidth void   ) 
 

Needs very short description so that doxygen can parse the following list properly.

Determine whether we have enough bandwidth to possibly become an ultra node:

  1. There must be more than BW_OUT_UP_MIN outgoing bandwidth available.
  2. If bandwidth schedulers are enabled, leaf nodes must not be configured to steal all the HTTP outgoing bandwidth, unless they disabled uploads.
  3. If Gnet out scheduler is enabled, there must be at least BW_OUT_GNET_MIN bytes per gnet connection.
  4. Overall, there must be BW_OUT_LEAF_MIN bytes per configured leaf plus BW_OUT_GNET_MIN bytes per gnet connection available.

FIXME: If all upload slots are used by clients which download very slowly, the below check would cause a demotion to leaf mode. It is in general not possible to know whether we are out of bandwidth or if the remote clients have insufficient available bandwidth.

void bsched_init void   ) 
 

Initialize global bandwidth schedulers.

gulong bsched_pct bsched_bws_t  bws  ) 
 

gboolean bsched_saturated bsched_bws_t  bws  ) 
 

void bsched_set_bandwidth bsched_bws_t  bs,
gint  bandwidth
 

On-the-fly changing of the allowed bandwidth.

void bsched_set_peermode node_peer_t  mode  ) 
 

Adapt the overall Gnet/HTTP bandwidth repartition depending on the current peermode.

This routine is called each time the peermode changes or each time the settings for the traffic shapers changes.

void bsched_shutdown void   ) 
 

Shutdowning program.

Disable all known bandwidth schedulers, so that any pending I/O can go through as quickly as possible.

bio_source_t* bsched_source_add bsched_bws_t  bws,
wrap_io_t wio,
guint32  flags,
inputevt_handler_t  callback,
gpointer  arg
 

Declare fd as a new source for the scheduler.

When `callback' is NULL, the source will be "passive", i.e. its bandwidth will be limited when calls to bio_write() or bio_read() are made, but whether the source can accept those calls without blocking will have to be determined explicitly.

Returns:
new bio_source object.

void bsched_source_remove bio_source_t bio  ) 
 

Remove bio_source object from the scheduler.

The bio_source object is freed and must not be re-used.

void bsched_timer void   ) 
 

Periodic timer.

gboolean bws_can_connect enum socket_type  type  ) 
 

Do we have the bandwidth to issue a new TCP/IP connection of `type'?

ssize_t bws_read bsched_bws_t  bws,
wrap_io_t wio,
gpointer  data,
size_t  len
 

Read at most `len' bytes from `buf' from specified fd, and account the bandwidth used.

Any overused bandwidth will be tracked, so that on average, we stick to the requested bandwidth rate.

void bws_sock_accepted enum socket_type  type  ) 
 

We accepted an incoming connection of `type'.

void bws_sock_closed enum socket_type  type,
gboolean  remote
 

The connection was closed, remotely if `remote' is true.

void bws_sock_connect enum socket_type  type  ) 
 

Record that we're issuing a TCP/IP connection of a particular type.

void bws_sock_connect_failed enum socket_type  type  ) 
 

Record that the connection attempt failed.

void bws_sock_connect_timeout enum socket_type  type  ) 
 

A connection attempt of `type' timed out.

void bws_sock_connected enum socket_type  type  ) 
 

Record that the connection attempt succeeded.

void bws_udp_count_read gint  len  ) 
 

Account for read data from UDP.

void bws_udp_count_written gint  len  ) 
 

Account for written data to UDP.

ssize_t bws_write bsched_bws_t  bws,
wrap_io_t wio,
gconstpointer  data,
size_t  len
 

Write at most `len' bytes from `buf' to specified fd, and account the bandwidth used.

Any overused bandwidth will be tracked, so that on average, we stick to the requested bandwidth rate.

Returns:
The amount of bytes written or (-1) if an error occurred.


Generated on Sat Jun 30 17:53:25 2007 for gtk-gnutella by  doxygen 1.3.9.1