本文整理汇总了C++中zlog_err函数的典型用法代码示例。如果您正苦于以下问题:C++ zlog_err函数的具体用法?C++ zlog_err怎么用?C++ zlog_err使用的例子?那么, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了zlog_err函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: sockopt_tcp_signature
//.........这里部分代码省略.........
int ret;
#ifndef GNU_LINUX
/*
* XXX Need to do PF_KEY operation here to add/remove an SA entry,
* and add/remove an SP entry for this peer's packet flows also.
*/
int md5sig = password && *password ? 1 : 0;
#else
struct {
struct {
unsigned short ss_family;
char __data[128 - sizeof(unsigned short)];
} tcpm_addr; /* address associated */
__u16 __tcpm_pad1; /* zero */
__u16 tcpm_keylen; /* key length */
__u32 __tcpm_pad2; /* zero */
__u8 tcpm_key[80]; /* key (binary) */
} md5sig;
//struct tcp_md5sig md5sig;
int keylen = 0;
union sockunion *su2, *susock;
if(NULL != password)
keylen = strlen(password) ;
/* Figure out whether the socket and the sockunion are the same family..
* adding AF_INET to AF_INET6 needs to be v4 mapped, you'd think..
*/
susock = XCALLOC (MTYPE_SOCKUNION, sizeof (union sockunion));
if(NULL == susock)
{
return -1;
}
if (!( sockunion_getsockname (sock, susock)))
return -1;
if (susock->sa.sa_family == su->sa.sa_family)
su2 = su;
else
{
/* oops.. */
su2 = susock;
if (su2->sa.sa_family == AF_INET)
{
sockunion_free (susock);
return 0;
}
#ifdef HAVE_IPV6
/* If this does not work, then all users of this sockopt will need to
* differentiate between IPv4 and IPv6, and keep seperate sockets for
* each.
*
* Sadly, it doesn't seem to work at present. It's unknown whether
* this is a bug or not.
*/
if (su2->sa.sa_family == AF_INET6
&& su->sa.sa_family == AF_INET)
{
su2->sin6.sin6_family = AF_INET6;
/* V4Map the address */
memset (&su2->sin6.sin6_addr, 0, sizeof (struct in6_addr));
su2->sin6.sin6_addr.s6_addr32[2] = htonl(0xffff);
memcpy (&su2->sin6.sin6_addr.s6_addr32[3], &su->sin.sin_addr, 4);
}
#endif
}
memset (&md5sig, 0, sizeof (md5sig));
memcpy (&md5sig.tcpm_addr, su2, sizeof (*su2));
md5sig.tcpm_keylen = keylen;
if (keylen)
memcpy (md5sig.tcpm_key, password, keylen);
sockunion_free (susock);
#endif /* GNU_LINUX */
if ((ret = setsockopt (sock, IPPROTO_TCP, TCP_MD5SIG, &md5sig, sizeof md5sig)) < 0)
{
/* ENOENT is harmless. It is returned when we clear a password for which
one was not previously set. */
if (ENOENT == errno)
ret = 0;
else
zlog_err ("sockopt_tcp_signature: setsockopt(%d): %s",
sock, safe_strerror(errno));
}
return ret;
#else /* HAVE_TCP_MD5SIG */
return -2;
#endif /* !HAVE_TCP_MD5SIG */
}
示例2: pim_init
void pim_init()
{
srandom(time(NULL));
if (!inet_aton(PIM_ALL_PIM_ROUTERS, &qpim_all_pim_routers_addr)) {
zlog_err("%s %s: could not solve %s to group address: errno=%d: %s",
__FILE__, __PRETTY_FUNCTION__,
PIM_ALL_PIM_ROUTERS, errno, safe_strerror(errno));
zassert(0);
return;
}
qpim_channel_oil_list = list_new();
if (!qpim_channel_oil_list) {
zlog_err("%s %s: failure: channel_oil_list=list_new()",
__FILE__, __PRETTY_FUNCTION__);
return;
}
qpim_channel_oil_list->del = (void (*)(void *)) pim_channel_oil_free;
qpim_upstream_list = list_new();
if (!qpim_upstream_list) {
zlog_err("%s %s: failure: upstream_list=list_new()",
__FILE__, __PRETTY_FUNCTION__);
pim_free();
return;
}
qpim_upstream_list->del = (void (*)(void *)) pim_upstream_free;
qpim_static_route_list = list_new();
if (!qpim_static_route_list) {
zlog_err("%s %s: failure: static_route_list=list_new()",
__FILE__, __PRETTY_FUNCTION__);
return;
}
qpim_static_route_list->del = (void (*)(void *)) pim_static_route_free;
qpim_mroute_socket_fd = -1; /* mark mroute as disabled */
qpim_mroute_oif_highest_vif_index = -1;
zassert(!qpim_debugs);
zassert(!PIM_MROUTE_IS_ENABLED);
qpim_inaddr_any.s_addr = PIM_NET_INADDR_ANY;
/*
RFC 4601: 4.6.3. Assert Metrics
assert_metric
infinite_assert_metric() {
return {1,infinity,infinity,0}
}
*/
qpim_infinite_assert_metric.rpt_bit_flag = 1;
qpim_infinite_assert_metric.metric_preference = PIM_ASSERT_METRIC_PREFERENCE_MAX;
qpim_infinite_assert_metric.route_metric = PIM_ASSERT_ROUTE_METRIC_MAX;
qpim_infinite_assert_metric.ip_address = qpim_inaddr_any;
pim_cmd_init();
pim_ssmpingd_init();
}
示例3: gen_spgrid_topology
/* generator of layered networks for the shortest paths problem;
extended DIMACS format for output */
int
gen_spgrid_topology (struct vty *vty, struct list *topology)
{
/* ----- ajusting parameters ----- */
/* spanning */
if ( cl < cm ) { lx = cl; cl = cm; cm = lx; }
/* additional arcs */
if ( al < am ) { lx = al; al = am; am = lx; }
/* interlayered arcs */
if ( il < im ) { lx = il; il = im; im = lx; }
/* potential parameters */
if ( p_f )
{
if ( ! pl_f ) pl = il;
if ( ! pm_f ) pm = im;
if ( pl < pm ) { lx = pl; pl = pm; pm = lx; }
}
/* number of nodes and arcs */
n = (double)X *(double)Y + 1;
m = (double)Y; /* arcs from source */
switch ( cw )
{
case PATH:
mc = (double)Y - 1;
break;
case CYCLE:
mc = (double)Y;
break;
case DOUBLE_CYCLE:
mc = 2*(double)Y;
}
m += (double)X * (double)mc; /* spanning arcs */
m += (double)X * (double)ax; /* additional arcs */
/* interlayered arcs */
for ( x = 0; x < X; x ++ )
{
dl = ( ( X - x - 1 ) + ( ih - 1 ) ) / ih;
if ( dl > ix ) dl = ix;
m += (double)Y * (double)dl;
}
/* artifical source parameters */
if ( s_f ) {
m += n; n ++ ;
if ( ! sm_f ) sm = sl;
if ( sl < sm ) { lx = sl; sl = sm; sm = lx; }
}
if ( n >= (double)LONG_MAX || m >= (double)LONG_MAX )
{
zlog_err ("Too large problem. It can't be generated\n");
exit (4);
}
else
{
n0 = (long)n; m0 = (long)m;
}
if ( ip_f )
mess = (long*) calloc ( Y, sizeof ( long ) );
/* printing title */
zlog_info ("Generating topology for ISIS");
source = ( s_f ) ? n0-1 : n0;
if ( p_f ) /* generating potentials */ {
p = (long*) calloc ( n0+1, sizeof (long) );
seed1 = 2*seed + 1;
init_rand ( seed1);
pl = pl - pm + 1;
for ( x = 0; x < X; x ++ )
for ( y = 0; y < Y; y ++ ) {
p_t = pm + nrand ( pl );
if ( pn_f ) p_t *= (long) ( (1 + x) * pn );
if ( ps_f ) p_t *= (long) ( (1 + x) * ( (1 + x) * ps ));
p[ NODE ( x, y ) ] = p_t;
}
p[n0] = 0;
if ( s_f ) p[n0-1] = 0;
}
if ( s_f ) /* additional arcs from artifical source */
{
seed2 = 3*seed + 1;
init_rand ( seed2 );
//.........这里部分代码省略.........
示例4: buffer_flush_available
/* This function (unlike other buffer_flush* functions above) is designed
to work with non-blocking sockets. It does not attempt to write out
all of the queued data, just a "big" chunk. It returns 0 if it was
able to empty out the buffers completely, 1 if more flushing is
required later, or -1 on a fatal write error. */
buffer_status_t
buffer_flush_available(struct buffer *b, int fd)
{
/* These are just reasonable values to make sure a significant amount of
data is written. There's no need to go crazy and try to write it all
in one shot. */
#ifdef IOV_MAX
#define MAX_CHUNKS ((IOV_MAX >= 16) ? 16 : IOV_MAX)
#else
#define MAX_CHUNKS 16
#endif
#define MAX_FLUSH 131072
struct buffer_data *d;
size_t written;
struct iovec iov[MAX_CHUNKS];
size_t iovcnt = 0;
size_t nbyte = 0;
for (d = b->head; d && (iovcnt < MAX_CHUNKS) && (nbyte < MAX_FLUSH);
d = d->next, iovcnt++)
{
iov[iovcnt].iov_base = d->data+d->sp;
nbyte += (iov[iovcnt].iov_len = d->cp-d->sp);
}
if (!nbyte)
/* No data to flush: should we issue a warning message? */
return BUFFER_EMPTY;
/* only place where written should be sign compared */
if ((ssize_t)(written = writev(fd,iov,iovcnt)) < 0)
{
if (ERRNO_IO_RETRY(errno))
/* Calling code should try again later. */
return BUFFER_PENDING;
zlog_warn("%s: write error on fd %d: %s",
__func__, fd, safe_strerror(errno));
return BUFFER_ERROR;
}
/* Free printed buffer data. */
while (written > 0)
{
struct buffer_data *d;
if (!(d = b->head))
{
zlog_err("%s: corruption detected: buffer queue empty, "
"but written is %lu", __func__, (u_long)written);
break;
}
if (written < d->cp-d->sp)
{
d->sp += written;
return BUFFER_PENDING;
}
written -= (d->cp-d->sp);
if (!(b->head = d->next))
b->tail = NULL;
BUFFER_DATA_FREE(d);
}
return b->head ? BUFFER_PENDING : BUFFER_EMPTY;
#undef MAX_CHUNKS
#undef MAX_FLUSH
}
示例5: ifm_read
/*
* Handle struct if_msghdr obtained from reading routing socket or
* sysctl (from interface_list). There may or may not be sockaddrs
* present after the header.
*/
int
ifm_read (struct if_msghdr *ifm)
{
struct interface *ifp = NULL;
char ifname[IFNAMSIZ];
short ifnlen = 0;
caddr_t *cp;
/* terminate ifname at head (for strnlen) and tail (for safety) */
ifname[IFNAMSIZ - 1] = '\0';
/* paranoia: sanity check structure */
if (ifm->ifm_msglen < sizeof(struct if_msghdr))
{
zlog_err ("ifm_read: ifm->ifm_msglen %d too short\n",
ifm->ifm_msglen);
return -1;
}
/*
* Check for a sockaddr_dl following the message. First, point to
* where a socakddr might be if one follows the message.
*/
cp = (void *)(ifm + 1);
#ifdef SUNOS_5
/*
* XXX This behavior should be narrowed to only the kernel versions
* for which the structures returned do not match the headers.
*
* if_msghdr_t on 64 bit kernels in Solaris 9 and earlier versions
* is 12 bytes larger than the 32 bit version.
*/
if (((struct sockaddr *) cp)->sa_family == AF_UNSPEC)
cp = cp + 12;
#endif
RTA_ADDR_GET (NULL, RTA_DST, ifm->ifm_addrs, cp);
RTA_ADDR_GET (NULL, RTA_GATEWAY, ifm->ifm_addrs, cp);
RTA_ATTR_GET (NULL, RTA_NETMASK, ifm->ifm_addrs, cp);
RTA_ADDR_GET (NULL, RTA_GENMASK, ifm->ifm_addrs, cp);
RTA_NAME_GET (ifname, RTA_IFP, ifm->ifm_addrs, cp, ifnlen);
RTA_ADDR_GET (NULL, RTA_IFA, ifm->ifm_addrs, cp);
RTA_ADDR_GET (NULL, RTA_AUTHOR, ifm->ifm_addrs, cp);
RTA_ADDR_GET (NULL, RTA_BRD, ifm->ifm_addrs, cp);
if (IS_ZEBRA_DEBUG_KERNEL)
zlog_debug ("%s: sdl ifname %s", __func__, (ifnlen ? ifname : "(nil)"));
/*
* Look up on ifindex first, because ifindices are the primary handle for
* interfaces across the user/kernel boundary, for most systems. (Some
* messages, such as up/down status changes on NetBSD, do not include a
* sockaddr_dl).
*/
if ( (ifp = if_lookup_by_index (ifm->ifm_index)) != NULL )
{
/* we have an ifp, verify that the name matches as some systems,
* eg Solaris, have a 1:many association of ifindex:ifname
* if they dont match, we dont have the correct ifp and should
* set it back to NULL to let next check do lookup by name
*/
if (ifnlen && (strncmp (ifp->name, ifname, IFNAMSIZ) != 0) )
{
if (IS_ZEBRA_DEBUG_KERNEL)
zlog_debug ("%s: ifp name %s doesnt match sdl name %s",
__func__, ifp->name, ifname);
ifp = NULL;
}
}
/*
* If we dont have an ifp, try looking up by name. Particularly as some
* systems (Solaris) have a 1:many mapping of ifindex:ifname - the ifname
* is therefore our unique handle to that interface.
*
* Interfaces specified in the configuration file for which the ifindex
* has not been determined will have ifindex == IFINDEX_INTERNAL, and such
* interfaces are found by this search, and then their ifindex values can
* be filled in.
*/
if ( (ifp == NULL) && ifnlen)
ifp = if_lookup_by_name (ifname);
/*
* If ifp still does not exist or has an invalid index (IFINDEX_INTERNAL),
* create or fill in an interface.
*/
if ((ifp == NULL) || (ifp->ifindex == IFINDEX_INTERNAL))
{
/*
* To create or fill in an interface, a sockaddr_dl (via
* RTA_IFP) is required.
*/
if (!ifnlen)
//.........这里部分代码省略.........
示例6: main
//.........这里部分代码省略.........
/* Make master thread emulator. */
zebrad.master = thread_master_create ();
/* privs initialise */
zprivs_init (&zserv_privs);
/* Vty related initialize. */
signal_init (zebrad.master, Q_SIGC(zebra_signals), zebra_signals);
cmd_init (1);
vty_init (zebrad.master);
memory_init ();
/* Zebra related initialize. */
zebra_init ();
rib_init ();
zebra_if_init ();
zebra_debug_init ();
router_id_init();
zebra_vty_init ();
access_list_init ();
prefix_list_init ();
rtadv_init ();
#ifdef HAVE_IRDP
irdp_init();
#endif
/* For debug purpose. */
/* SET_FLAG (zebra_debug_event, ZEBRA_DEBUG_EVENT); */
/* Make kernel routing socket. */
kernel_init ();
interface_list ();
route_read ();
/* Sort VTY commands. */
sort_node ();
#ifdef HAVE_SNMP
zebra_snmp_init ();
#endif /* HAVE_SNMP */
/* Process the configuration file. Among other configuration
* directives we can meet those installing static routes. Such
* requests will not be executed immediately, but queued in
* zebra->ribq structure until we enter the main execution loop.
* The notifications from kernel will show originating PID equal
* to that after daemon() completes (if ever called).
*/
vty_read_config (config_file, config_default);
/* Don't start execution if we are in dry-run mode */
if (dryrun)
return(0);
/* Clean up rib. */
rib_weed_tables ();
/* Exit when zebra is working in batch mode. */
if (batch_mode)
exit (0);
/* Daemonize. */
if (daemon_mode && daemon (0, 0) < 0)
{
zlog_err("Zebra daemon failed: %s", strerror(errno));
exit (1);
}
/* Output pid of zebra. */
pid_output (pid_file);
/* After we have successfully acquired the pidfile, we can be sure
* about being the only copy of zebra process, which is submitting
* changes to the FIB.
* Clean up zebra-originated routes. The requests will be sent to OS
* immediately, so originating PID in notifications from kernel
* will be equal to the current getpid(). To know about such routes,
* we have to have route_read() called before.
*/
if (! keep_kernel_mode)
rib_sweep_route ();
/* Needed for BSD routing socket. */
pid = getpid ();
/* This must be done only after locking pidfile (bug #403). */
zebra_zserv_socket_init (zserv_path);
/* Make vty server socket. */
vty_serv_sock (vty_addr, vty_port, ZEBRA_VTYSH_PATH);
/* Print banner. */
zlog_notice ("Zebra %s starting: [email protected]%d", QUAGGA_VERSION, vty_port);
while (thread_fetch (zebrad.master, &thread))
thread_call (&thread);
/* Not reached... */
return 0;
}
示例7: zlookup_read_ipv6
static struct bgp_nexthop_cache *
zlookup_read_ipv6 (void)
{
struct stream *s;
uint16_t length;
u_char version, marker;
struct in6_addr raddr;
uint32_t metric;
int i;
u_char nexthop_num;
struct nexthop *nexthop;
struct bgp_nexthop_cache *bnc;
s = zlookup->ibuf;
stream_reset (s);
/* XXX: ignoring nbytes, see also zread_lookup */
stream_read (s, zlookup->sock, 2);
length = stream_getw (s);
stream_read (s, zlookup->sock, length - 2);
marker = stream_getc (s);
version = stream_getc (s);
if (version != ZSERV_VERSION || marker != ZEBRA_HEADER_MARKER)
{
zlog_err("%s: socket %d version mismatch, marker %d, version %d",
__func__, zlookup->sock, marker, version);
return NULL;
}
/* XXX: ignoring command */
stream_getw (s);
/* XXX: not actually doing anything with raddr */
stream_get (&raddr, s, 16);
metric = stream_getl (s);
nexthop_num = stream_getc (s);
if (nexthop_num)
{
bnc = bnc_new ();
bnc->valid = 1;
bnc->metric = metric;
bnc->nexthop_num = nexthop_num;
for (i = 0; i < nexthop_num; i++)
{
nexthop = XCALLOC (MTYPE_NEXTHOP, sizeof (struct nexthop));
nexthop->type = stream_getc (s);
switch (nexthop->type)
{
case ZEBRA_NEXTHOP_IPV6:
stream_get (&nexthop->gate.ipv6, s, 16);
break;
case ZEBRA_NEXTHOP_IPV6_IFINDEX:
case ZEBRA_NEXTHOP_IPV6_IFNAME:
stream_get (&nexthop->gate.ipv6, s, 16);
nexthop->ifindex = stream_getl (s);
break;
case ZEBRA_NEXTHOP_IFINDEX:
case ZEBRA_NEXTHOP_IFNAME:
nexthop->ifindex = stream_getl (s);
break;
default:
/* do nothing */
break;
}
bnc_nexthop_add (bnc, nexthop);
}
}
else
return NULL;
return bnc;
}
示例8: if_delete_update
/* Handle an interface delete event */
void
if_delete_update (struct interface *ifp)
{
struct connected *ifc;
struct prefix *p;
struct route_node *rn;
struct zebra_if *zebra_if;
zebra_if = ifp->info;
if (if_is_up(ifp))
{
zlog_err ("interface %s index %d is still up while being deleted.",
ifp->name, ifp->ifindex);
return;
}
/* Mark interface as inactive */
UNSET_FLAG (ifp->status, ZEBRA_INTERFACE_ACTIVE);
if (IS_ZEBRA_DEBUG_KERNEL)
zlog_debug ("interface %s index %d is now inactive.",
ifp->name, ifp->ifindex);
/* Delete connected routes from the kernel. */
if (ifp->connected)
{
struct listnode *node;
struct listnode *last = NULL;
while ((node = (last ? last->next : listhead (ifp->connected))))
{
ifc = listgetdata (node);
p = ifc->address;
if (p->family == AF_INET
&& (rn = route_node_lookup (zebra_if->ipv4_subnets, p)))
{
struct listnode *anode;
struct listnode *next;
struct listnode *first;
struct list *addr_list;
route_unlock_node (rn);
addr_list = (struct list *) rn->info;
/* Remove addresses, secondaries first. */
first = listhead (addr_list);
for (anode = first->next; anode || first; anode = next)
{
if (!anode)
{
anode = first;
first = NULL;
}
next = anode->next;
ifc = listgetdata (anode);
p = ifc->address;
connected_down_ipv4 (ifp, ifc);
zebra_interface_address_delete_update (ifp, ifc);
UNSET_FLAG (ifc->conf, ZEBRA_IFC_REAL);
/* Remove from subnet chain. */
list_delete_node (addr_list, anode);
route_unlock_node (rn);
/* Remove from interface address list (unconditionally). */
if (!CHECK_FLAG (ifc->conf, ZEBRA_IFC_CONFIGURED))
{
listnode_delete (ifp->connected, ifc);
connected_free (ifc);
}
else
last = node;
}
/* Free chain list and respective route node. */
list_delete (addr_list);
rn->info = NULL;
route_unlock_node (rn);
}
#ifdef HAVE_IPV6
else if (p->family == AF_INET6)
{
connected_down_ipv6 (ifp, ifc);
zebra_interface_address_delete_update (ifp, ifc);
UNSET_FLAG (ifc->conf, ZEBRA_IFC_REAL);
if (CHECK_FLAG (ifc->conf, ZEBRA_IFC_CONFIGURED))
last = node;
else
{
listnode_delete (ifp->connected, ifc);
//.........这里部分代码省略.........
示例9: bgp_socket
int
bgp_socket (struct bgp *bgp, unsigned short port)
{
int ret;
struct addrinfo req;
struct addrinfo *ainfo;
struct addrinfo *ainfo_save;
int sock = 0;
char port_str[BUFSIZ];
memset (&req, 0, sizeof (struct addrinfo));
req.ai_flags = AI_PASSIVE;
req.ai_family = AF_UNSPEC;
req.ai_socktype = SOCK_STREAM;
sprintf (port_str, "%d", port);
port_str[sizeof (port_str) - 1] = '\0';
ret = getaddrinfo (NULL, port_str, &req, &ainfo);
if (ret != 0)
{
zlog_err ("getaddrinfo: %s", gai_strerror (ret));
return -1;
}
ainfo_save = ainfo;
do
{
if (ainfo->ai_family != AF_INET && ainfo->ai_family != AF_INET6)
continue;
sock = socket (ainfo->ai_family, ainfo->ai_socktype, ainfo->ai_protocol);
if (sock < 0)
{
zlog_err ("socket: %s", strerror (errno));
continue;
}
sockopt_reuseaddr (sock);
sockopt_reuseport (sock);
ret = bind (sock, ainfo->ai_addr, ainfo->ai_addrlen);
if (ret < 0)
{
zlog_err ("bind: %s", strerror (errno));
close (sock);
continue;
}
ret = listen (sock, 3);
if (ret < 0)
{
zlog_err ("listen: %s", strerror (errno));
close (sock);
continue;
}
#ifdef HAVE_TCP_SIGNATURE
#ifdef HAVE_LINUX_TCP_SIGNATURE
bm->sock = sock;
#endif /* HAVE_LINUX_TCP_SIGNATURE */
#ifdef HAVE_OPENBSD_TCP_SIGNATURE
bgp_tcpsig_set (sock, 0);
bm->sock = -1;
#endif /* HAVE_OPENBSD_TCP_SIGNATURE */
#endif /* HAVE_TCP_SIGNATURE */
thread_add_read (master, bgp_accept, bgp, sock);
}
while ((ainfo = ainfo->ai_next) != NULL);
freeaddrinfo (ainfo_save);
return sock;
}
示例10: parse_irdp_packet
static void
parse_irdp_packet(char *p,
int len,
struct interface *ifp)
{
struct ip *ip = (struct ip *)p ;
struct icmphdr *icmp;
struct in_addr src;
int ip_hlen, iplen, datalen;
struct zebra_if *zi;
struct irdp_interface *irdp;
zi = ifp->info;
if (!zi)
return;
irdp = &zi->irdp;
if (!irdp)
return;
ip_hlen = ip->ip_hl << 2;
sockopt_iphdrincl_swab_systoh (ip);
iplen = ip->ip_len;
datalen = len - ip_hlen;
src = ip->ip_src;
if (len != iplen)
{
zlog_err ("IRDP: RX length doesnt match IP length");
return;
}
if (iplen < ICMP_MINLEN)
{
zlog_err ("IRDP: RX ICMP packet too short from %s\n",
inet_ntoa (src));
return;
}
/* XXX: RAW doesnt receive link-layer, surely? ??? */
/* Check so we don't checksum packets longer than oure RX_BUF - (ethlen +
len of IP-header) 14+20 */
if (iplen > IRDP_RX_BUF-34)
{
zlog_err ("IRDP: RX ICMP packet too long from %s\n",
inet_ntoa (src));
return;
}
icmp = (struct icmphdr *) (p+ip_hlen);
/* check icmp checksum */
if (in_cksum (icmp, datalen) != icmp->checksum)
{
zlog_warn ("IRDP: RX ICMP packet from %s. Bad checksum, silently ignored",
inet_ntoa (src));
return;
}
/* Handle just only IRDP */
if (!(icmp->type == ICMP_ROUTERADVERT
|| icmp->type == ICMP_ROUTERSOLICIT))
return;
if (icmp->code != 0)
{
zlog_warn ("IRDP: RX packet type %d from %s. Bad ICMP type code,"
" silently ignored",
icmp->type, inet_ntoa (src));
return;
}
if (! ((ntohl (ip->ip_dst.s_addr) == INADDR_BROADCAST)
&& (irdp->flags & IF_BROADCAST))
||
(ntohl (ip->ip_dst.s_addr) == INADDR_ALLRTRS_GROUP
&& !(irdp->flags & IF_BROADCAST)))
{
zlog_warn ("IRDP: RX illegal from %s to %s while %s operates in %s\n",
inet_ntoa (src),
ntohl (ip->ip_dst.s_addr) == INADDR_ALLRTRS_GROUP ?
"multicast" : inet_ntoa (ip->ip_dst),
ifp->name,
irdp->flags & IF_BROADCAST ? "broadcast" : "multicast");
zlog_warn ("IRDP: Please correct settings\n");
return;
}
switch (icmp->type)
{
case ICMP_ROUTERADVERT:
break;
case ICMP_ROUTERSOLICIT:
if(irdp->flags & IF_DEBUG_MESSAGES)
zlog_debug ("IRDP: RX Solicit on %s from %s\n",
//.........这里部分代码省略.........
示例11: bgp_nlri_parse_6vpe
s32 bgp_nlri_parse_6vpe (struct peer *peer, struct attr *attr, struct bgp_nlri *packet)
{
u_char *pnt;
u_char *lim;
struct prefix p;
struct prefix_rd prd;
int psize;
int prefixlen;
u_int32_t label;
u_char *tagpnt;
/* Check peer status. */
if (peer->status != Established)
return 0;
pnt = packet->nlri;
lim = pnt + packet->length;
for (; pnt < lim; pnt += psize)
{
/* Clear prefix structure. */
memset (&p, 0, sizeof (struct prefix));
/* Fetch prefix length. */
prefixlen = *pnt++;
p.family = AF_INET6;
psize = PSIZE (prefixlen);
if (prefixlen < 88)
{
zlog_err ("prefix length is less than 88: %d", prefixlen);
return -1;
}
p.prefixlen = prefixlen - 88;
label = decode_label (pnt);
/* Copyr label to prefix. */
tagpnt = pnt;
prd.family = AF_UNSPEC;
prd.prefixlen = 64;
memcpy (prd.val, pnt + 3 ,8);
memcpy (&p.u.prefix6, pnt + 11 , psize - 11);
if (pnt + psize > lim)
return -1;
if (attr)
bgp_update (peer, &p, attr, AFI_IP6, SAFI_MPLS_VPN,
ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, tagpnt, 0);
else
bgp_withdraw (peer, &p, attr, AFI_IP6, SAFI_MPLS_VPN,
ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, tagpnt);
}
/* Packet length consistency check. */
if (pnt != lim)
return -1;
return 0;
}
示例12: rtm_init
/* Main startup routine. */
int
rtm_init (int argc, char **argv)
{
char *p;
char *vty_addr = NULL;
int vty_port = ZEBRA_VTY_PORT;
int dryrun = 0;
int batch_mode = 0;
int daemon_mode = 0;
char *config_file = NULL;
char *progname;
struct thread thread;
char *zserv_path = NULL;
/* Set umask before anything for security */
umask (0027);
/* preserve my name */
progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]);
zlog_default = openzlog (progname, ZLOG_ZEBRA,
LOG_CONS|LOG_NDELAY|LOG_PID, LOG_DAEMON);
/* Make master thread emulator. */
zebrad.master = thread_master_create ();
/* privs initialise */
zprivs_init (&zserv_privs);
/* Vty related initialize. */
signal_init (zebrad.master, Q_SIGC(zebra_signals), zebra_signals);
#if 0
/*
* All CLI command registrations commented out
*/
cmd_init (1);
vty_init (zebrad.master);
memory_init ();
zebra_init ();
zebra_if_init ();
zebra_vty_init ();
/* Sort VTY commands. */
sort_node ();
#endif
/* Zebra related initialize. */
rib_init ();
zebra_debug_init ();
router_id_init();
access_list_init ();
prefix_list_init ();
rtadv_init ();
#ifdef HAVE_IRDP
irdp_init();
#endif
/* For debug purpose. */
/* SET_FLAG (zebra_debug_event, ZEBRA_DEBUG_EVENT); */
#if 0
/*
* The Kernel FIB Interface is no longer needed
*/
/* Make kernel routing socket. */
kernel_init ();
interface_list ();
route_read ();
#endif
#ifdef HAVE_SNMP
zebra_snmp_init ();
#endif /* HAVE_SNMP */
/* Process the configuration file. Among other configuration
* directives we can meet those installing static routes. Such
* requests will not be executed immediately, but queued in
* zebra->ribq structure until we enter the main execution loop.
* The notifications from kernel will show originating PID equal
* to that after daemon() completes (if ever called).
*/
vty_read_config (config_file, config_default);
/* Don't start execution if we are in dry-run mode */
if (dryrun)
return(0);
/* Clean up rib. */
rib_weed_tables ();
/* Exit when zebra is working in batch mode. */
if (batch_mode)
exit (0);
#if 0
/* Daemonize. */
if (daemon_mode && daemon (0, 0) < 0)
{
zlog_err("Zebra daemon failed: %s", strerror(errno));
//.........这里部分代码省略.........
示例13: ospf_sock_init
int ospf_sock_init (int packet_flag)
{
int ospf_sock;
int ret, hincl = 1;
int ospf_hello = OSPF_IP_HELLO_PACKET;
int ospf_other = OSPF_IP_OTHER_PACKET;
ospf_sock = socket (AF_INET, SOCK_RAW, IPPROTO_OSPFIGP);
if (ospf_sock < 0)
{
int save_errno = errno;
zlog_err ("ospf_read_sock_init: socket: %s", safe_strerror (save_errno));
exit(1);
}
#ifdef IP_HDRINCL
/* we will include IP header with packet */
ret = setsockopt (ospf_sock, IPPROTO_IP, IP_HDRINCL, &hincl, sizeof (hincl));
if (ret < 0)
{
int save_errno = errno;
zlog_warn ("Can't set IP_HDRINCL option for fd %d: %s",
ospf_sock, safe_strerror(save_errno));
}
#elif defined (IPTOS_PREC_INTERNETCONTROL)
#warning "IP_HDRINCL not available on this system"
#warning "using IPTOS_PREC_INTERNETCONTROL"
ret = setsockopt_ipv4_tos(ospf_sock, IPTOS_PREC_INTERNETCONTROL);
if (ret < 0)
{
int save_errno = errno;
zlog_warn ("can't set sockopt IP_TOS %d to socket %d: %s",
tos, ospf_sock, safe_strerror(save_errno));
close (ospf_sock); /* Prevent sd leak. */
return ret;
}
#else /* !IPTOS_PREC_INTERNETCONTROL */
#warning "IP_HDRINCL not available, nor is IPTOS_PREC_INTERNETCONTROL"
zlog_warn ("IP_HDRINCL option not available");
#endif /* IP_HDRINCL */
ret = setsockopt_ifindex (AF_INET, ospf_sock, 1);
if (ret < 0)
{
zlog_warn ("Can't set pktinfo option for fd %d", ospf_sock);
}
ret = setsockopt_so_recvbuf (ospf_sock, OSPF_PACKET_RECV_BUFFLEN);
if (ret < 0)
{
zlog_warn ("Can't set SO_RCVBUF %d to socket %d",
OSPF_PACKET_RECV_BUFFLEN, ospf_sock);
}
if(packet_flag == OSPF_IP_HELLO_PACKET)
{
set_nonblocking(ospf_sock);
setsockopt (ospf_sock, SOL_SOCKET, SO_SET_OSPF_FILTER, &ospf_hello, sizeof (ospf_hello));
}
if(packet_flag == OSPF_IP_OTHER_PACKET)
{
set_nonblocking(ospf_sock);
setsockopt (ospf_sock, SOL_SOCKET, SO_SET_OSPF_FILTER, &ospf_other, sizeof (ospf_hello));
}
return ospf_sock;
}
示例14: zlog_debug
/* Take a sequence of payload (routing) RTE structures, decide on particular
* authentication required for the given interface and build a complete RIP
* packet in a stream structure. The packet will consist of header, optional
* heading RTE, the payload RTEs and optional trailing data. Return the stream.
*/
int
rip_auth_make_packet
(
struct rip_interface * ri,
struct stream * packet,
struct stream * rtes,
const u_int8_t version,
const u_int8_t command
)
{
struct key *key = NULL;
char *auth_str = NULL;
if (IS_RIP_DEBUG_AUTH)
zlog_debug ("interface auth type is '%s', inet RTEs payload size is %zuB",
LOOKUP (rip_ffff_type_str, ri->auth_type), stream_get_endp (rtes));
/* packet header, unconditional */
stream_reset (packet);
stream_putc (packet, command);
stream_putc (packet, version);
stream_putw (packet, 0);
/* authentication leading RTE, conditional */
if (version == RIPv2 && ri->auth_type != RIP_NO_AUTH)
{
if (ri->key_chain)
{
struct keychain *keychain;
keychain = keychain_lookup (ri->key_chain);
if (keychain)
{
if (IS_RIP_DEBUG_AUTH)
zlog_debug ("trying configured key chain '%s'", ri->key_chain);
key = key_lookup_for_send (keychain);
}
else
{
if (IS_RIP_DEBUG_AUTH)
zlog_debug ("key chain '%s' is configured, but does not exist", ri->key_chain);
}
}
/* Pick correct auth string for sends, prepare auth_str buffer for use.
* (left justified and padded).
*
* presumes one of ri or key is valid, and that the auth strings they point
* to are nul terminated. If neither are present, auth_str will be fully
* zero padded.
*
*/
if (key && key->string)
{
if (IS_RIP_DEBUG_AUTH)
zlog_debug ("using keychain '%s', key %u for sending", ri->key_chain, key->index);
auth_str = key->string;
}
else if (ri->auth_str)
{
if (IS_RIP_DEBUG_AUTH)
zlog_debug ("using interface authentication string");
auth_str = ri->auth_str;
}
if (auth_str == NULL)
{
if (IS_RIP_DEBUG_AUTH)
zlog_debug ("authentication string lookup failed");
return -1;
}
rip_auth_write_leading_rte (packet, ri, key ? key->index % 256 : 1, auth_str,
RIP_HEADER_SIZE + RIP_RTE_SIZE + stream_get_endp (rtes));
}
/* RTEs payload, unconditional */
if (stream_get_endp (rtes) % RIP_RTE_SIZE)
{
zlog_err ("%s: malformed input RTE buffer", __func__);
return -1;
}
stream_write (packet, STREAM_DATA (rtes), stream_get_endp (rtes));
stream_reset (rtes);
/* authentication trailing data, even more conditional */
if (version == RIPv2 && ri->auth_type == RIP_AUTH_HASH)
rip_auth_write_trailer (packet, ri, auth_str);
return 0;
}
示例15: zassert
static struct pim_neighbor *pim_neighbor_new(struct interface *ifp,
struct in_addr source_addr,
pim_hello_options hello_options,
uint16_t holdtime,
uint16_t propagation_delay,
uint16_t override_interval,
uint32_t dr_priority,
uint32_t generation_id,
struct list *addr_list)
{
struct pim_interface *pim_ifp;
struct pim_neighbor *neigh;
char src_str[100];
zassert(ifp);
pim_ifp = ifp->info;
zassert(pim_ifp);
neigh = XMALLOC(MTYPE_PIM_NEIGHBOR, sizeof(*neigh));
if (!neigh) {
zlog_err("%s: PIM XMALLOC(%zu) failure",
__PRETTY_FUNCTION__, sizeof(*neigh));
return 0;
}
neigh->creation = pim_time_monotonic_sec();
neigh->source_addr = source_addr;
neigh->hello_options = hello_options;
neigh->propagation_delay_msec = propagation_delay;
neigh->override_interval_msec = override_interval;
neigh->dr_priority = dr_priority;
neigh->generation_id = generation_id;
neigh->prefix_list = addr_list;
neigh->t_expire_timer = 0;
neigh->interface = ifp;
pim_neighbor_timer_reset(neigh, holdtime);
pim_inet4_dump("<src?>", source_addr, src_str, sizeof(src_str));
if (PIM_DEBUG_PIM_EVENTS) {
zlog_debug("%s: creating PIM neighbor %s on interface %s",
__PRETTY_FUNCTION__,
src_str, ifp->name);
}
zlog_info("PIM NEIGHBOR UP: neighbor %s on interface %s",
src_str, ifp->name);
if (neigh->propagation_delay_msec > pim_ifp->pim_neighbors_highest_propagation_delay_msec) {
pim_ifp->pim_neighbors_highest_propagation_delay_msec = neigh->propagation_delay_msec;
}
if (neigh->override_interval_msec > pim_ifp->pim_neighbors_highest_override_interval_msec) {
pim_ifp->pim_neighbors_highest_override_interval_msec = neigh->override_interval_msec;
}
if (!PIM_OPTION_IS_SET(neigh->hello_options,
PIM_OPTION_MASK_LAN_PRUNE_DELAY)) {
/* update num. of neighbors without hello option lan_delay */
++pim_ifp->pim_number_of_nonlandelay_neighbors;
}
if (!PIM_OPTION_IS_SET(neigh->hello_options,
PIM_OPTION_MASK_DR_PRIORITY)) {
/* update num. of neighbors without hello option dr_pri */
++pim_ifp->pim_dr_num_nondrpri_neighbors;
}
return neigh;
}