netx/common/inc/nx_igmp.h
2021-10-13 06:48:36 +00:00

219 lines
8.8 KiB
C

/**************************************************************************/
/* */
/* Copyright (c) Microsoft Corporation. All rights reserved. */
/* */
/* This software is licensed under the Microsoft Software License */
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
/* and in the root directory of this software. */
/* */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/** */
/** NetX Component */
/** */
/** Internet Group Management Protocol (IGMP) */
/** */
/**************************************************************************/
/**************************************************************************/
/**************************************************************************/
/* */
/* COMPONENT DEFINITION RELEASE */
/* */
/* nx_igmp.h PORTABLE C */
/* 6.1.9 */
/* AUTHOR */
/* */
/* Yuxin Zhou, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This file defines the NetX Internet Group Management Protocol (IGMP)*/
/* component, including all data types and external references. It is */
/* assumed that nx_api.h and nx_port.h have already been included. */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 05-19-2020 Yuxin Zhou Initial Version 6.0 */
/* 09-30-2020 Yuxin Zhou Modified comment(s), */
/* resulting in version 6.1 */
/* 10-15-2021 Yuxin Zhou Modified comment(s), included */
/* necessary header file, */
/* resulting in version 6.1.9 */
/* */
/**************************************************************************/
#ifndef NX_IGMP_H
#define NX_IGMP_H
#include "nx_api.h"
/* Define IGMP types and codes. */
/* IGMPv2 combines version field with the type field ffectively, and calls the 8 bit
field the Type field. IGMPv2 uses Type 0x11, 0x16, and 0x17 in this field, while
IGMPv1 uses Type 1 and 2 in the lower 4 bits, combined with version 1 in the upper 4 bits
for 0x11 and 0x12 as the possible values. */
/* Define the IGMP version in the IGMP header. */
#define NX_IGMP_VERSION 0x10000000
/* Define the numeric version of IGMP protocol used by NetX. */
#define NX_IGMP_HOST_VERSION_1 1
#define NX_IGMP_HOST_VERSION_2 2
/* Define the IGMP query message type and mask in the IGMP header. */
#define NX_IGMP_ROUTER_QUERY_TYPE 0x01000000
#define NX_IGMP_TYPE_MASK 0x0F000000
/* Define the IGMPv1 type for membership join reports. */
#define NX_IGMP_HOST_RESPONSE_TYPE 0x02000000
/* Define IGMPv2 types for membership join and leave reports. */
#define NX_IGMP_HOST_V2_JOIN_TYPE 0x16000000
#define NX_IGMP_HOST_V2_LEAVE_TYPE 0x17000000
/* Define the IGMPv2 type mask in the IGMP header. */
#define NX_IGMPV2_TYPE_MASK 0xFF000000
/* Define the IGMPv2 maximum response time mask in the IGMP header. Max value is 0x64,
left intentionally blank in IGMPv1 queries and all IGMP reports. Maximum response time
is in tenth's of a second. */
#define NX_IGMP_MAX_RESP_TIME_MASK 0x00FF0000
/* For IGMPv1 only, define the IGMP maximum delay time to 10 seconds as per RFC 1112. This is achieved if
the slow NetX IP periodic thread timer executes every second (e.g. NX_IP_PERIODIC_RATE is set to 100)
and the threadx timer interrupt occurs every 10 ms). */
#define NX_IGMP_MAX_UPDATE_TIME 10
/* Define the time to live for IGMP packets. RFC 1112 and 2236 specify
time to live should be set at 1. */
#define NX_IGMP_TTL 1
/* Define the mask for IGMPv1 packets' type field. */
#define NX_IGMP_TYPE_MASK 0x0F000000
/* Define the IP "all hosts" multicast address. */
#define NX_ALL_HOSTS_ADDRESS IP_ADDRESS(224, 0, 0, 1)
/* Define the IP "all routers" multicast address. */
#define NX_ALL_ROUTERS_ADDRESS IP_ADDRESS(224, 0, 0, 2)
/* Define Basic IGMP packet header data type. This will be used to
build new IGMP packets and to examine incoming IGMP queries sent
to NetX. */
typedef struct NX_IGMP_HEADER_STRUCT
{
/* Define the first 32-bit word of the IGMP header. This word contains
the following information:
bits 31-28 IGMP 4-bit version (Version 1)
bits 27-24 IGMP 4-bit type defined as follows:
Type Field IGMP Message Type
1 Router Query Request
2 Host Query Response
bits 15-0 IGMP 16-bit checksum
*/
ULONG nx_igmp_header_word_0;
/* Define the second and final word of the IGMP header. This word contains
the following information:
bits 31-0 32-bit group address (class D IP address)
*/
ULONG nx_igmp_header_word_1;
} NX_IGMP_HEADER;
/* Define the IGMP query response message size. */
#define NX_IGMP_HEADER_SIZE sizeof(NX_IGMP_HEADER)
/* Define IGMP function prototypes. */
UINT _nx_igmp_enable(NX_IP *ip_ptr);
UINT _nx_igmp_info_get(NX_IP *ip_ptr, ULONG *igmp_reports_sent, ULONG *igmp_queries_received,
ULONG *igmp_checksum_errors, ULONG *current_groups_joined);
UINT _nx_igmp_loopback_disable(NX_IP *ip_ptr);
UINT _nx_igmp_loopback_enable(NX_IP *ip_ptr);
UINT _nx_igmp_multicast_join(NX_IP *ip_ptr, ULONG group_address);
UINT _nx_igmp_multicast_interface_join(NX_IP *ip_ptr, ULONG group_address, UINT nx_interface_index);
UINT _nx_igmp_multicast_leave(NX_IP *ip_ptr, ULONG group_address);
VOID _nx_igmp_initialize(VOID);
UINT _nx_igmp_interface_report_send(NX_IP *ip_ptr, ULONG group_address, UINT interface_index, UINT is_joining);
VOID _nx_igmp_periodic_processing(NX_IP *ip_ptr);
VOID _nx_igmp_packet_process(NX_IP *ip_ptr, NX_PACKET *packet_ptr);
VOID _nx_igmp_packet_receive(NX_IP *ip_ptr, NX_PACKET *packet_ptr);
VOID _nx_igmp_queue_process(NX_IP *ip_ptr);
UINT _nx_igmp_multicast_check(NX_IP *ip_ptr, ULONG group_address, NX_INTERFACE *nx_interface);
/* Define error checking shells for API services. These are only referenced by the
application. */
UINT _nxe_igmp_enable(NX_IP *ip_ptr);
UINT _nxe_igmp_info_get(NX_IP *ip_ptr, ULONG *igmp_reports_sent, ULONG *igmp_queries_received,
ULONG *igmp_checksum_errors, ULONG *current_groups_joined);
UINT _nxe_igmp_loopback_disable(NX_IP *ip_ptr);
UINT _nxe_igmp_loopback_enable(NX_IP *ip_ptr);
UINT _nxe_igmp_multicast_join(NX_IP *ip_ptr, ULONG group_address);
UINT _nxe_igmp_multicast_interface_join(NX_IP *ip_ptr, ULONG group_address, UINT nx_interface_index);
UINT _nxe_igmp_multicast_leave(NX_IP *ip_ptr, ULONG group_address);
/* IGMP component data declarations follow. */
/* Determine if the initialization function of this component is including
this file. If so, make the data definitions really happen. Otherwise,
make them extern so other functions in the component can access them. */
#ifdef NX_IGMP_INIT
#define IGMP_DECLARE
#else
#define IGMP_DECLARE extern
#endif
#endif