version 1.1, 2012/02/21 17:26:12
|
version 1.1.1.2, 2012/10/09 09:22:28
|
Line 41 static void zclient_event (enum event, struct zclient
|
Line 41 static void zclient_event (enum event, struct zclient
|
|
|
extern struct thread_master *master; |
extern struct thread_master *master; |
|
|
|
char *zclient_serv_path = NULL; |
|
|
/* This file local debug flag. */ |
/* This file local debug flag. */ |
int zclient_debug = 0; |
int zclient_debug = 0; |
|
|
Line 143 zclient_reset (struct zclient *zclient)
|
Line 145 zclient_reset (struct zclient *zclient)
|
zclient_init (zclient, zclient->redist_default); |
zclient_init (zclient, zclient->redist_default); |
} |
} |
|
|
|
#ifdef HAVE_TCP_ZEBRA |
|
|
/* Make socket to zebra daemon. Return zebra socket. */ |
/* Make socket to zebra daemon. Return zebra socket. */ |
int | static int |
zclient_socket(void) |
zclient_socket(void) |
{ |
{ |
int sock; |
int sock; |
Line 175 zclient_socket(void)
|
Line 179 zclient_socket(void)
|
return sock; |
return sock; |
} |
} |
|
|
|
#else |
|
|
/* For sockaddr_un. */ |
/* For sockaddr_un. */ |
#include <sys/un.h> |
#include <sys/un.h> |
|
|
int | static int |
zclient_socket_un (const char *path) |
zclient_socket_un (const char *path) |
{ |
{ |
int ret; |
int ret; |
Line 208 zclient_socket_un (const char *path)
|
Line 214 zclient_socket_un (const char *path)
|
return sock; |
return sock; |
} |
} |
|
|
|
#endif /* HAVE_TCP_ZEBRA */ |
|
|
|
/** |
|
* Connect to zebra daemon. |
|
* @param zclient a pointer to zclient structure |
|
* @return socket fd just to make sure that connection established |
|
* @see zclient_init |
|
* @see zclient_new |
|
*/ |
|
int |
|
zclient_socket_connect (struct zclient *zclient) |
|
{ |
|
#ifdef HAVE_TCP_ZEBRA |
|
zclient->sock = zclient_socket (); |
|
#else |
|
zclient->sock = zclient_socket_un (zclient_serv_path ? zclient_serv_path : ZEBRA_SERV_PATH); |
|
#endif |
|
return zclient->sock; |
|
} |
|
|
static int |
static int |
zclient_failed(struct zclient *zclient) |
zclient_failed(struct zclient *zclient) |
{ |
{ |
Line 292 zebra_message_send (struct zclient *zclient, int comma
|
Line 318 zebra_message_send (struct zclient *zclient, int comma
|
return zclient_send_message(zclient); |
return zclient_send_message(zclient); |
} |
} |
|
|
|
static int |
|
zebra_hello_send (struct zclient *zclient) |
|
{ |
|
struct stream *s; |
|
|
|
if (zclient->redist_default) |
|
{ |
|
s = zclient->obuf; |
|
stream_reset (s); |
|
|
|
zclient_create_header (s, ZEBRA_HELLO); |
|
stream_putc (s, zclient->redist_default); |
|
stream_putw_at (s, 0, stream_get_endp (s)); |
|
return zclient_send_message(zclient); |
|
} |
|
|
|
return 0; |
|
} |
|
|
/* Make connection to zebra daemon. */ |
/* Make connection to zebra daemon. */ |
int |
int |
zclient_start (struct zclient *zclient) |
zclient_start (struct zclient *zclient) |
Line 313 zclient_start (struct zclient *zclient)
|
Line 358 zclient_start (struct zclient *zclient)
|
if (zclient->t_connect) |
if (zclient->t_connect) |
return 0; |
return 0; |
|
|
/* Make socket. */ | if (zclient_socket_connect(zclient) < 0) |
#ifdef HAVE_TCP_ZEBRA | |
zclient->sock = zclient_socket (); | |
#else | |
zclient->sock = zclient_socket_un (ZEBRA_SERV_PATH); | |
#endif /* HAVE_TCP_ZEBRA */ | |
if (zclient->sock < 0) | |
{ |
{ |
if (zclient_debug) |
if (zclient_debug) |
zlog_debug ("zclient connection fail"); |
zlog_debug ("zclient connection fail"); |
Line 339 zclient_start (struct zclient *zclient)
|
Line 378 zclient_start (struct zclient *zclient)
|
/* Create read thread. */ |
/* Create read thread. */ |
zclient_event (ZCLIENT_READ, zclient); |
zclient_event (ZCLIENT_READ, zclient); |
|
|
|
zebra_hello_send (zclient); |
|
|
/* We need router-id information. */ |
/* We need router-id information. */ |
zebra_message_send (zclient, ZEBRA_ROUTER_ID_ADD); |
zebra_message_send (zclient, ZEBRA_ROUTER_ID_ADD); |
|
|
Line 435 zapi_ipv4_route (u_char cmd, struct zclient *zclient,
|
Line 476 zapi_ipv4_route (u_char cmd, struct zclient *zclient,
|
stream_putc (s, api->type); |
stream_putc (s, api->type); |
stream_putc (s, api->flags); |
stream_putc (s, api->flags); |
stream_putc (s, api->message); |
stream_putc (s, api->message); |
|
stream_putw (s, api->safi); |
|
|
/* Put prefix information. */ |
/* Put prefix information. */ |
psize = PSIZE (p->prefixlen); |
psize = PSIZE (p->prefixlen); |
Line 496 zapi_ipv6_route (u_char cmd, struct zclient *zclient,
|
Line 538 zapi_ipv6_route (u_char cmd, struct zclient *zclient,
|
stream_putc (s, api->type); |
stream_putc (s, api->type); |
stream_putc (s, api->flags); |
stream_putc (s, api->flags); |
stream_putc (s, api->message); |
stream_putc (s, api->message); |
|
stream_putw (s, api->safi); |
|
|
/* Put prefix information. */ |
/* Put prefix information. */ |
psize = PSIZE (p->prefixlen); |
psize = PSIZE (p->prefixlen); |
Line 611 zebra_interface_add_read (struct stream *s)
|
Line 654 zebra_interface_add_read (struct stream *s)
|
/* Lookup/create interface by name. */ |
/* Lookup/create interface by name. */ |
ifp = if_get_by_name_len (ifname_tmp, strnlen(ifname_tmp, INTERFACE_NAMSIZ)); |
ifp = if_get_by_name_len (ifname_tmp, strnlen(ifname_tmp, INTERFACE_NAMSIZ)); |
|
|
/* Read interface's index. */ | zebra_interface_if_set_value (s, ifp); |
ifp->ifindex = stream_getl (s); | |
|
|
/* Read interface's value. */ |
|
ifp->status = stream_getc (s); |
|
ifp->flags = stream_getq (s); |
|
ifp->metric = stream_getl (s); |
|
ifp->mtu = stream_getl (s); |
|
ifp->mtu6 = stream_getl (s); |
|
ifp->bandwidth = stream_getl (s); |
|
#ifdef HAVE_STRUCT_SOCKADDR_DL |
|
stream_get (&ifp->sdl, s, sizeof (ifp->sdl)); |
|
#else |
|
ifp->hw_addr_len = stream_getl (s); |
|
if (ifp->hw_addr_len) |
|
stream_get (ifp->hw_addr, s, ifp->hw_addr_len); |
|
#endif /* HAVE_STRUCT_SOCKADDR_DL */ |
|
|
|
return ifp; |
return ifp; |
} |
} |
|
|
Line 656 zebra_interface_state_read (struct stream *s)
|
Line 683 zebra_interface_state_read (struct stream *s)
|
if (! ifp) |
if (! ifp) |
return NULL; |
return NULL; |
|
|
/* Read interface's index. */ | zebra_interface_if_set_value (s, ifp); |
ifp->ifindex = stream_getl (s); | |
|
|
/* Read interface's value. */ |
|
ifp->status = stream_getc (s); |
|
ifp->flags = stream_getq (s); |
|
ifp->metric = stream_getl (s); |
|
ifp->mtu = stream_getl (s); |
|
ifp->mtu6 = stream_getl (s); |
|
ifp->bandwidth = stream_getl (s); |
|
|
|
return ifp; |
return ifp; |
} |
} |
|
|
Line 715 zebra_interface_if_set_value (struct stream *s, struct
|
Line 733 zebra_interface_if_set_value (struct stream *s, struct
|
ifp->mtu = stream_getl (s); |
ifp->mtu = stream_getl (s); |
ifp->mtu6 = stream_getl (s); |
ifp->mtu6 = stream_getl (s); |
ifp->bandwidth = stream_getl (s); |
ifp->bandwidth = stream_getl (s); |
|
#ifdef HAVE_STRUCT_SOCKADDR_DL |
|
stream_get (&ifp->sdl, s, sizeof (ifp->sdl)); |
|
#else |
|
ifp->hw_addr_len = stream_getl (s); |
|
if (ifp->hw_addr_len) |
|
stream_get (ifp->hw_addr, s, ifp->hw_addr_len); |
|
#endif /* HAVE_STRUCT_SOCKADDR_DL */ |
} |
} |
|
|
static int |
static int |
Line 796 zebra_interface_address_read (int type, struct stream
|
Line 821 zebra_interface_address_read (int type, struct stream
|
static int |
static int |
zclient_read (struct thread *thread) |
zclient_read (struct thread *thread) |
{ |
{ |
int ret; |
|
size_t already; |
size_t already; |
uint16_t length, command; |
uint16_t length, command; |
uint8_t marker, version; |
uint8_t marker, version; |
Line 891 zclient_read (struct thread *thread)
|
Line 915 zclient_read (struct thread *thread)
|
{ |
{ |
case ZEBRA_ROUTER_ID_UPDATE: |
case ZEBRA_ROUTER_ID_UPDATE: |
if (zclient->router_id_update) |
if (zclient->router_id_update) |
ret = (*zclient->router_id_update) (command, zclient, length); | (*zclient->router_id_update) (command, zclient, length); |
break; |
break; |
case ZEBRA_INTERFACE_ADD: |
case ZEBRA_INTERFACE_ADD: |
if (zclient->interface_add) |
if (zclient->interface_add) |
ret = (*zclient->interface_add) (command, zclient, length); | (*zclient->interface_add) (command, zclient, length); |
break; |
break; |
case ZEBRA_INTERFACE_DELETE: |
case ZEBRA_INTERFACE_DELETE: |
if (zclient->interface_delete) |
if (zclient->interface_delete) |
ret = (*zclient->interface_delete) (command, zclient, length); | (*zclient->interface_delete) (command, zclient, length); |
break; |
break; |
case ZEBRA_INTERFACE_ADDRESS_ADD: |
case ZEBRA_INTERFACE_ADDRESS_ADD: |
if (zclient->interface_address_add) |
if (zclient->interface_address_add) |
ret = (*zclient->interface_address_add) (command, zclient, length); | (*zclient->interface_address_add) (command, zclient, length); |
break; |
break; |
case ZEBRA_INTERFACE_ADDRESS_DELETE: |
case ZEBRA_INTERFACE_ADDRESS_DELETE: |
if (zclient->interface_address_delete) |
if (zclient->interface_address_delete) |
ret = (*zclient->interface_address_delete) (command, zclient, length); | (*zclient->interface_address_delete) (command, zclient, length); |
break; |
break; |
case ZEBRA_INTERFACE_UP: |
case ZEBRA_INTERFACE_UP: |
if (zclient->interface_up) |
if (zclient->interface_up) |
ret = (*zclient->interface_up) (command, zclient, length); | (*zclient->interface_up) (command, zclient, length); |
break; |
break; |
case ZEBRA_INTERFACE_DOWN: |
case ZEBRA_INTERFACE_DOWN: |
if (zclient->interface_down) |
if (zclient->interface_down) |
ret = (*zclient->interface_down) (command, zclient, length); | (*zclient->interface_down) (command, zclient, length); |
break; |
break; |
case ZEBRA_IPV4_ROUTE_ADD: |
case ZEBRA_IPV4_ROUTE_ADD: |
if (zclient->ipv4_route_add) |
if (zclient->ipv4_route_add) |
ret = (*zclient->ipv4_route_add) (command, zclient, length); | (*zclient->ipv4_route_add) (command, zclient, length); |
break; |
break; |
case ZEBRA_IPV4_ROUTE_DELETE: |
case ZEBRA_IPV4_ROUTE_DELETE: |
if (zclient->ipv4_route_delete) |
if (zclient->ipv4_route_delete) |
ret = (*zclient->ipv4_route_delete) (command, zclient, length); | (*zclient->ipv4_route_delete) (command, zclient, length); |
break; |
break; |
case ZEBRA_IPV6_ROUTE_ADD: |
case ZEBRA_IPV6_ROUTE_ADD: |
if (zclient->ipv6_route_add) |
if (zclient->ipv6_route_add) |
ret = (*zclient->ipv6_route_add) (command, zclient, length); | (*zclient->ipv6_route_add) (command, zclient, length); |
break; |
break; |
case ZEBRA_IPV6_ROUTE_DELETE: |
case ZEBRA_IPV6_ROUTE_DELETE: |
if (zclient->ipv6_route_delete) |
if (zclient->ipv6_route_delete) |
ret = (*zclient->ipv6_route_delete) (command, zclient, length); | (*zclient->ipv6_route_delete) (command, zclient, length); |
break; |
break; |
default: |
default: |
break; |
break; |
Line 1018 zclient_event (enum event event, struct zclient *zclie
|
Line 1042 zclient_event (enum event event, struct zclient *zclie
|
break; |
break; |
} |
} |
} |
} |
|
|
|
void |
|
zclient_serv_path_set (char *path) |
|
{ |
|
struct stat sb; |
|
|
|
/* reset */ |
|
zclient_serv_path = NULL; |
|
|
|
/* test if `path' is socket. don't set it otherwise. */ |
|
if (stat(path, &sb) == -1) |
|
{ |
|
zlog_warn ("%s: zebra socket `%s' does not exist", __func__, path); |
|
return; |
|
} |
|
|
|
if ((sb.st_mode & S_IFMT) != S_IFSOCK) |
|
{ |
|
zlog_warn ("%s: `%s' is not unix socket, sir", __func__, path); |
|
return; |
|
} |
|
|
|
/* it seems that path is unix socket */ |
|
zclient_serv_path = path; |
|
} |
|
|