File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / pimd / pim_igmp.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Nov 2 10:09:11 2016 UTC (7 years, 8 months ago) by misho
Branches: quagga, MAIN
CVS tags: v1_0_20160315, HEAD
quagga 1.0.20160315

    1: /*
    2:   PIM for Quagga
    3:   Copyright (C) 2008  Everton da Silva Marques
    4: 
    5:   This program is free software; you can redistribute it and/or modify
    6:   it under the terms of the GNU General Public License as published by
    7:   the Free Software Foundation; either version 2 of the License, or
    8:   (at your option) any later version.
    9: 
   10:   This program is distributed in the hope that it will be useful, but
   11:   WITHOUT ANY WARRANTY; without even the implied warranty of
   12:   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   13:   General Public License for more details.
   14:   
   15:   You should have received a copy of the GNU General Public License
   16:   along with this program; see the file COPYING; if not, write to the
   17:   Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
   18:   MA 02110-1301 USA
   19:   
   20:   $QuaggaId: $Format:%an, %ai, %h$ $
   21: */
   22: 
   23: #ifndef PIM_IGMP_H
   24: #define PIM_IGMP_H
   25: 
   26: #include <netinet/in.h>
   27: 
   28: #include <zebra.h>
   29: #include "vty.h"
   30: #include "linklist.h"
   31: 
   32: /*
   33:   The following sizes are likely to support
   34:   any message sent within local MTU.
   35: */
   36: #define PIM_IGMP_BUFSIZE_READ         (20000)
   37: #define PIM_IGMP_BUFSIZE_WRITE        (20000)
   38: 
   39: #define PIM_IGMP_MEMBERSHIP_QUERY     (0x11)
   40: #define PIM_IGMP_V1_MEMBERSHIP_REPORT (0x12)
   41: #define PIM_IGMP_V2_MEMBERSHIP_REPORT (0x16)
   42: #define PIM_IGMP_V2_LEAVE_GROUP       (0x17)
   43: #define PIM_IGMP_V3_MEMBERSHIP_REPORT (0x22)
   44: 
   45: #define IGMP_V3_REPORT_HEADER_SIZE    (8)
   46: #define IGMP_V3_GROUP_RECORD_MIN_SIZE (8)
   47: #define IGMP_V3_MSG_MIN_SIZE          (IGMP_V3_REPORT_HEADER_SIZE + \
   48: 				       IGMP_V3_GROUP_RECORD_MIN_SIZE)
   49: #define IGMP_V12_MSG_SIZE             (8)
   50: 
   51: #define IGMP_V3_GROUP_RECORD_TYPE_OFFSET       (0)
   52: #define IGMP_V3_GROUP_RECORD_AUXDATALEN_OFFSET (1)
   53: #define IGMP_V3_GROUP_RECORD_NUMSOURCES_OFFSET (2)
   54: #define IGMP_V3_GROUP_RECORD_GROUP_OFFSET      (4)
   55: #define IGMP_V3_GROUP_RECORD_SOURCE_OFFSET     (8)
   56: 
   57: /* RFC 3376: 8.1. Robustness Variable - Default: 2 */
   58: #define IGMP_DEFAULT_ROBUSTNESS_VARIABLE           (2)
   59: 
   60: /* RFC 3376: 8.2. Query Interval - Default: 125 seconds */
   61: #define IGMP_GENERAL_QUERY_INTERVAL                (125)
   62: 
   63: /* RFC 3376: 8.3. Query Response Interval - Default: 100 deciseconds */
   64: #define IGMP_QUERY_MAX_RESPONSE_TIME_DSEC          (100)
   65: 
   66: /* RFC 3376: 8.8. Last Member Query Interval - Default: 10 deciseconds */
   67: #define IGMP_SPECIFIC_QUERY_MAX_RESPONSE_TIME_DSEC (10)
   68: 
   69: struct igmp_join {
   70:   struct in_addr group_addr;
   71:   struct in_addr source_addr;
   72:   int            sock_fd;
   73:   time_t         sock_creation;
   74: };
   75: 
   76: struct igmp_sock {
   77:   int               fd;
   78:   struct interface *interface;
   79:   struct in_addr    ifaddr;
   80:   time_t            sock_creation;
   81: 
   82:   struct thread    *t_igmp_read;                 /* read: IGMP sockets */
   83:   struct thread    *t_igmp_query_timer; /* timer: issue IGMP general queries */
   84:   struct thread    *t_other_querier_timer;   /* timer: other querier present */
   85: 
   86:   int               querier_query_interval;      /* QQI */
   87:   int               querier_robustness_variable; /* QRV */
   88:   int               startup_query_count;
   89: 
   90:   struct list      *igmp_group_list; /* list of struct igmp_group */
   91: };
   92: 
   93: struct igmp_sock *pim_igmp_sock_lookup_ifaddr(struct list *igmp_sock_list,
   94: 					      struct in_addr ifaddr);
   95: struct igmp_sock *igmp_sock_lookup_by_fd(struct list *igmp_sock_list,
   96: 					 int fd);
   97: struct igmp_sock *pim_igmp_sock_add(struct list *igmp_sock_list,
   98: 				    struct in_addr ifaddr,
   99: 				    struct interface *ifp);
  100: void igmp_sock_delete(struct igmp_sock *igmp);
  101: void igmp_sock_free(struct igmp_sock *igmp);
  102: 
  103: int pim_igmp_packet(struct igmp_sock *igmp, char *buf, size_t len);
  104: 
  105: void pim_igmp_general_query_on(struct igmp_sock *igmp);
  106: void pim_igmp_general_query_off(struct igmp_sock *igmp);
  107: void pim_igmp_other_querier_timer_on(struct igmp_sock *igmp);
  108: void pim_igmp_other_querier_timer_off(struct igmp_sock *igmp);
  109: 
  110: #define IGMP_SOURCE_MASK_FORWARDING        (1 << 0)
  111: #define IGMP_SOURCE_MASK_DELETE            (1 << 1)
  112: #define IGMP_SOURCE_MASK_SEND              (1 << 2)
  113: #define IGMP_SOURCE_TEST_FORWARDING(flags) ((flags) & IGMP_SOURCE_MASK_FORWARDING)
  114: #define IGMP_SOURCE_TEST_DELETE(flags)     ((flags) & IGMP_SOURCE_MASK_DELETE)
  115: #define IGMP_SOURCE_TEST_SEND(flags)       ((flags) & IGMP_SOURCE_MASK_SEND)
  116: #define IGMP_SOURCE_DO_FORWARDING(flags)   ((flags) |= IGMP_SOURCE_MASK_FORWARDING)
  117: #define IGMP_SOURCE_DO_DELETE(flags)       ((flags) |= IGMP_SOURCE_MASK_DELETE)
  118: #define IGMP_SOURCE_DO_SEND(flags)         ((flags) |= IGMP_SOURCE_MASK_SEND)
  119: #define IGMP_SOURCE_DONT_FORWARDING(flags) ((flags) &= ~IGMP_SOURCE_MASK_FORWARDING)
  120: #define IGMP_SOURCE_DONT_DELETE(flags)     ((flags) &= ~IGMP_SOURCE_MASK_DELETE)
  121: #define IGMP_SOURCE_DONT_SEND(flags)       ((flags) &= ~IGMP_SOURCE_MASK_SEND)
  122: 
  123: struct igmp_source {
  124:   struct in_addr      source_addr;
  125:   struct thread      *t_source_timer;
  126:   struct igmp_group  *source_group;    /* back pointer */
  127:   time_t              source_creation;
  128:   uint32_t            source_flags;
  129:   struct channel_oil *source_channel_oil;
  130: 
  131:   /*
  132:     RFC 3376: 6.6.3.2. Building and Sending Group and Source Specific Queries
  133:   */
  134:   int                source_query_retransmit_count;
  135: };
  136: 
  137: struct igmp_group {
  138:   /*
  139:     RFC 3376: 6.2.2. Definition of Group Timers
  140: 
  141:     The group timer is only used when a group is in EXCLUDE mode and it
  142:     represents the time for the *filter-mode* of the group to expire and
  143:     switch to INCLUDE mode.
  144:   */
  145:   struct thread    *t_group_timer;
  146: 
  147:   /* Shared between group-specific and
  148:      group-and-source-specific retransmissions */
  149:   struct thread    *t_group_query_retransmit_timer;
  150: 
  151:   /* Counter exclusive for group-specific retransmissions
  152:      (not used by group-and-source-specific retransmissions,
  153:      since sources have their counters) */
  154:   int               group_specific_query_retransmit_count;
  155: 
  156:   struct in_addr    group_addr;
  157:   int               group_filtermode_isexcl;  /* 0=INCLUDE, 1=EXCLUDE */
  158:   struct list      *group_source_list;        /* list of struct igmp_source */
  159:   time_t            group_creation;
  160:   struct igmp_sock *group_igmp_sock;          /* back pointer */
  161:   int64_t           last_igmp_v1_report_dsec;
  162:   int64_t           last_igmp_v2_report_dsec;
  163: };
  164: 
  165: struct igmp_group *igmp_add_group_by_addr(struct igmp_sock *igmp,
  166: 					  struct in_addr group_addr,
  167: 					  const char *ifname);
  168: 
  169: void igmp_group_delete_empty_include(struct igmp_group *group);
  170: 
  171: void igmp_startup_mode_on(struct igmp_sock *igmp);
  172: 
  173: void igmp_group_timer_on(struct igmp_group *group,
  174: 			 long interval_msec, const char *ifname);
  175: 
  176: #endif /* PIM_IGMP_H */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>