mirror of
				https://git.proxmox.com/git/mirror_frr
				synced 2025-10-31 05:25:56 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			159 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* ICMP Router Discovery Messages
 | |
|  * Copyright (C) 1997, 2000 Kunihiro Ishiguro
 | |
|  *
 | |
|  * This file is part of GNU Zebra.
 | |
|  *
 | |
|  * GNU Zebra is free software; you can redistribute it and/or modify it
 | |
|  * under the terms of the GNU General Public License as published by the
 | |
|  * Free Software Foundation; either version 2, or (at your option) any
 | |
|  * later version.
 | |
|  *
 | |
|  * GNU Zebra is distributed in the hope that it will be useful, but
 | |
|  * WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
|  * General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU General Public License along
 | |
|  * with this program; see the file COPYING; if not, write to the Free Software
 | |
|  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 | |
|  */
 | |
| 
 | |
| /*
 | |
|  * This file is modified and completed for the Zebra IRDP implementation
 | |
|  * by Robert Olsson, Swedish University of Agricultural Sciences
 | |
|  */
 | |
| 
 | |
| #ifndef _IRDP_H
 | |
| #define _IRDP_H
 | |
| 
 | |
| #include "lib/vty.h"
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| /* ICMP Messages */
 | |
| #ifndef ICMP_ROUTERADVERT
 | |
| #define ICMP_ROUTERADVERT 9
 | |
| #endif /* ICMP_ROUTERADVERT */
 | |
| 
 | |
| #ifndef ICMP_ROUTERSOLICIT
 | |
| #define ICMP_ROUTERSOLICIT 10
 | |
| #endif /* ICMP_ROUTERSOLICT */
 | |
| 
 | |
| /* Multicast groups */
 | |
| #ifndef INADDR_ALLHOSTS_GROUP
 | |
| #define INADDR_ALLHOSTS_GROUP 0xe0000001U    /* 224.0.0.1 */
 | |
| #endif /* INADDR_ALLHOSTS_GROUP */
 | |
| 
 | |
| #ifndef INADDR_ALLRTRS_GROUP
 | |
| #define INADDR_ALLRTRS_GROUP  0xe0000002U    /* 224.0.0.2 */
 | |
| #endif /* INADDR_ALLRTRS_GROUP */
 | |
| 
 | |
| /* Default irdp packet interval */
 | |
| #define IRDP_DEFAULT_INTERVAL 300
 | |
| 
 | |
| /* Router constants from RFC1256 */
 | |
| #define MAX_INITIAL_ADVERT_INTERVAL 16
 | |
| #define MAX_INITIAL_ADVERTISEMENTS   3
 | |
| #define MAX_RESPONSE_DELAY           2
 | |
| 
 | |
| #define IRDP_MAXADVERTINTERVAL 600
 | |
| #define IRDP_MINADVERTINTERVAL 450 /* 0.75*600 */
 | |
| #define IRDP_LIFETIME         1350 /* 3*450 */
 | |
| #define IRDP_PREFERENCE 0
 | |
| 
 | |
| #define ICMP_MINLEN 8
 | |
| 
 | |
| #define IRDP_LAST_ADVERT_MESSAGES 2 /* The last adverts with Holdtime 0 */
 | |
| 
 | |
| #define IRDP_RX_BUF 1500
 | |
| 
 | |
| /*
 | |
|      Comments comes from RFC1256 ICMP Router Discovery Messages.
 | |
| 
 | |
|      The IP destination address to be used for multicast Router
 | |
|      Advertisements sent from the interface.  The only permissible
 | |
|      values are the all-systems multicast address, 224.0.0.1, or the
 | |
|      limited-broadcast address, 255.255.255.255.  (The all-systems
 | |
|      address is preferred wherever possible, i.e., on any link where
 | |
|      all listening hosts support IP multicast.)
 | |
| 
 | |
|      Default: 224.0.0.1 if the router supports IP multicast on the
 | |
|      interface, else 255.255.255.255
 | |
| 
 | |
|      The maximum time allowed between sending multicast Router
 | |
|      Advertisements from the interface, in seconds.  Must be no less
 | |
|      than 4 seconds and no greater than 1800 seconds.
 | |
| 
 | |
|      Default: 600 seconds
 | |
| 
 | |
|      The minimum time allowed between sending unsolicited multicast
 | |
|      Router Advertisements from the interface, in seconds.  Must be no
 | |
|      less than 3 seconds and no greater than MaxAdvertisementInterval.
 | |
| 
 | |
|      Default: 0.75 * MaxAdvertisementInterval
 | |
| 
 | |
|      The value to be placed in the Lifetime field of Router
 | |
|      Advertisements sent from the interface, in seconds.  Must be no
 | |
|      less than MaxAdvertisementInterval and no greater than 9000
 | |
|      seconds.
 | |
| 
 | |
|      Default: 3 * MaxAdvertisementInterval
 | |
| 
 | |
|      The preferability of the address as a default router address,
 | |
|      relative to other router addresses on the same subnet.  A 32-bit,
 | |
|      signed, twos-complement integer, with higher values meaning more
 | |
|      preferable.  The minimum value (hex 80000000) is used to indicate
 | |
|      that the address, even though it may be advertised, is not to be
 | |
|      used by neighboring hosts as a default router address.
 | |
| 
 | |
|      Default: 0
 | |
| */
 | |
| 
 | |
| struct irdp_interface {
 | |
| 	bool started;
 | |
| 
 | |
| 	unsigned long MaxAdvertInterval;
 | |
| 	unsigned long MinAdvertInterval;
 | |
| 	unsigned long Preference;
 | |
| 
 | |
| 	uint32_t flags;
 | |
| 
 | |
| #define IF_ACTIVE               (1<<0) /* ICMP Active */
 | |
| #define IF_BROADCAST            (1<<1) /* 255.255.255.255 */
 | |
| #define IF_SOLICIT              (1<<2) /* Solicit active */
 | |
| #define IF_DEBUG_MESSAGES       (1<<3)
 | |
| #define IF_DEBUG_PACKET         (1<<4)
 | |
| #define IF_DEBUG_MISC           (1<<5)
 | |
| #define IF_SHUTDOWN             (1<<6)
 | |
| 
 | |
| 	struct interface *ifp;
 | |
| 	struct thread *t_advertise;
 | |
| 	unsigned long irdp_sent;
 | |
| 	uint16_t Lifetime;
 | |
| 
 | |
| 	struct list *AdvPrefList;
 | |
| };
 | |
| 
 | |
| struct Adv {
 | |
| 	struct in_addr ip;
 | |
| 	int pref;
 | |
| };
 | |
| 
 | |
| extern void irdp_if_init(void);
 | |
| extern int irdp_sock_init(void);
 | |
| extern int irdp_config_write(struct vty *, struct interface *);
 | |
| extern int irdp_send_thread(struct thread *t_advert);
 | |
| extern void irdp_advert_off(struct interface *ifp);
 | |
| extern void process_solicit(struct interface *ifp);
 | |
| extern int irdp_read_raw(struct thread *r);
 | |
| extern void send_packet(struct interface *ifp, struct stream *s, uint32_t dst,
 | |
| 			struct prefix *p, uint32_t ttl);
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif /* _IRDP_H */
 | 
