summaryrefslogtreecommitdiff
path: root/zebra/irdp.c
diff options
context:
space:
mode:
Diffstat (limited to 'zebra/irdp.c')
-rw-r--r--zebra/irdp.c569
1 files changed, 0 insertions, 569 deletions
diff --git a/zebra/irdp.c b/zebra/irdp.c
deleted file mode 100644
index 1b3bf232..00000000
--- a/zebra/irdp.c
+++ /dev/null
@@ -1,569 +0,0 @@
-/* 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 GNU Zebra; see the file COPYING. If not, write to the Free
- * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
-
-#include <zebra.h>
-
-#include <netinet/ip_icmp.h>
-
-#include "if.h"
-#include "stream.h"
-#include "memory.h"
-#include "command.h"
-#include "log.h"
-#include "sockunion.h"
-#include "sockopt.h"
-
-#include "zebra/irdp.h"
-
-/* Default does nothing. */
-int irdp_mode = IRDP_NONE;
-
-/* Timer interval of irdp. */
-int irdp_timer_interval = IRDP_DEFAULT_INTERVAL;
-
-/* Max solicitations */
-int max_solicitations = MAX_SOLICITATIONS;
-
-#define IRDP_SOLICIT_PACKET_SIZE 8
-
-static struct irdp *irdp_head = NULL;
-
-extern int in_cksum (void *ptr, int nbytes);
-
-char *icmp_type_str[] =
-{
- "Echo Reply",
- "ICMP 1",
- "ICMP 2",
- "Dest Unreachable",
- "Source Quench",
- "Redirect",
- "ICMP 6",
- "ICMP 7",
- "Echo",
- "Router Advertise",
- "Router Solicitation",
- "Time Exceeded",
- "Parameter Problem",
- "Timestamp",
- "Timestamp Reply",
- "Info Request",
- "Info Reply",
- "Netmask Request",
- "Netmask Reply",
-};
-
-char *
-icmp_type (int type)
-{
- if (type < 0 || type >= (sizeof icmp_type_str / sizeof (char *))) {
- return "OUT-OF-RANGE";
- }
- return icmp_type_str [type];
-}
-
-/* */
-void
-irdp_add_interface ()
-{
- ;
-}
-
-/* */
-void
-irdp_delete_interface ()
-{
-
-}
-
-struct irdp *
-irdp_route_new ()
-{
- struct irdp *new = XMALLOC (0, sizeof (struct irdp));
- memset (new, 0, sizeof (struct irdp));
- return new;
-}
-
-void
-irdp_route_free (struct irdp *route)
-{
- XFREE (0, route);
-}
-
-void
-route_delete ()
-{
-
-}
-
-void
-route_init ()
-{
-
-}
-
-void
-route_add (struct in_addr addr, unsigned long pref)
-{
- struct irdp *new = irdp_route_new();
-
- new->prefix = addr;
- new->pref = pref;
-
- printf ("address %s\n", inet_ntoa (new->prefix));
- printf ("pref %ld\n", new->pref);
-}
-
-void
-route_age (int time)
-{
- struct irdp *p;
-
- for (p = irdp_head; p != NULL; p = p->next) {
- if (p->timer < time) {
- /* fire */
- } else {
- p->timer -= time;
- }
- }
-}
-
-#define FLAG_TEST(a) ((ifp->flags & (a)) == (a))
-
-void
-send_multicast (struct interface *ifp, int sock, struct stream *s, int size)
-{
- struct sockaddr_in sin;
- struct in_addr addr;
- int nbytes;
- struct connected *connected;
- listnode node;
-
- for (node = listhead (ifp->connected); node; nextnode (node))
- {
- connected = getdata (node);
- }
-
- if (setsockopt_multicast_ipv4 (sock, IP_MULTICAST_IF,
- addr, 0, ifp->ifindex) < 0)
- {
- perror ("setsockopt");
- exit (1);
- }
-
- sin.sin_addr.s_addr = htonl (INADDR_ALLRTRS_GROUP);
- sin.sin_family = AF_INET;
-
- nbytes = sendto (sock, s->data, size, 0,
- (struct sockaddr *) &sin, sizeof (struct sockaddr));
-
- if (nbytes != size)
- {
- perror ("sendto");
- exit (1);
- }
-}
-
-void
-send_broadcast ()
-{
- struct sockaddr_in sin;
-
- printf ("broadcast\n");
- inet_aton ("255.255.255.255", &sin.sin_addr);
-}
-
-void
-irdp_send_solicit (int sock, struct stream *s, int size)
-{
- struct interface *ifp;
- listnode node;
-
- for (node = listhead (iflist); node; nextnode (node))
- {
- ifp = getdata (node);
- if (FLAG_TEST (IFF_UP | IFF_MULTICAST))
- {
- send_multicast (ifp, sock, s, size);
- }
- else if (FLAG_TEST (IFF_UP | IFF_BROADCAST))
- {
- send_broadcast ();
- }
- }
-}
-
-int
-ipv4_multicast_join (int sock,
- struct in_addr group,
- struct in_addr ifa,
- unsigned int ifindex)
-{
- int ret;
-
- ret = setsockopt_multicast_ipv4 (sock, IP_ADD_MEMBERSHIP,
- ifa, group.saddr, ifindex);
-
- if (ret < 0)
- zlog (NULL, LOG_INFO, "can't setsockopt IP_ADD_MEMBERSHIP");
-
- return ret;
-}
-
-/* multicast packet recieve socket */
-int
-irdp_multicast_socket (int sock, struct in_addr group)
-{
- struct interface *ifp;
- listnode node;
- struct in_addr addr;
-
- for (node = listhead (iflist); node; nextnode (node))
- {
- ifp = getdata (node);
-
- if ((ifp->flags & IFF_UP) && (ifp->flags & IFF_MULTICAST))
- {
- ipv4_multicast_join (sock, group, addr, ifp->ifindex);
- }
- }
- return 0;
-}
-
-struct
-{
- u_char type;
- u_char code;
- u_int16_t checksum;
- u_char number;
- u_char entry;
- u_int16_t lifetime;
-} radv;
-
-void
-irdp_set (int sock)
-{
- struct in_addr irdp_group;
-
- switch (irdp_mode)
- {
- case IRDP_HOST:
- irdp_group.s_addr = htonl (INADDR_ALLHOSTS_GROUP);
- break;
- case IRDP_ROUTER:
- irdp_group.s_addr = htonl (INADDR_ALLRTRS_GROUP);
- break;
- case IRDP_NONE:
- default:
- return;
- }
- irdp_multicast_socket (sock, irdp_group);
-}
-
-/* Make ICMP Router Solicitation Message. */
-int
-make_solicit_packet (struct stream *s)
-{
- int size;
- int checksum;
-
- stream_putc (s, ICMP_ROUTERSOLICIT); /* Type. */
- stream_putc (s, 0); /* Code. */
- stream_putw (s, 0); /* Checksum. */
- stream_putl (s, 0); /* Reserved. */
-
- /* in_cksum return network byte order value */
- size = IRDP_SOLICIT_PACKET_SIZE;
- checksum = in_cksum (s->data, size);
- stream_putw_at (s, checksum, 2);
-
- return IRDP_SOLICIT_PACKET_SIZE;
-}
-
-void
-irdp_solicit (int sock)
-{
- struct stream *s;
-
- s = stream_new (IRDP_SOLICIT_PACKET_SIZE);
- make_solicit_packet (s);
- irdp_send_solicit (sock, s, IRDP_SOLICIT_PACKET_SIZE);
-}
-
-#define ICMP_MINLEN 8
-
-/* check validity of the packet */
-int
-irdp_valid_check (char *packet, size_t size, struct sockaddr_in *from)
-{
- struct icmp *icmp;
-
- icmp = (struct icmp *) packet;
-
- if (in_cksum (packet, size)) {
- zlog_warn ("ICMP %s packet from %s: Bad checksum, silently ignored",
- icmp_type (icmp->icmp_type),
- inet_ntoa (from->sin_addr));
- return -1;
- }
-
- if (icmp->icmp_code != 0) {
- zlog_warn ("ICMP %s packet from %s: Bad ICMP type code, silently ignored",
- icmp_type (icmp->icmp_type),
- inet_ntoa (from->sin_addr));
- return -1;
- }
-
- if (size < ICMP_MINLEN) {
- zlog_warn ("ICMP %s packet from %s: IMCP message length is short",
- icmp_type (icmp->icmp_type),
- inet_ntoa (from->sin_addr));
- return -1;
- }
- return 0;
-}
-
-int
-irdp_solicit_recv (struct stream *s, int size, struct sockaddr_in *from)
-{
- if (irdp_valid_check (s->data, size, from)) {
- return 1;
- }
- return 0;
-}
-
-void
-irdp_advert_recv (struct stream *s, int size, struct sockaddr_in *from)
-{
- int i;
- struct in_addr addr;
- long pref;
-
- if (irdp_valid_check (s->data, size, from) < 0) {
- return;
- }
-
- radv.type = stream_getc (s);
- radv.code = stream_getc (s);
- radv.checksum = stream_getw (s);
- radv.number = stream_getc (s);
- radv.entry = stream_getc (s);
- radv.lifetime = stream_getw (s);
-
- printf ("type : %s\n", icmp_type (radv.type));
- printf ("number: %d\n", radv.number);
- printf ("entry: %d\n", radv.entry);
- printf ("lifetime: %d\n", radv.entry);
-
- for (i = 0; i < radv.number; i++)
- {
- addr.s_addr = stream_getl (s);
- pref = stream_getl (s);
- route_add (addr, ntohl (pref));
- }
- /* Packet size check is needed at here. */
-}
-
-void
-irdp_packet_process (char *buf, int size, struct sockaddr_in *from)
-{
- struct ip *ip;
- struct icmp *icmp;
- int hlen;
- struct stream *s = NULL;
-
- ip = (struct ip *)buf;
- hlen = ip->ip_hl << 2;
-
- if (size < hlen + ICMP_MINLEN)
- zlog_err ("ICMP relpy length is short\n");
-
- icmp = (struct icmp *)(buf + hlen);
-
- stream_forward (s, hlen);
-
- switch (icmp->icmp_type)
- {
- case ICMP_ROUTERADVERT:
- irdp_advert_recv (s, size - hlen, from);
- break;
- case ICMP_ROUTERSOLICIT:
- irdp_solicit_recv (s, size - hlen, from);
- break;
- }
-}
-
-/* Make socket for ICMP Router Discovery. */
-int
-irdp_make_socket ()
-{
- int sock;
- struct protoent *pent;
-
- if ((pent = getprotobyname ("icmp")) == NULL) {
- perror ("getprotobyname");
- exit (1);
- }
-
- if ((sock = socket (AF_INET, SOCK_RAW, pent->p_proto)) < 0)
- {
- perror ("socket");
- exit (1);
- }
-
- return sock;
-}
-
-/* recv routine */
-int
-irdp_recv (int sock)
-{
-#define PACKET_BUF 4096
- int nbytes;
- struct sockaddr_in from;
- int fromlen;
- char buf[PACKET_BUF];
-
- fromlen = sizeof (from);
- nbytes = recvfrom (sock, (char *)buf, PACKET_BUF, 0,
- (struct sockaddr *)&from, &fromlen);
-
- if (nbytes < 0)
- {
- perror ("recvfrom");
- exit (1);
- }
-
- irdp_packet_process (buf, nbytes, &from);
-
- return 0;
-}
-
-/* irdp packet recv loop */
-void
-irdp_loop (int sock)
-{
- while (1)
- {
- irdp_recv (sock);
- }
-}
-
-DEFUN (ip_irdp,
- ip_irdp_cmd,
- "ip irdp",
- IP_STR
- "ICMP Router discovery on this interface\n")
-{
- return CMD_SUCCESS;
-}
-
-DEFUN (ip_irdp_multicast,
- ip_irdp_multicast_cmd,
- "ip irdp multicast",
- IP_STR
- "ICMP Router discovery on this interface\n"
- "Send IRDP advertisement to the multicast address\n")
-{
- return CMD_SUCCESS;
-}
-
-DEFUN (ip_irdp_holdtime,
- ip_irdp_holdtime_cmd,
- "ip irdp holdtime <0-9000>",
- IP_STR
- "ICMP Router discovery on this interface\n"
- "Set holdtime value\n"
- "Holdtime value in seconds. Default is 1800 seconds\n")
-{
- return CMD_SUCCESS;
-}
-
-DEFUN (ip_irdp_maxadvertinterval,
- ip_irdp_maxadvertinterval_cmd,
- "ip irdp maxadvertinterval (0|<4-1800>)",
- IP_STR
- "ICMP Router discovery on this interface\n"
- "Set maximum time between advertisement\n"
- "Maximum advertisement interval in seconds\n")
-{
- return CMD_SUCCESS;
-}
-
-DEFUN (ip_irdp_minadvertinterval,
- ip_irdp_minadvertinterval_cmd,
- "ip irdp minadvertinterval <3-1800>",
- IP_STR
- "ICMP Router discovery on this interface\n"
- "Set minimum time between advertisement\n"
- "Minimum advertisement interval in seconds\n")
-{
- return CMD_SUCCESS;
-}
-
-DEFUN (ip_irdp_preference,
- ip_irdp_preference_cmd,
- /* "ip irdp preference <-2147483648-2147483647>", */
- "ip irdp preference <0-2147483647>",
- IP_STR
- "ICMP Router discovery on this interface\n"
- "Set default preference level for this interface\n"
- "Preference level\n")
-{
- return CMD_SUCCESS;
-}
-
-#if 0
-DEFUN (ip_irdp_address,
- ip_irdp_address_cmd,
- "ip irdp address A.B.C.D",
- IP_STR
- "ICMP Router discovery on this interface\n"
- "Specify IRDP address and preference to proxy-advertise\n"
- "Set IRDP address for proxy-advertise\n")
-{
- return CMD_SUCCESS;
-}
-#endif /* 0 */
-
-DEFUN (ip_irdp_address_preference,
- ip_irdp_address_preference_cmd,
- "ip irdp address A.B.C.D <0-2147483647>",
- IP_STR
- "ICMP Router discovery on this interface\n"
- "Specify IRDP address and preference to proxy-advertise\n"
- "Set IRDP address for proxy-advertise\n"
- "Preference level\n")
-{
- return CMD_SUCCESS;
-}
-
-void
-irdp_init ()
-{
- install_element (INTERFACE_NODE, &ip_irdp_cmd);
- install_element (INTERFACE_NODE, &ip_irdp_multicast_cmd);
- install_element (INTERFACE_NODE, &ip_irdp_holdtime_cmd);
- install_element (INTERFACE_NODE, &ip_irdp_maxadvertinterval_cmd);
- install_element (INTERFACE_NODE, &ip_irdp_minadvertinterval_cmd);
- install_element (INTERFACE_NODE, &ip_irdp_preference_cmd);
- install_element (INTERFACE_NODE, &ip_irdp_address_preference_cmd);
-}