2005-03-30 Andrew J. Schorr <ajschorr@alumni.princeton.edu>

* irdp.h: Add prototype for irdp_sock_init, and fix protos for
	  other irdp_* functions.
	* irdp_interface.c: (irdp_if_start) If irdp_sock is negative,
	  call irdp_sock_init to create the IRDP socket.
	  (irdp_if_init) Rename to irdp_init().
	  (get_iflist_ifp) Remove function that is a duplicate of
	  if_lookup_by_index.
	  (*) Make many functions static.  And remove superfluous "\n" from
	  several zlog messages.
	* irdp_main.c: (irdp_init) Remove function that used to call
	  irdp_if_init() and irdp_sock_init(), since we will now create
	  the socket only upon first use.
	  (irdp_sock_init) Do not update global irdp_sock variable, just
	  return the fd and assume that the caller will do so.  If setsockopt
	  calls fail, close the socket before returning -1.
	  (*) Make many functions static.
	* irdp_packet.c: Initialize irdp_sock to -1.
	  (irdp_read_raw) Call standard library function if_lookup_by_index
	  instead of get_iflist_ifp.
	  (irdp_recvmsg) Should be static, not global.
This commit is contained in:
ajs 2005-03-30 16:33:13 +00:00
parent a608bbf27b
commit 2da40f4919
5 changed files with 89 additions and 75 deletions

View File

@ -1,3 +1,26 @@
2005-03-30 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* irdp.h: Add prototype for irdp_sock_init, and fix protos for
other irdp_* functions.
* irdp_interface.c: (irdp_if_start) If irdp_sock is negative,
call irdp_sock_init to create the IRDP socket.
(irdp_if_init) Rename to irdp_init().
(get_iflist_ifp) Remove function that is a duplicate of
if_lookup_by_index.
(*) Make many functions static. And remove superfluous "\n" from
several zlog messages.
* irdp_main.c: (irdp_init) Remove function that used to call
irdp_if_init() and irdp_sock_init(), since we will now create
the socket only upon first use.
(irdp_sock_init) Do not update global irdp_sock variable, just
return the fd and assume that the caller will do so. If setsockopt
calls fail, close the socket before returning -1.
(*) Make many functions static.
* irdp_packet.c: Initialize irdp_sock to -1.
(irdp_read_raw) Call standard library function if_lookup_by_index
instead of get_iflist_ifp.
(irdp_recvmsg) Should be static, not global.
2005-03-29 Andrew J. Schorr <ajschorr@alumni.princeton.edu> 2005-03-29 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* rt_netlink.c: (netlink_link_change) If the status of an * rt_netlink.c: (netlink_link_change) If the status of an

View File

@ -142,12 +142,9 @@ struct Adv
int pref; int pref;
}; };
void irdp_init(); extern void irdp_init(void);
void irdp_finish(); extern int irdp_sock_init(void);
void irdp_config_write (struct vty *, struct interface *); extern void irdp_finish(void);
extern void irdp_config_write (struct vty *, struct interface *);
#endif /* _IRDP_H */ #endif /* _IRDP_H */

View File

