phy.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:5k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1997 Regents of the University of California.
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. All advertising materials mentioning features or use of this software
  15.  *    must display the following acknowledgement:
  16.  * This product includes software developed by the Computer Systems
  17.  * Engineering Group at Lawrence Berkeley Laboratory.
  18.  * 4. Neither the name of the University nor of the Laboratory may be used
  19.  *    to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  *
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  *
  34.  * Ported from CMU/Monarch's code, nov'98 -Padma Haldar.
  35.  *
  36.  * @(#) $Header: /cvsroot/nsnam/ns-2/mac/phy.h,v 1.7 2000/08/17 00:03:38 haoboy Exp $
  37.  *
  38.  * superclass for all network interfaces
  39.  
  40.  ===================================================================
  41.  * Phy represents the hardware that actually controls the channel
  42.  * access for the node. Phy transmits/receives pkts from the channel
  43.  * to which it is connected. No pkts are buffered at this layer as
  44.  * the decision to send has already been made and the packet is on
  45.  * its way to the "Channel".
  46.  *==================================================================
  47.  */
  48. #ifndef ns_phy_h
  49. #define ns_phy_h
  50. #include <assert.h>
  51. #include "bi-connector.h"
  52. #include "lib/bsd-list.h"
  53. class Phy;
  54. LIST_HEAD(if_head, Phy);
  55. #include "channel.h"
  56. #include "node.h"
  57. #include "mac.h"
  58. class Node;
  59. class LinkHead;
  60. /*--------------------------------------------------------------
  61.   Phy : Base class for all network interfaces used to control
  62.   channel access
  63.  ---------------------------------------------------------------*/
  64. class Phy : public BiConnector {
  65.  public:
  66. Phy();
  67. void recv(Packet* p, Handler* h);
  68. virtual void sendDown(Packet *p)=0;
  69. virtual int sendUp(Packet *p)=0;
  70. inline double  txtime(Packet *p) {
  71. return (hdr_cmn::access(p)->size() * 8.0) / bandwidth_; }
  72. inline double txtime(int bytes) {
  73. return (8.0 * bytes / bandwidth_); }
  74. virtual double  bittime() const { return 1/bandwidth_; }
  75. // list of all network interfaces on a channel
  76. Phy* nextchnl(void) const { return chnl_link_.le_next; }
  77. inline void insertchnl(struct if_head *head) {
  78. LIST_INSERT_HEAD(head, this, chnl_link_);
  79. //channel_ = chnl;
  80. }
  81. // list of all network interfaces on a node
  82. Phy* nextnode(void) const { return node_link_.le_next; }
  83. inline void insertnode(struct if_head* head) {
  84. LIST_INSERT_HEAD(head, this, node_link_);
  85. //node_ = node;
  86. }
  87. inline void removechnl() {
  88. LIST_REMOVE(this, chnl_link_);
  89. }
  90. void setchnl (Channel *chnl) { channel_ = chnl; }
  91. virtual void setnode (Node *node) { node_ = node; }
  92. virtual Node* node(void) const { return node_; }
  93.   virtual Channel* channel(void) const {return channel_;}
  94. virtual void    dump(void) const;
  95. LinkHead* head() { return head_; }
  96.  protected:
  97. //void drop(Packet *p);
  98. int command(int argc, const char*const* argv);
  99. int             index_;
  100. Node* node_;
  101. LinkHead* head_; // the entry point of this network stack
  102.   
  103. /*
  104.    * A list of all "network interfaces" on a given channel.
  105.    * Note: a node may have multiple interfaces, each of which
  106.    * is on a different channel.
  107.    */
  108. LIST_ENTRY(Phy) chnl_link_;
  109.   /*
  110.    * A list of all "network interfaces" for a given node.
  111.    * Each interface is assoicated with exactly one node
  112.    * and one channel.
  113.    */
  114. LIST_ENTRY(Phy) node_link_;
  115. /* ============================================================
  116.      Physical Layer State
  117.    ============================================================ */
  118. double bandwidth_;                   // bit rate
  119. Channel         *channel_;    // the channel for output
  120. };
  121. #endif // ns_phy_h