/*        lac_types.h      2.02.000 20JUN99 12:15 */
#ifndef   lac_types_h__
#define   lac_types_h__

#include "sys.h"
#include "lac_options.h"
/******************************************************************************
 * LAC : LINK AGGREGATION CONTROL PROTOCOL : PROTOCOL DATA
 ******************************************************************************
 */
        enum    {Slow_protocols_ethertype = (Ethertype)0x4242};
        enum    {Lacp_subtype             = (Octet)1};

typedef int      System_priority;
typedef int      System_id;
        enum    {Null_system = (System_id)0};
        enum    {Null_port   = (Port_no)0};
typedef Port_no  Key;
        enum    {Null_key    = (Key)0};

typedef enum {Short_timeout = True, Long_timeout = False} Lacp_timeout;
typedef enum {Lacp_enabled  = True, Lacp_disabled= False} Lacp_enable;

typedef struct /* Lac_state */
{
   unsigned lacp_activity   : 1;
   unsigned lacp_timeout    : 1;
   unsigned aggregation     : 1;
   unsigned synchronization : 1;
   unsigned collecting      : 1;
   unsigned distributing    : 1;
   unsigned defaulted       : 1;
   unsigned expired         : 1;
} Lac_state;

typedef struct /* Lac_info */
{
   System_priority system_priority;

   System_id       system_id;

   Key             key;

   Port_no         port_priority;

   Port_no         port_no;

   Lac_state       state;

} Lac_info;

typedef struct /* Lac_pdu */ /* only the relevant parameters */
{
   Mac_address slow_protocols_address;
   Ethertype   ethertype;
   Octet       protocol_subtype;
   Octet       protocol_version;

   Lac_info  actor;
   
   Lac_info  partner;

} Lac_pdu;

/******************************************************************************
 * LAC : LINK AGGREGATION CONTROL PROTOCOL : STATE MACHINE DATA
 ******************************************************************************
 */
typedef enum { Rxm_initialize, Rxm_port_disabled, Rxm_lacp_disabled, 
               Rxm_expired,    Rxm_defaulted,     Rxm_current
             } Rx_machine;
/******************************************************************************
 * LAC : LINK AGGREGATION CONTROL PROTOCOL : SYSTEMS AND PORTS
 ******************************************************************************
 */
typedef struct lac_port   Lac_port;
typedef struct lac_system Lac_system;

/******************************************************************************
 * LAC : LINK AGGREGATION CONTROL PROTOCOL : PHYSICAL PORT INSTANCES
 ******************************************************************************
 */
struct lac_port /* Lac_port */
{
   Lac_port       *next;
   Lac_system     *system;
	Port_no         port_no;

   Node            mux;
   Node            mac;
   Boolean         port_enabled;

   Lac_info        actor;
   Lac_info        partner;
   Lac_info        actor_admin;
   Lac_info        partner_admin;
   //              lacp_reinitialize is an internal event, no variable required.
   Boolean         lacp_enabled;
   Rx_machine      rxm;
   Boolean         selected;
   Boolean         matched;
   Boolean         local_churn;
   Boolean         remote_churn;

   Ticks           current_while;
   Ticks           periodic_after;
   Ticks           local_churn_when;
   Ticks           remote_churn_when;

   Lac_port       *aport;
   Lac_port       *alink;
   Boolean         attach;
   Boolean         attached;
   Boolean         standby;
   Ticks           attach_when;

   Boolean         ntt;
   int             hold_count;
   Ticks           hold_while;
   Timer           tx_scheduler;

   Timer           tick_timer;

};
/******************************************************************************
 * LAC : LINK AGGREGATION CONTROL PROTOCOL : SYSTEM
 ******************************************************************************
 */
struct lac_system /* Lac_system */
{/* 
  * 
  */	
	Lac_port  ports;

   System_priority priority;
   System_id       id;
};

#endif /* lac_types_h__ */