@ -74,7 +74,8 @@ void irdp_advert_off(struct interface *ifp);
char b1[16], b2[16], b3[16], b4[16]; /* For inet_2a */ char b1[16], b2[16], b3[16], b4[16]; /* For inet_2a */
struct prefix *irdp_get_prefix(struct interface *ifp) static struct prefix *
irdp_get_prefix(struct interface *ifp)
{ {
struct listnode *node; struct listnode *node;
struct connected *ifc; struct connected *ifc;
@ -87,7 +88,8 @@ struct prefix *irdp_get_prefix(struct interface *ifp)
} }
/* Join to the add/leave multicast group. */ /* Join to the add/leave multicast group. */
int if_group (struct interface *ifp, static int
if_group (struct interface *ifp,
int sock, int sock,
u_int32_t group, u_int32_t group,
int add_leave) int add_leave)
@ -121,7 +123,8 @@ int if_group (struct interface *ifp,
return ret; return ret;
} }
int if_add_group (struct interface *ifp) static int
if_add_group (struct interface *ifp)
{ {
struct zebra_if *zi= ifp->info; struct zebra_if *zi= ifp->info;
struct irdp_interface *irdp = &zi->irdp; struct irdp_interface *irdp = &zi->irdp;
@ -133,12 +136,14 @@ int if_add_group (struct interface *ifp)
} }
if(irdp->flags & IF_DEBUG_MISC ) if(irdp->flags & IF_DEBUG_MISC )
zlog_debug("IRDP: Adding group %s for %s\n", zlog_debug("IRDP: Adding group %s for %s",
inet_2a(htonl(INADDR_ALLRTRS_GROUP), b1), inet_2a(htonl(INADDR_ALLRTRS_GROUP), b1),
ifp->name); ifp->name);
return 0; return 0;
} }
int if_drop_group (struct interface *ifp)
static int
if_drop_group (struct interface *ifp)
{ {
struct zebra_if *zi= ifp->info; struct zebra_if *zi= ifp->info;
struct irdp_interface *irdp = &zi->irdp; struct irdp_interface *irdp = &zi->irdp;
@ -149,25 +154,13 @@ int if_drop_group (struct interface *ifp)
return ret; return ret;
if(irdp->flags & IF_DEBUG_MISC) if(irdp->flags & IF_DEBUG_MISC)
zlog_debug("IRDP: Leaving group %s for %s\n", zlog_debug("IRDP: Leaving group %s for %s",
inet_2a(htonl(INADDR_ALLRTRS_GROUP), b1), inet_2a(htonl(INADDR_ALLRTRS_GROUP), b1),
ifp->name); ifp->name);
return 0; return 0;
} }
struct interface *get_iflist_ifp(unsigned int idx) static void
{
struct listnode *node;
struct interface *ifp;
LIST_LOOP (iflist, ifp, node)
if(ifp->ifindex == idx)
return ifp;
return NULL;
}
void
if_set_defaults(struct interface *ifp) if_set_defaults(struct interface *ifp)
{ {
struct zebra_if *zi=ifp->info; struct zebra_if *zi=ifp->info;
@ -180,7 +173,7 @@ if_set_defaults(struct interface *ifp)
} }
struct Adv *Adv_new () struct Adv *Adv_new (void)
{ {
struct Adv *new; struct Adv *new;
new = XMALLOC (MTYPE_TMP, sizeof (struct Adv)); new = XMALLOC (MTYPE_TMP, sizeof (struct Adv));
@ -188,12 +181,14 @@ struct Adv *Adv_new ()
return new; return new;
} }
void Adv_free (struct Adv *adv) static void
Adv_free (struct Adv *adv)
{ {
XFREE (MTYPE_TMP, adv); XFREE (MTYPE_TMP, adv);
} }
void irdp_if_start(struct interface *ifp, int multicast, int set_defaults) static void
irdp_if_start(struct interface *ifp, int multicast, int set_defaults)
{ {
struct zebra_if *zi= ifp->info; struct zebra_if *zi= ifp->info;
struct irdp_interface *irdp = &zi->irdp; struct irdp_interface *irdp = &zi->irdp;
@ -202,7 +197,12 @@ void irdp_if_start(struct interface *ifp, int multicast, int set_defaults)
u_int32_t timer, seed; u_int32_t timer, seed;
if (irdp->flags & IF_ACTIVE ) { if (irdp->flags & IF_ACTIVE ) {
zlog_warn("IRDP: Interface is already active %s\n", ifp->name); zlog_warn("IRDP: Interface is already active %s", ifp->name);
return;
}
if ((irdp_sock < 0) && ((irdp_sock = irdp_sock_init()) < 0)) {
zlog_warn("IRDP: Cannot activate interface %s (cannot create "
"IRDP socket)", ifp->name);
return; return;
} }
irdp->flags |= IF_ACTIVE; irdp->flags |= IF_ACTIVE;
@ -213,7 +213,7 @@ void irdp_if_start(struct interface *ifp, int multicast, int set_defaults)
if_add_update(ifp); if_add_update(ifp);
if (! (ifp->flags & IFF_UP)) { if (! (ifp->flags & IFF_UP)) {
zlog_warn("IRDP: Interface is down %s\n", ifp->name); zlog_warn("IRDP: Interface is down %s", ifp->name);
} }
/* Shall we cancel if_start if if_add_group fails? */ /* Shall we cancel if_start if if_add_group fails? */
@ -222,7 +222,7 @@ void irdp_if_start(struct interface *ifp, int multicast, int set_defaults)
if_add_group(ifp); if_add_group(ifp);
if (! (ifp->flags & (IFF_MULTICAST|IFF_ALLMULTI))) { if (! (ifp->flags & (IFF_MULTICAST|IFF_ALLMULTI))) {
zlog_warn("IRDP: Interface not multicast enabled %s\n", ifp->name); zlog_warn("IRDP: Interface not multicast enabled %s", ifp->name);
} }
} }
@ -256,7 +256,7 @@ void irdp_if_start(struct interface *ifp, int multicast, int set_defaults)
if(irdp->flags & IF_DEBUG_MISC) if(irdp->flags & IF_DEBUG_MISC)
zlog_debug("IRDP: Init timer for %s set to %u\n", zlog_debug("IRDP: Init timer for %s set to %u",
ifp->name, ifp->name,
timer); timer);
@ -266,7 +266,8 @@ void irdp_if_start(struct interface *ifp, int multicast, int set_defaults)
timer); timer);
} }
void irdp_if_stop(struct interface *ifp) static void
irdp_if_stop(struct interface *ifp)
{ {
struct zebra_if *zi=ifp->info; struct zebra_if *zi=ifp->info;
struct irdp_interface *irdp=&zi->irdp; struct irdp_interface *irdp=&zi->irdp;
@ -277,7 +278,7 @@ void irdp_if_stop(struct interface *ifp)
} }
if (! (irdp->flags & IF_ACTIVE )) { if (! (irdp->flags & IF_ACTIVE )) {
zlog_warn("Interface is not active %s\n", ifp->name); zlog_warn("Interface is not active %s", ifp->name);
return; return;
} }
@ -293,13 +294,14 @@ void irdp_if_stop(struct interface *ifp)
} }
void irdp_if_shutdown(struct interface *ifp) static void
irdp_if_shutdown(struct interface *ifp)
{ {
struct zebra_if *zi= ifp->info; struct zebra_if *zi= ifp->info;
struct irdp_interface *irdp = &zi->irdp; struct irdp_interface *irdp = &zi->irdp;
if (irdp->flags & IF_SHUTDOWN ) { if (irdp->flags & IF_SHUTDOWN ) {
zlog_warn("IRDP: Interface is already shutdown %s\n", ifp->name); zlog_warn("IRDP: Interface is already shutdown %s", ifp->name);
return; return;
} }
@ -313,13 +315,14 @@ void irdp_if_shutdown(struct interface *ifp)
irdp_advert_off(ifp); irdp_advert_off(ifp);
} }
void irdp_if_no_shutdown(struct interface *ifp) static void
irdp_if_no_shutdown(struct interface *ifp)
{ {
struct zebra_if *zi= ifp->info; struct zebra_if *zi= ifp->info;
struct irdp_interface *irdp = &zi->irdp; struct irdp_interface *irdp = &zi->irdp;
if (! (irdp->flags & IF_SHUTDOWN )) { if (! (irdp->flags & IF_SHUTDOWN )) {
zlog_warn("IRDP: Interface is not shutdown %s\n", ifp->name); zlog_warn("IRDP: Interface is not shutdown %s", ifp->name);
return; return;
} }
@ -760,7 +763,7 @@ DEFUN (ip_irdp_debug_disable,
} }
void void
irdp_if_init () irdp_init ()
{ {
install_element (INTERFACE_NODE, &ip_irdp_broadcast_cmd); install_element (INTERFACE_NODE, &ip_irdp_broadcast_cmd);
install_element (INTERFACE_NODE, &ip_irdp_multicast_cmd); install_element (INTERFACE_NODE, &ip_irdp_multicast_cmd);

View File

@ -77,15 +77,12 @@ int irdp_timer_interval = IRDP_DEFAULT_INTERVAL;
int irdp_read_raw(struct thread *r); int irdp_read_raw(struct thread *r);
int in_cksum (void *ptr, int nbytes); int in_cksum (void *ptr, int nbytes);
extern int irdp_sock;
void send_packet(struct interface *ifp, void send_packet(struct interface *ifp,
struct stream *s, struct stream *s,
u_int32_t dst, u_int32_t dst,
struct prefix *p, struct prefix *p,
u_int32_t ttl); u_int32_t ttl);
void irdp_if_init ();
char * char *
inet_2a(u_int32_t a, char *b) inet_2a(u_int32_t a, char *b)
{ {
@ -102,44 +99,48 @@ irdp_sock_init (void)
{ {
int ret, i; int ret, i;
int save_errno; int save_errno;
int sock;
if ( zserv_privs.change (ZPRIVS_RAISE) ) if ( zserv_privs.change (ZPRIVS_RAISE) )
zlog_err ("irdp_sock_init: could not raise privs, %s", zlog_err ("irdp_sock_init: could not raise privs, %s",
safe_strerror (errno) ); safe_strerror (errno) );
irdp_sock = socket (AF_INET, SOCK_RAW, IPPROTO_ICMP); sock = socket (AF_INET, SOCK_RAW, IPPROTO_ICMP);
save_errno = errno; save_errno = errno;
if ( zserv_privs.change (ZPRIVS_LOWER) ) if ( zserv_privs.change (ZPRIVS_LOWER) )
zlog_err ("irdp_sock_init: could not lower privs, %s", zlog_err ("irdp_sock_init: could not lower privs, %s",
safe_strerror (errno) ); safe_strerror (errno) );
if (irdp_sock < 0) { if (sock < 0) {
zlog_warn ("IRDP: can't create irdp socket %s", safe_strerror(save_errno)); zlog_warn ("IRDP: can't create irdp socket %s", safe_strerror(save_errno));
return irdp_sock; return sock;
}; };
i = 1; i = 1;
ret = setsockopt (irdp_sock, IPPROTO_IP, IP_TTL, ret = setsockopt (sock, IPPROTO_IP, IP_TTL,
(void *) &i, sizeof (i)); (void *) &i, sizeof (i));
if (ret < 0) { if (ret < 0) {
zlog_warn ("IRDP: can't do irdp sockopt %s", safe_strerror(errno)); zlog_warn ("IRDP: can't do irdp sockopt %s", safe_strerror(errno));
close(sock);
return ret; return ret;
}; };
ret = setsockopt_ifindex (AF_INET, irdp_sock, 1); ret = setsockopt_ifindex (AF_INET, sock, 1);
if (ret < 0) { if (ret < 0) {
zlog_warn ("IRDP: can't do irdp sockopt %s", safe_strerror(errno)); zlog_warn ("IRDP: can't do irdp sockopt %s", safe_strerror(errno));
close(sock);
return ret; return ret;
}; };
t_irdp_raw = thread_add_read (zebrad.master, irdp_read_raw, NULL, irdp_sock); t_irdp_raw = thread_add_read (zebrad.master, irdp_read_raw, NULL, sock);
return irdp_sock; return sock;
} }
int get_pref(struct irdp_interface *irdp, struct prefix *p) static int
get_pref(struct irdp_interface *irdp, struct prefix *p)
{ {
struct listnode *node; struct listnode *node;
struct Adv *adv; struct Adv *adv;
@ -157,9 +158,10 @@ int get_pref(struct irdp_interface *irdp, struct prefix *p)
} }
/* Make ICMP Router Advertisement Message. */ /* Make ICMP Router Advertisement Message. */
int make_advertisement_packet (struct interface *ifp, static int
struct prefix *p, make_advertisement_packet (struct interface *ifp,
struct stream *s) struct prefix *p,
struct stream *s)
{ {
struct zebra_if *zi=ifp->info; struct zebra_if *zi=ifp->info;
struct irdp_interface *irdp=&zi->irdp; struct irdp_interface *irdp=&zi->irdp;
@ -191,9 +193,8 @@ int make_advertisement_packet (struct interface *ifp,
return size; return size;
} }
void irdp_send(struct interface *ifp, static void
struct prefix *p, irdp_send(struct interface *ifp, struct prefix *p, struct stream *s)
struct stream *s)
{ {
struct zebra_if *zi=ifp->info; struct zebra_if *zi=ifp->info;
struct irdp_interface *irdp=&zi->irdp; struct irdp_interface *irdp=&zi->irdp;
@ -218,8 +219,7 @@ void irdp_send(struct interface *ifp,
send_packet (ifp, s, dst, p, ttl); send_packet (ifp, s, dst, p, ttl);
} }
void irdp_advertisement (struct interface *ifp, static void irdp_advertisement (struct interface *ifp, struct prefix *p)
struct prefix *p)
{ {
struct stream *s; struct stream *s;
s = stream_new (128); s = stream_new (128);
@ -345,14 +345,4 @@ void irdp_finish()
} }
} }
void irdp_init()
{
irdp_sock_init();
irdp_if_init ();
}
#endif /* HAVE_IRDP */ #endif /* HAVE_IRDP */

View File

@ -66,16 +66,16 @@
/* GLOBAL VARS */ /* GLOBAL VARS */
int irdp_sock; int irdp_sock = -1;
char b1[16], b2[16], b3[16], b4[16]; /* For inet_2a */ char b1[16], b2[16], b3[16], b4[16]; /* For inet_2a */
extern struct zebra_t zebrad; extern struct zebra_t zebrad;
extern struct thread *t_irdp_raw; extern struct thread *t_irdp_raw;
extern struct interface *get_iflist_ifp(int idx);
int in_cksum (void *ptr, int nbytes); int in_cksum (void *ptr, int nbytes);
void process_solicit (struct interface *ifp); void process_solicit (struct interface *ifp);
void parse_irdp_packet(char *p, static void
parse_irdp_packet(char *p,
int len, int len,
struct interface *ifp) struct interface *ifp)
{ {
@ -187,7 +187,8 @@ void parse_irdp_packet(char *p,
} }
} }
int irdp_recvmsg (int sock, u_char *buf, int size, int *ifindex) static int
irdp_recvmsg (int sock, u_char *buf, int size, int *ifindex)
{ {
struct msghdr msg; struct msghdr msg;
struct iovec iov; struct iovec iov;
@ -239,7 +240,7 @@ int irdp_read_raw(struct thread *r)
if (ret < 0) zlog_warn ("IRDP: RX Error length = %d", ret); if (ret < 0) zlog_warn ("IRDP: RX Error length = %d", ret);
ifp = get_iflist_ifp(ifindex); ifp = if_lookup_by_index(ifindex);
if(! ifp ) return ret; if(! ifp ) return ret;
zi= ifp->info; zi= ifp->info;