diff options
Diffstat (limited to 'zebra')
-rw-r--r-- | zebra/Makefile.in | 2 | ||||
-rw-r--r-- | zebra/zebra_snmp.c | 177 | ||||
-rw-r--r-- | zebra/zserv.c | 176 |
3 files changed, 256 insertions, 99 deletions
diff --git a/zebra/Makefile.in b/zebra/Makefile.in index 620fada4..5383bcb5 100644 --- a/zebra/Makefile.in +++ b/zebra/Makefile.in @@ -183,7 +183,7 @@ all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj -$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --foreign zebra/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status diff --git a/zebra/zebra_snmp.c b/zebra/zebra_snmp.c index d160bfa7..b028c3ec 100644 --- a/zebra/zebra_snmp.c +++ b/zebra/zebra_snmp.c @@ -1,4 +1,4 @@ -/* BGP4 SNMP support +/* FIB SNMP. * Copyright (C) 1999 Kunihiro Ishiguro * * This file is part of GNU Zebra. @@ -90,41 +90,41 @@ u_char * ipCidrNumber (); u_char * ipCidrTable (); struct variable zebra_variables[] = -{ - {0, GAUGE32, RONLY, ipFwNumber, 1, {1}}, - {IPFORWARDDEST, IPADDRESS, RONLY, ipFwTable, 3, {2, 1, 1}}, - {IPFORWARDMASK, IPADDRESS, RONLY, ipFwTable, 3, {2, 1, 2}}, - {IPFORWARDPOLICY, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 3}}, - {IPFORWARDNEXTHOP, IPADDRESS, RONLY, ipFwTable, 3, {2, 1, 4}}, - {IPFORWARDIFINDEX, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 5}}, - {IPFORWARDTYPE, ENUMERATION, RONLY, ipFwTable, 3, {2, 1, 6}}, - {IPFORWARDPROTO, ENUMERATION, RONLY, ipFwTable, 3, {2, 1, 7}}, - {IPFORWARDAGE, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 8}}, - {IPFORWARDINFO, OBJECTIDENTIFIER, RONLY, ipFwTable, 3, {2, 1, 9}}, - {IPFORWARDNEXTHOPAS, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 10}}, - {IPFORWARDMETRIC1, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 11}}, - {IPFORWARDMETRIC2, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 12}}, - {IPFORWARDMETRIC3, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 13}}, - {IPFORWARDMETRIC4, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 14}}, - {IPFORWARDMETRIC5, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 15}}, - {0, GAUGE32, RONLY, ipCidrNumber, 1, {3}}, - {IPCIDRROUTEDEST, IPADDRESS, RONLY, ipCidrTable, 3, {4, 1, 1}}, - {IPCIDRROUTEMASK, IPADDRESS, RONLY, ipCidrTable, 3, {4, 1, 2}}, - {IPCIDRROUTETOS, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 3}}, - {IPCIDRROUTENEXTHOP, IPADDRESS, RONLY, ipCidrTable, 3, {4, 1, 4}}, - {IPCIDRROUTEIFINDEX, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 5}}, - {IPCIDRROUTETYPE, ENUMERATION, RONLY, ipCidrTable, 3, {4, 1, 6}}, - {IPCIDRROUTEPROTO, ENUMERATION, RONLY, ipCidrTable, 3, {4, 1, 7}}, - {IPCIDRROUTEAGE, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 8}}, - {IPCIDRROUTEINFO, OBJECTIDENTIFIER, RONLY, ipCidrTable, 3, {4, 1, 9}}, - {IPCIDRROUTENEXTHOPAS, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 10}}, - {IPCIDRROUTEMETRIC1, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 11}}, - {IPCIDRROUTEMETRIC2, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 12}}, - {IPCIDRROUTEMETRIC3, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 13}}, - {IPCIDRROUTEMETRIC4, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 14}}, - {IPCIDRROUTEMETRIC5, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 15}}, - {IPCIDRROUTESTATUS, ROWSTATUS, RONLY, ipCidrTable, 3, {4, 1, 16}} -}; + { + {0, GAUGE32, RONLY, ipFwNumber, 1, {1}}, + {IPFORWARDDEST, IPADDRESS, RONLY, ipFwTable, 3, {2, 1, 1}}, + {IPFORWARDMASK, IPADDRESS, RONLY, ipFwTable, 3, {2, 1, 2}}, + {IPFORWARDPOLICY, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 3}}, + {IPFORWARDNEXTHOP, IPADDRESS, RONLY, ipFwTable, 3, {2, 1, 4}}, + {IPFORWARDIFINDEX, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 5}}, + {IPFORWARDTYPE, ENUMERATION, RONLY, ipFwTable, 3, {2, 1, 6}}, + {IPFORWARDPROTO, ENUMERATION, RONLY, ipFwTable, 3, {2, 1, 7}}, + {IPFORWARDAGE, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 8}}, + {IPFORWARDINFO, OBJECTIDENTIFIER, RONLY, ipFwTable, 3, {2, 1, 9}}, + {IPFORWARDNEXTHOPAS, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 10}}, + {IPFORWARDMETRIC1, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 11}}, + {IPFORWARDMETRIC2, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 12}}, + {IPFORWARDMETRIC3, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 13}}, + {IPFORWARDMETRIC4, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 14}}, + {IPFORWARDMETRIC5, INTEGER32, RONLY, ipFwTable, 3, {2, 1, 15}}, + {0, GAUGE32, RONLY, ipCidrNumber, 1, {3}}, + {IPCIDRROUTEDEST, IPADDRESS, RONLY, ipCidrTable, 3, {4, 1, 1}}, + {IPCIDRROUTEMASK, IPADDRESS, RONLY, ipCidrTable, 3, {4, 1, 2}}, + {IPCIDRROUTETOS, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 3}}, + {IPCIDRROUTENEXTHOP, IPADDRESS, RONLY, ipCidrTable, 3, {4, 1, 4}}, + {IPCIDRROUTEIFINDEX, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 5}}, + {IPCIDRROUTETYPE, ENUMERATION, RONLY, ipCidrTable, 3, {4, 1, 6}}, + {IPCIDRROUTEPROTO, ENUMERATION, RONLY, ipCidrTable, 3, {4, 1, 7}}, + {IPCIDRROUTEAGE, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 8}}, + {IPCIDRROUTEINFO, OBJECTIDENTIFIER, RONLY, ipCidrTable, 3, {4, 1, 9}}, + {IPCIDRROUTENEXTHOPAS, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 10}}, + {IPCIDRROUTEMETRIC1, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 11}}, + {IPCIDRROUTEMETRIC2, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 12}}, + {IPCIDRROUTEMETRIC3, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 13}}, + {IPCIDRROUTEMETRIC4, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 14}}, + {IPCIDRROUTEMETRIC5, INTEGER32, RONLY, ipCidrTable, 3, {4, 1, 15}}, + {IPCIDRROUTESTATUS, ROWSTATUS, RONLY, ipCidrTable, 3, {4, 1, 16}} + }; u_char * @@ -132,16 +132,21 @@ ipFwNumber (struct variable *v, oid objid[], size_t *objid_len, int exact, size_t *val_len, WriteMethod **write_method) { static int result; - struct route_node *np; + struct route_table *table; + struct route_node *rn; struct rib *rib; if (smux_header_generic(v, objid, objid_len, exact, val_len, write_method) == MATCH_FAILED) return NULL; + table = vrf_table (AFI_IP, SAFI_UNICAST, 0); + if (! table) + return NULL; + /* Return number of routing entries. */ result = 0; - for (np = route_top (rib_table_ipv4); np; np = route_next (np)) - for (rib = np->info; rib; rib = rib->next) + for (rn = route_top (table); rn; rn = route_next (rn)) + for (rib = rn->info; rib; rib = rib->next) result++; return (u_char *)&result; @@ -149,19 +154,24 @@ ipFwNumber (struct variable *v, oid objid[], size_t *objid_len, u_char * ipCidrNumber (struct variable *v, oid objid[], size_t *objid_len, - int exact, size_t *val_len, WriteMethod **write_method) + int exact, size_t *val_len, WriteMethod **write_method) { static int result; - struct route_node *np; + struct route_table *table; + struct route_node *rn; struct rib *rib; if (smux_header_generic(v, objid, objid_len, exact, val_len, write_method) == MATCH_FAILED) return NULL; + table = vrf_table (AFI_IP, SAFI_UNICAST, 0); + if (! table) + return 0; + /* Return number of routing entries. */ result = 0; - for (np = route_top (rib_table_ipv4); np; np = route_next (np)) - for (rib = np->info; rib; rib = rib->next) + for (rn = route_top (table); rn; rn = route_next (rn)) + for (rib = rn->info; rib; rib = rib->next) result++; return (u_char *)&result; @@ -193,16 +203,16 @@ in_addr_add(u_char *p, int num) for (i = 3; 0 <= i; i--) { p--; if (*p + num > 255) { - *p += num; - num = 1; + *p += num; + num = 1; } else { - *p += num; - return 1; + *p += num; + return 1; } } if (ip0 > *p) { - /* ip + num > 0xffffffff */ - return 0; + /* ip + num > 0xffffffff */ + return 0; } return 1; @@ -212,26 +222,26 @@ int proto_trans(int type) { switch (type) { - case ZEBRA_ROUTE_SYSTEM: - return 1; /* other */ - case ZEBRA_ROUTE_KERNEL: - return 1; /* other */ - case ZEBRA_ROUTE_CONNECT: - return 2; /* local interface */ - case ZEBRA_ROUTE_STATIC: - return 3; /* static route */ - case ZEBRA_ROUTE_RIP: - return 8; /* rip */ - case ZEBRA_ROUTE_RIPNG: - return 1; /* shouldn't happen */ - case ZEBRA_ROUTE_OSPF: - return 13; /* ospf */ - case ZEBRA_ROUTE_OSPF6: - return 1; /* shouldn't happen */ - case ZEBRA_ROUTE_BGP: - return 14; /* bgp */ - default: - return 1; /* other */ + case ZEBRA_ROUTE_SYSTEM: + return 1; /* other */ + case ZEBRA_ROUTE_KERNEL: + return 1; /* other */ + case ZEBRA_ROUTE_CONNECT: + return 2; /* local interface */ + case ZEBRA_ROUTE_STATIC: + return 3; /* static route */ + case ZEBRA_ROUTE_RIP: + return 8; /* rip */ + case ZEBRA_ROUTE_RIPNG: + return 1; /* shouldn't happen */ + case ZEBRA_ROUTE_OSPF: + return 13; /* ospf */ + case ZEBRA_ROUTE_OSPF6: + return 1; /* shouldn't happen */ + case ZEBRA_ROUTE_BGP: + return 14; /* bgp */ + default: + return 1; /* other */ } } @@ -283,6 +293,7 @@ get_fwtable_route_node(struct variable *v, oid objid[], size_t *objid_len, int exact, struct route_node **np, struct rib **rib) { struct in_addr dest; + struct route_table *table; struct route_node *np2; struct rib *rib2; int proto; @@ -291,7 +302,7 @@ get_fwtable_route_node(struct variable *v, oid objid[], size_t *objid_len, u_char *pnt; int i; -/* Init index variables */ + /* Init index variables */ pnt = (u_char *) &dest; for (i = 0; i < 4; i++) @@ -304,19 +315,23 @@ get_fwtable_route_node(struct variable *v, oid objid[], size_t *objid_len, proto = 0; policy = 0; -/* Init return variables */ + /* Init return variables */ *np = NULL; *rib = NULL; -/* Short circuit exact matches of wrong length */ + /* Short circuit exact matches of wrong length */ if (exact && (*objid_len != v->namelen + 10)) return; -/* Get INDEX information out of OID. - * ipForwardDest, ipForwardProto, ipForwardPolicy, ipForwardNextHop - */ + table = vrf_table (AFI_IP, SAFI_UNICAST, 0); + if (! table) + return; + + /* Get INDEX information out of OID. + * ipForwardDest, ipForwardProto, ipForwardPolicy, ipForwardNextHop + */ if (*objid_len > v->namelen) oid2in_addr (objid + v->namelen, MIN(4, *objid_len - v->namelen), &dest); @@ -329,7 +344,7 @@ get_fwtable_route_node(struct variable *v, oid objid[], size_t *objid_len, if (*objid_len > v->namelen + 6) oid2in_addr (objid + v->namelen + 6, MIN(4, *objid_len - v->namelen - 6), - &nexthop); + &nexthop); /* Apply GETNEXT on not exact search */ @@ -345,14 +360,14 @@ get_fwtable_route_node(struct variable *v, oid objid[], size_t *objid_len, { if (policy) /* Not supported (yet?) */ return; - for (*np = route_top (rib_table_ipv4); *np; *np = route_next (*np)) + for (*np = route_top (table); *np; *np = route_next (*np)) { if (!in_addr_cmp(&(*np)->p.u.prefix, (u_char *)&dest)) { for (*rib = (*np)->info; *rib; *rib = (*rib)->next) { if (!in_addr_cmp((u_char *)&(*rib)->nexthop->gate.ipv4, - (u_char *)&nexthop)) + (u_char *)&nexthop)) if (proto == proto_trans((*rib)->type)) return; } @@ -361,9 +376,9 @@ get_fwtable_route_node(struct variable *v, oid objid[], size_t *objid_len, return; } -/* Search next best entry */ + /* Search next best entry */ - for (np2 = route_top (rib_table_ipv4); np2; np2 = route_next (np2)) + for (np2 = route_top (table); np2; np2 = route_next (np2)) { /* Check destination first */ @@ -527,7 +542,7 @@ ipFwTable (struct variable *v, oid objid[], size_t *objid_len, u_char * ipCidrTable (struct variable *v, oid objid[], size_t *objid_len, - int exact, size_t *val_len, WriteMethod **write_method) + int exact, size_t *val_len, WriteMethod **write_method) { switch (v->magic) { diff --git a/zebra/zserv.c b/zebra/zserv.c index 47114ab3..aa1c8342 100644 --- a/zebra/zserv.c +++ b/zebra/zserv.c @@ -49,6 +49,8 @@ list client_list; int rtm_table_default = 0; void zebra_event (enum event event, int sock, struct zserv *client); + +extern struct thread_master *master; /* For logging of zebra meesages. */ char *zebra_command_str [] = @@ -74,6 +76,103 @@ char *zebra_command_str [] = "ZEBRA_IPV6_IMPORT_LOOKUP" }; +struct zebra_message_queue +{ + struct nsm_message_queue *next; + struct nsm_message_queue *prev; + + u_char *buf; + u_int16_t length; + u_int16_t written; +}; + +struct thread *t_write; +struct fifo message_queue; + +int +zebra_server_dequeue (struct thread *t) +{ + int sock; + int nbytes; + struct zebra_message_queue *queue; + + sock = THREAD_FD (t); + t_write = NULL; + + queue = (struct zebra_message_queue *) FIFO_HEAD (&message_queue); + if (queue) + { + nbytes = write (sock, queue->buf + queue->written, + queue->length - queue->written); + + if (nbytes <= 0) + { + if (errno != EAGAIN) + return -1; + } + else if (nbytes != (queue->length - queue->written)) + { + queue->written += nbytes; + } + else + { + FIFO_DEL (queue); + XFREE (MTYPE_TMP, queue->buf); + XFREE (MTYPE_TMP, queue); + } + } + + if (FIFO_TOP (&message_queue)) + THREAD_WRITE_ON (master, t_write, zebra_server_dequeue, NULL, sock); + + return 0; +} + +/* Enqueu message. */ +void +zebra_server_enqueue (int sock, u_char *buf, unsigned long length, + unsigned long written) +{ + struct zebra_message_queue *queue; + + queue = XCALLOC (MTYPE_TMP, sizeof (struct zebra_message_queue)); + queue->buf = XMALLOC (MTYPE_TMP, length); + memcpy (queue->buf, buf, length); + queue->length = length; + queue->written = written; + + FIFO_ADD (&message_queue, queue); + + THREAD_WRITE_ON (master, t_write, zebra_server_dequeue, NULL, sock); +} + +int +zebra_server_send_message (int sock, u_char *buf, unsigned long length) +{ + int nbytes; + + if (FIFO_TOP (&message_queue)) + { + zebra_server_enqueue (sock, buf, length, 0); + return 0; + } + + /* Send message. */ + nbytes = write (sock, buf, length); + + if (nbytes <= 0) + { + if (errno == EAGAIN) + zebra_server_enqueue (sock, buf, length, 0); + else + return -1; + } + else if (nbytes != length) + zebra_server_enqueue (sock, buf, length, nbytes); + + return 0; +} + /* Interface is added. Send ZEBRA_INTERFACE_ADD to client. */ int zsend_interface_add (struct zserv *client, struct interface *ifp) @@ -111,7 +210,9 @@ zsend_interface_add (struct zserv *client, struct interface *ifp) /* Write packet size. */ stream_putw_at (s, 0, stream_get_endp (s)); - return writen (client->sock, s->data, stream_get_endp (s)); + zebra_server_send_message (client->sock, s->data, stream_get_endp (s)); + + return 0; } /* Interface deletion from zebra daemon. */ @@ -142,7 +243,9 @@ zsend_interface_delete (struct zserv *client, struct interface *ifp) /* Write packet length. */ stream_putw_at (s, 0, stream_get_endp (s)); - return writen (client->sock, s->data, stream_get_endp (s)); + zebra_server_send_message (client->sock, s->data, stream_get_endp (s)); + + return 0; } /* Interface address is added. Send ZEBRA_INTERFACE_ADDRESS_ADD to the @@ -188,7 +291,9 @@ zsend_interface_address_add (struct zserv *client, struct interface *ifp, /* Write packet size. */ stream_putw_at (s, 0, stream_get_endp (s)); - return writen (client->sock, s->data, stream_get_endp (s)); + zebra_server_send_message (client->sock, s->data, stream_get_endp (s)); + + return 0; } /* Interface address is deleted. Send ZEBRA_INTERFACE_ADDRESS_DELETE @@ -232,7 +337,9 @@ zsend_interface_address_delete (struct zserv *client, struct interface *ifp, /* Write packet size. */ stream_putw_at (s, 0, stream_get_endp (s)); - return writen (client->sock, s->data, stream_get_endp (s)); + zebra_server_send_message (client->sock, s->data, stream_get_endp (s)); + + return 0; } int @@ -264,7 +371,9 @@ zsend_interface_up (struct zserv *client, struct interface *ifp) /* Write packet size. */ stream_putw_at (s, 0, stream_get_endp (s)); - return writen (client->sock, s->data, stream_get_endp (s)); + zebra_server_send_message (client->sock, s->data, stream_get_endp (s)); + + return 0; } int @@ -296,7 +405,9 @@ zsend_interface_down (struct zserv *client, struct interface *ifp) /* Write packet size. */ stream_putw_at (s, 0, stream_get_endp (s)); - return writen (client->sock, s->data, stream_get_endp (s)); + zebra_server_send_message (client->sock, s->data, stream_get_endp (s)); + + return 0; } int @@ -353,7 +464,9 @@ zsend_ipv4_add_multipath (struct zserv *client, struct prefix *p, /* Write packet size. */ stream_putw_at (s, 0, stream_get_endp (s)); - return writen (client->sock, s->data, stream_get_endp (s)); + zebra_server_send_message (client->sock, s->data, stream_get_endp (s)); + + return 0; } int @@ -407,7 +520,9 @@ zsend_ipv4_delete_multipath (struct zserv *client, struct prefix *p, /* Write packet size. */ stream_putw_at (s, 0, stream_get_endp (s)); - return writen (client->sock, s->data, stream_get_endp (s)); + zebra_server_send_message (client->sock, s->data, stream_get_endp (s)); + + return 0; } int @@ -446,7 +561,9 @@ zsend_ipv4_add (struct zserv *client, int type, int flags, /* Write packet size. */ stream_putw_at (s, 0, stream_get_endp (s)); - return writen (client->sock, s->data, stream_get_endp (s)); + zebra_server_send_message (client->sock, s->data, stream_get_endp (s)); + + return 0; } int @@ -485,7 +602,9 @@ zsend_ipv4_delete (struct zserv *client, int type, int flags, /* Write packet size. */ stream_putw_at (s, 0, stream_get_endp (s)); - return writen (client->sock, s->data, stream_get_endp (s)); + zebra_server_send_message (client->sock, s->data, stream_get_endp (s)); + + return 0; } #ifdef HAVE_IPV6 @@ -525,7 +644,9 @@ zsend_ipv6_add (struct zserv *client, int type, int flags, /* Write packet size. */ stream_putw_at (s, 0, stream_get_endp (s)); - return writen (client->sock, s->data, stream_get_endp (s)); + zebra_server_send_message (client->sock, s->data, stream_get_endp (s)); + + return 0; } int @@ -581,7 +702,9 @@ zsend_ipv6_add_multipath (struct zserv *client, struct prefix *p, /* Write packet size. */ stream_putw_at (s, 0, stream_get_endp (s)); - return writen (client->sock, s->data, stream_get_endp (s)); + zebra_server_send_message (client->sock, s->data, stream_get_endp (s)); + + return 0; } int @@ -620,7 +743,9 @@ zsend_ipv6_delete (struct zserv *client, int type, int flags, /* Write packet size. */ stream_putw_at (s, 0, stream_get_endp (s)); - return writen (client->sock, s->data, stream_get_endp (s)); + zebra_server_send_message (client->sock, s->data, stream_get_endp (s)); + + return 0; } int @@ -673,7 +798,9 @@ zsend_ipv6_delete_multipath (struct zserv *client, struct prefix *p, /* Write packet size. */ stream_putw_at (s, 0, stream_get_endp (s)); - return writen (client->sock, s->data, stream_get_endp (s)); + zebra_server_send_message (client->sock, s->data, stream_get_endp (s)); + + return 0; } int @@ -734,7 +861,9 @@ zsend_ipv6_nexthop_lookup (struct zserv *client, struct in6_addr *addr) stream_putw_at (s, 0, stream_get_endp (s)); - return writen (client->sock, s->data, stream_get_endp (s)); + zebra_server_send_message (client->sock, s->data, stream_get_endp (s)); + + return 0; } #endif /* HAVE_IPV6 */ @@ -791,7 +920,9 @@ zsend_ipv4_nexthop_lookup (struct zserv *client, struct in_addr addr) stream_putw_at (s, 0, stream_get_endp (s)); - return writen (client->sock, s->data, stream_get_endp (s)); + zebra_server_send_message (client->sock, s->data, stream_get_endp (s)); + + return 0; } int @@ -847,7 +978,9 @@ zsend_ipv4_import_lookup (struct zserv *client, struct prefix_ipv4 *p) stream_putw_at (s, 0, stream_get_endp (s)); - return writen (client->sock, s->data, stream_get_endp (s)); + zebra_server_send_message (client->sock, s->data, stream_get_endp (s)); + + return 0; } /* Register zebra server interface information. Send current all @@ -1430,6 +1563,7 @@ zebra_write (struct thread *thread) int zebra_accept (struct thread *thread) { + int val; int accept_sock; int client_sock; struct sockaddr_in client; @@ -1446,6 +1580,11 @@ zebra_accept (struct thread *thread) return -1; } + /* Make client socket non-blocking. */ + + val = fcntl (client_sock, F_GETFL, 0); + fcntl (client_sock, F_SETFL, (val | O_NONBLOCK)); + /* Create new zebra client. */ zebra_client_create (client_sock); @@ -1803,4 +1942,7 @@ zebra_init () install_element (ENABLE_NODE, &show_ipv6_forwarding_cmd); install_element (CONFIG_NODE, &no_ipv6_forwarding_cmd); #endif /* HAVE_IPV6 */ + + FIFO_INIT(&message_queue); + t_write = NULL; } |