/*
 *------------------------------------------------------------------
 * Copyright (c) 2018 Cisco and/or its affiliates.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *------------------------------------------------------------------
 */

#ifndef __IGMP_SOURCE_H__
#define __IGMP_SOURCE_H__

#include <igmp/igmp_types.h>

/**
 * IGMP Source timers
 */
typedef enum igmp_src_timer_t_
{
  /**
   * On expiry the source has not been refreshed by a query
   * and can now be reaped
   */
  IGMP_SRC_TIMER_EXP,
} igmp_src_timer_t;

#define IGMP_SRC_N_TIMERS (IGMP_SRC_TIMER_EXP + 1)

/**
 *  @brief IGMP source
 *  The representation of a specified source address with in multicast group.
 */
typedef struct igmp_src_t_
{
  /**
   * The source's key
   */
  igmp_key_t *key;

  /**
   * The liveness timer. Reset with each received report. on expiry
   * the source is removed from the group.
   */
  u32 exp_timer;

  /**
   * The group this source is on
   */
  u32 group;

  /**
   * the mode that provided this source
   */
  igmp_mode_t mode;

  /**
   * Timers
   */
  u32 timers[IGMP_SRC_N_TIMERS];

  /**
   * Tells us which configurations
   * have this source.
   */
  u8 *referance_by_config_index;
} igmp_src_t;

extern void igmp_src_free (igmp_src_t * src);

extern igmp_src_t *igmp_src_alloc (u32 group_index,
				   const igmp_key_t * skey, igmp_mode_t mode);

extern u32 igmp_src_index (igmp_src_t * src);

extern void igmp_src_refresh (igmp_src_t * src);
extern void igmp_src_blocked (igmp_src_t * src);
extern u8 *format_igmp_src (u8 * s, va_list * args);

#endif

/*
 * fd.io coding-style-patch-verification: ON
 *
 * Local Variables:
 * eval: (c-set-style "gnu")
 * End:
 */