mirror of
https://github.com/bgp/bgpq4
synced 2025-02-28 08:53:11 +00:00
Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9f8d82db21 | ||
|
|
a6792d2495 | ||
|
|
af202a821b | ||
|
|
ed8ee8368d | ||
|
|
bf5f10def9 | ||
|
|
1f7572c2f1 | ||
|
|
34cc813446 | ||
|
|
5c57bb2bb6 | ||
|
|
e6bf77058a | ||
|
|
139e0d972b | ||
|
|
99f036b186 | ||
|
|
cb98214f0c | ||
|
|
ed28cf6734 | ||
|
|
9ac2087d24 | ||
|
|
58adb550bd |
@@ -1,4 +1,4 @@
|
||||
/*
|
||||
/*-
|
||||
* Copyright (c) 2007-2019 Alexandre Snarskii <snar@snar.spb.ru>
|
||||
* All rights reserved.
|
||||
*
|
||||
@@ -22,26 +22,5 @@
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SX_SLENTRY_H_
|
||||
#define SX_SLENTRY_H_
|
||||
|
||||
#include <sys/queue.h>
|
||||
#include <sys/tree.h>
|
||||
|
||||
struct sx_slentry {
|
||||
STAILQ_ENTRY(sx_slentry) entries;
|
||||
char* text;
|
||||
};
|
||||
|
||||
struct sx_slentry* sx_slentry_new(char* text);
|
||||
|
||||
struct sx_tentry {
|
||||
RB_ENTRY(sx_tentry) entries;
|
||||
char* text;
|
||||
};
|
||||
|
||||
struct sx_tentry* sx_tentry_new(char* text);
|
||||
|
||||
#endif
|
||||
10
Makefile.am
10
Makefile.am
@@ -1,4 +1,4 @@
|
||||
SUBDIRS = include compat
|
||||
SUBDIRS = include
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
|
||||
AM_CPPFLAGS = -I$(top_srcdir)/include
|
||||
@@ -10,16 +10,20 @@ bin_PROGRAMS=bgpq4
|
||||
dist_man8_MANS=bgpq4.8
|
||||
|
||||
bgpq4_LDADD = $(PLATFORM_LDADD) $(PROG_LDADD)
|
||||
|
||||
if !HAVE_STRLCPY
|
||||
SUBDIRS += compat
|
||||
bgpq4_LDADD += $(top_builddir)/compat/libcompat.la
|
||||
endif
|
||||
|
||||
bgpq4_SOURCES=main.c extern.h printer.c expander.c \
|
||||
sx_maxsockbuf.c \
|
||||
sx_prefix.c sx_prefix.h \
|
||||
sx_report.c sx_report.h \
|
||||
sx_slentry.c sx_slentry.h
|
||||
sx_slentry.c
|
||||
|
||||
|
||||
EXTRA_DIST=bootstrap README.md CHANGES bgpq4.spec
|
||||
EXTRA_DIST=bootstrap README.md CHANGES
|
||||
|
||||
MAINTAINERCLEANFILES=configure aclocal.m4 compile \
|
||||
install-sh missing Makefile.in depcomp \
|
||||
|
||||
14
README.md
14
README.md
@@ -3,6 +3,9 @@ NAME
|
||||
|
||||
`bgpq4` - bgp filtering automation tool
|
||||
|
||||
The `bgpq4` utility queries IRRd and then generates IRR and/or RPKI based
|
||||
filters formatted for a wide assortment of BGP implementations.
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
|
||||
@@ -329,11 +332,6 @@ Linux can be tuned in the following way:
|
||||
sysctl -w net.ipv4.tcp_rmem="4096 87380 2097152"
|
||||
sysctl -w net.ipv4.tcp_wmem="4096 65536 2097152"
|
||||
|
||||
Please note that generated prefix-lists may not fit your router's
|
||||
limitations. For example, JunOS supports only 85,325 prefixes in
|
||||
each prefix-list [4](http://www.juniper.net/techpubs/en_US/junos11.4/topics/reference/configuration-statement/prefix-list-edit-policy-options.html).
|
||||
|
||||
|
||||
BUILDING
|
||||
--------
|
||||
|
||||
@@ -378,6 +376,12 @@ On Arch Linux, BGPQ4 is [available in AUR](https://aur.archlinux.org/packages/bg
|
||||
yay -S bgpq4
|
||||
```
|
||||
|
||||
On OpenBSD:
|
||||
|
||||
```shell
|
||||
pkg_add bgpq4
|
||||
```
|
||||
|
||||
MAILING LIST
|
||||
------------
|
||||
|
||||
|
||||
88
bgpq4.spec
88
bgpq4.spec
@@ -1,88 +0,0 @@
|
||||
Name: bgpq4
|
||||
Version: 0.0.6
|
||||
Release: 0%{?dist}
|
||||
|
||||
Group: System/Utilities
|
||||
Summary: Generate BGP filters based on routing database information
|
||||
URL: https://github.com/bgp/bgpq4
|
||||
License: BSD
|
||||
Source0: https://github.com/bgp/bgpq4
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
||||
|
||||
%description
|
||||
You are running BGP in your network and want to automate filter generation for your routers? Well, with BGPQ4 it's easy.
|
||||
|
||||
%prep
|
||||
%setup -q
|
||||
|
||||
%global debug_package %{nil}
|
||||
|
||||
%build
|
||||
./configure --prefix=$RPM_BUILD_ROOT%{_prefix} --mandir=%{_mandir}
|
||||
make
|
||||
|
||||
%install
|
||||
rm -rf $RPM_BUILD_ROOT
|
||||
mkdir -p $RPM_BUILD_ROOT/usr/bin
|
||||
make install
|
||||
|
||||
%files
|
||||
%defattr(-,root,root,-)
|
||||
/usr/bin/bgpq4
|
||||
/usr/man/man8/bgpq4.8.gz
|
||||
%doc COPYRIGHT CHANGES
|
||||
|
||||
%clean
|
||||
rm -rf $RPM_BUILD_ROOT
|
||||
|
||||
%changelog
|
||||
* Thu Mar 12 2020 Job Snijders <job@ntt.net> 0.0.6:
|
||||
- bugfixes (Thanks Chris Caputo!)
|
||||
|
||||
* Wed Jan 01 2020 Job Snijders <job@ntt.net> 0.0.5:
|
||||
- bugfixes
|
||||
|
||||
* Tue Dec 31 2019 Job Snijders <job@ntt.net> 0.0.4
|
||||
- Remove '-3' command line option, assume all devices are 32-bit ASN safe
|
||||
|
||||
* Mon Dec 30 2019 Job Snijders <job@ntt.net> 0.0.3
|
||||
- Remove the '-2' command line option
|
||||
- Significant code reformating
|
||||
- Improve performance by using IRRd 4's A query when available
|
||||
|
||||
* Sat Dec 14 2019 Job Snijders <job@ntt.net> 0.0.2
|
||||
- Add Mikrotik support
|
||||
- Remove ASDDOT support
|
||||
|
||||
* Sat Dec 14 2019 Job Snijders <job@ntt.net> 0.0.1
|
||||
- Fork from bgpq3
|
||||
|
||||
* Tue Nov 30 2018 Alexandre Snarskii <snar@snar.spb.ru> 0.1.35
|
||||
- Version updated
|
||||
|
||||
* Fri Oct 14 2016 Alexandre Snarskii <snar@snar.spb.ru> 0.1.33
|
||||
- Version updated
|
||||
|
||||
* Tue Jun 23 Alexandre Snarskii <snar@snar.spb.ru> 0.1.31
|
||||
- Version updated
|
||||
|
||||
* Tue Mar 10 Alexandre Snarskii <snar@snar.spb.ru> 0.1.28
|
||||
- Version updated
|
||||
|
||||
* Wed Oct 29 Alexandre Snarskii <snar@snar.spb.ru> 0.1.25
|
||||
- Version updated
|
||||
|
||||
* Thu Jun 5 2014 Alexandre Snarskii <snar@snar.spb.ru> 0.1.21-0.snar
|
||||
- Version updated
|
||||
|
||||
* Thu May 9 2013 Alexandre Snarskii <snar@snar.spb.ru> 0.1.19-0.snar
|
||||
- Version updated
|
||||
|
||||
* Sun Feb 24 2013 Alexandre Snarskii <snar@snar.spb.ru> 0.1.18-3.snar
|
||||
- License corrected
|
||||
|
||||
* Wed Feb 20 2013 Arnoud Vermeer <arnoud@tumblr.com> 0.1.18-2.tumblr
|
||||
- Adding missing group info (arnoud@tumblr.com)
|
||||
|
||||
* Wed Feb 20 2013 Arnoud Vermeer <arnoud@tumblr.com> 0.1.18-1.tumblr
|
||||
- new package built with tito
|
||||
@@ -2,9 +2,6 @@ AM_CPPFLAGS = -I$(top_srcdir)/include
|
||||
|
||||
noinst_LTLIBRARIES = libcompat.la
|
||||
|
||||
libcompat_la_SOURCES =
|
||||
libcompat_la_LIBADD = $(PLATFORM_LDADD)
|
||||
|
||||
if !HAVE_STRLCPY
|
||||
libcompat_la_SOURCES += strlcpy.c
|
||||
endif
|
||||
libcompat_la_SOURCES = strlcpy.c
|
||||
|
||||
88
expander.c
88
expander.c
@@ -31,17 +31,18 @@
|
||||
#include <sys/select.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <fcntl.h>
|
||||
#include <inttypes.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <netdb.h>
|
||||
#include <err.h>
|
||||
#include <fcntl.h>
|
||||
#include <inttypes.h>
|
||||
#include <limits.h>
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
#include <netdb.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "extern.h"
|
||||
@@ -268,11 +269,12 @@ bgpq_expanded_macro(char *as, struct bgpq_expander *ex,
|
||||
}
|
||||
|
||||
struct bgpq_request *bgpq_pipeline(struct bgpq_expander *b,
|
||||
int (*callback)(char*, struct bgpq_expander *b, struct bgpq_request *req),
|
||||
void *udata, char *fmt, ...);
|
||||
int (*callback)(char *, struct bgpq_expander *b, struct bgpq_request *req),
|
||||
void *udata, char *fmt, ...);
|
||||
|
||||
int bgpq_expand_irrd(struct bgpq_expander *b,
|
||||
int (*callback)(char*, struct bgpq_expander *b, struct bgpq_request *req),
|
||||
void *udata, char *fmt, ...);
|
||||
void *udata, char *fmt, ...);
|
||||
|
||||
static int
|
||||
bgpq_expanded_macro_limit(char *as, struct bgpq_expander *b,
|
||||
@@ -282,13 +284,13 @@ bgpq_expanded_macro_limit(char *as, struct bgpq_expander *b,
|
||||
struct sx_tentry tkey = { .text = as };
|
||||
|
||||
if (RB_FIND(tentree, &b->already, &tkey)) {
|
||||
SX_DEBUG(debug_expander>2, "%s is already expanding, "
|
||||
SX_DEBUG(debug_expander > 2, "%s is already expanding, "
|
||||
"ignore\n", as);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (RB_FIND(tentree, &b->stoplist, &tkey)) {
|
||||
SX_DEBUG(debug_expander>2, "%s is in the stoplist, "
|
||||
SX_DEBUG(debug_expander > 2, "%s is in the stoplist, "
|
||||
"ignore\n", as);
|
||||
return 0;
|
||||
}
|
||||
@@ -300,8 +302,8 @@ bgpq_expanded_macro_limit(char *as, struct bgpq_expander *b,
|
||||
if (pipelining) {
|
||||
struct bgpq_request *req1 = bgpq_pipeline(b,
|
||||
bgpq_expanded_macro_limit, NULL, "!i%s\n",
|
||||
as);
|
||||
req1->depth = req->depth+1;
|
||||
as);
|
||||
req1->depth = req->depth + 1;
|
||||
} else {
|
||||
b->cdepth++;
|
||||
bgpq_expand_irrd(b, bgpq_expanded_macro_limit,
|
||||
@@ -309,7 +311,7 @@ bgpq_expanded_macro_limit(char *as, struct bgpq_expander *b,
|
||||
b->cdepth--;
|
||||
}
|
||||
} else {
|
||||
SX_DEBUG(debug_expander>2, "ignoring %s at depth %i\n",
|
||||
SX_DEBUG(debug_expander > 2, "ignoring %s at depth %i\n",
|
||||
as,
|
||||
b->cdepth ? (b->cdepth + 1) : (req->depth + 1));
|
||||
}
|
||||
@@ -354,8 +356,8 @@ bgpq_expanded_prefix(char *as, struct bgpq_expander *ex,
|
||||
}
|
||||
|
||||
static int
|
||||
bgpq_expanded_v6prefix(char *prefix, struct bgpq_expander * ex,
|
||||
struct bgpq_request* req)
|
||||
bgpq_expanded_v6prefix(char *prefix, struct bgpq_expander *ex,
|
||||
struct bgpq_request *req)
|
||||
{
|
||||
char *d = strchr(prefix, '^');
|
||||
|
||||
@@ -369,11 +371,11 @@ bgpq_expanded_v6prefix(char *prefix, struct bgpq_expander * ex,
|
||||
|
||||
int bgpq_pipeline_dequeue(int fd, struct bgpq_expander *b);
|
||||
|
||||
static struct bgpq_request*
|
||||
bgpq_request_alloc(char *request, int (*callback)(char*, struct bgpq_expander*,
|
||||
struct bgpq_request*), void* udata)
|
||||
static struct bgpq_request *
|
||||
bgpq_request_alloc(char *request, int (*callback)(char *, struct bgpq_expander *,
|
||||
struct bgpq_request *), void *udata)
|
||||
{
|
||||
struct bgpq_request* bp = malloc(sizeof(struct bgpq_request));
|
||||
struct bgpq_request *bp = malloc(sizeof(struct bgpq_request));
|
||||
|
||||
if (!bp)
|
||||
return NULL;
|
||||
@@ -389,7 +391,7 @@ bgpq_request_alloc(char *request, int (*callback)(char*, struct bgpq_expander*,
|
||||
}
|
||||
|
||||
static void
|
||||
bgpq_request_free(struct bgpq_request* req)
|
||||
bgpq_request_free(struct bgpq_request *req)
|
||||
{
|
||||
if (req->request)
|
||||
free(req->request);
|
||||
@@ -397,15 +399,15 @@ bgpq_request_free(struct bgpq_request* req)
|
||||
free(req);
|
||||
}
|
||||
|
||||
struct bgpq_request*
|
||||
struct bgpq_request *
|
||||
bgpq_pipeline(struct bgpq_expander *b,
|
||||
int (*callback)(char*, struct bgpq_expander*, struct bgpq_request*),
|
||||
void* udata, char *fmt, ...)
|
||||
int (*callback)(char *, struct bgpq_expander *, struct bgpq_request *),
|
||||
void *udata, char *fmt, ...)
|
||||
{
|
||||
char request[128];
|
||||
int ret;
|
||||
struct bgpq_request* bp = NULL;
|
||||
va_list ap;
|
||||
char request[128];
|
||||
int ret;
|
||||
struct bgpq_request *bp = NULL;
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, fmt);
|
||||
vsnprintf(request, sizeof(request), fmt, ap);
|
||||
@@ -538,11 +540,12 @@ bgpq_read(struct bgpq_expander *b)
|
||||
bgpq_write(b);
|
||||
|
||||
while(!STAILQ_EMPTY(&b->rq)) {
|
||||
struct bgpq_request* req = STAILQ_FIRST(&b->rq);
|
||||
int ret = 0;
|
||||
char *cres;
|
||||
struct bgpq_request *req = STAILQ_FIRST(&b->rq);
|
||||
|
||||
SX_DEBUG(debug_expander > 2, "waiting for answer to %s,"
|
||||
"init %i '%.*s'\n", req->request, off, off, response);
|
||||
int ret = 0;
|
||||
char *cres;
|
||||
|
||||
if ((cres=strchr(response, '\n')) != NULL)
|
||||
goto have;
|
||||
@@ -630,7 +633,7 @@ reread:
|
||||
recvbuffer + offset);
|
||||
offset += ret;
|
||||
if (offset < togot) {
|
||||
SX_DEBUG(debug_expander>5, "expected %lu, got "
|
||||
SX_DEBUG(debug_expander > 5, "expected %lu, got "
|
||||
"%lu expanding %s", togot,
|
||||
strlen(recvbuffer), req->request);
|
||||
goto reread;
|
||||
@@ -717,12 +720,12 @@ have3:
|
||||
|
||||
int
|
||||
bgpq_expand_irrd(struct bgpq_expander *b,
|
||||
int (*callback)(char*, struct bgpq_expander*, struct bgpq_request* ),
|
||||
void* udata, char *fmt, ...)
|
||||
int (*callback)(char *, struct bgpq_expander *, struct bgpq_request *),
|
||||
void *udata, char *fmt, ...)
|
||||
{
|
||||
char request[128], response[128];
|
||||
va_list ap;
|
||||
size_t ret;
|
||||
ssize_t ret;
|
||||
int off = 0;
|
||||
struct bgpq_request *req;
|
||||
|
||||
@@ -732,14 +735,11 @@ bgpq_expand_irrd(struct bgpq_expander *b,
|
||||
|
||||
req = bgpq_request_alloc(request, callback, udata);
|
||||
|
||||
SX_DEBUG(debug_expander, "expander: sending '%s'\n", request);
|
||||
SX_DEBUG(debug_expander, "expander sending: %s", request);
|
||||
|
||||
if ((ret = write(b->fd, request, strlen(request)) == 0) || ret == -1)
|
||||
err(1, "write");
|
||||
|
||||
ret=write(b->fd, request, strlen(request));
|
||||
if (ret != strlen(request)) {
|
||||
sx_report(SX_FATAL,"Partial write to IRRd, only %lu bytes "
|
||||
"written: %s\n", ret, strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
memset(response, 0, sizeof(response));
|
||||
|
||||
repeat:
|
||||
@@ -826,7 +826,7 @@ have3:
|
||||
if (!strchr(response, '\n'))
|
||||
goto reread2;
|
||||
|
||||
SX_DEBUG(debug_expander>2,"expander: final reply of %lu bytes,"
|
||||
SX_DEBUG(debug_expander > 2,"expander: final reply of %lu bytes,"
|
||||
" %.*sreturn code %.*s",
|
||||
(unsigned long)strlen(recvbuffer), offset, recvbuffer, off,
|
||||
response);
|
||||
@@ -933,7 +933,7 @@ bgpq_expand(struct bgpq_expander *b)
|
||||
b->fd = fd;
|
||||
|
||||
SX_DEBUG(debug_expander, "Sending '!!' to server to request for the"
|
||||
"connection to remain open\n");
|
||||
" connection to remain open\n");
|
||||
if ((ret = write(fd, "!!\n", 3)) != 3) {
|
||||
sx_report(SX_ERROR, "Partial write of multiple command mode "
|
||||
"to IRRd: %i bytes, %s\n", ret, strerror(errno));
|
||||
@@ -1061,7 +1061,7 @@ bgpq_expand(struct bgpq_expander *b)
|
||||
bgpq_expand_irrd(b, bgpq_expanded_v6prefix,
|
||||
NULL, "!i%s,1\n", mc->text);
|
||||
}
|
||||
for (k=0; k < sizeof(b->asn32s) / sizeof(unsigned char*); k++) {
|
||||
for (k=0; k < sizeof(b->asn32s) / sizeof(unsigned char *); k++) {
|
||||
if (!b->asn32s[k])
|
||||
continue;
|
||||
for (i=0; i<8192; i++) {
|
||||
|
||||
16
extern.h
16
extern.h
@@ -25,9 +25,23 @@
|
||||
*/
|
||||
|
||||
#include <sys/queue.h>
|
||||
#include <sys/tree.h>
|
||||
|
||||
#include "sx_prefix.h"
|
||||
#include "sx_slentry.h"
|
||||
|
||||
struct sx_slentry {
|
||||
STAILQ_ENTRY(sx_slentry) entries;
|
||||
char* text;
|
||||
};
|
||||
|
||||
struct sx_slentry* sx_slentry_new(char* text);
|
||||
|
||||
struct sx_tentry {
|
||||
RB_ENTRY(sx_tentry) entries;
|
||||
char* text;
|
||||
};
|
||||
|
||||
struct sx_tentry* sx_tentry_new(char* text);
|
||||
|
||||
typedef enum {
|
||||
V_CISCO = 0,
|
||||
|
||||
@@ -40,18 +40,18 @@
|
||||
#include "sx_report.h"
|
||||
|
||||
#ifndef SX_MAXSOCKBUF_MAX
|
||||
#define SX_MAXSOCKBUF_MAX (2*1024*1024)
|
||||
#define SX_MAXSOCKBUF_MAX (2 * 1024 * 1024)
|
||||
#endif
|
||||
|
||||
int
|
||||
sx_maxsockbuf(int s, int dir)
|
||||
{
|
||||
int optval = 0, voptval;
|
||||
int hiconf = -1, loconf = -1;
|
||||
unsigned int voptlen;
|
||||
int phase = 0, iterations = 0;
|
||||
int optval = 0, voptval;
|
||||
int hiconf = -1, loconf = -1;
|
||||
unsigned int voptlen;
|
||||
int phase = 0, iterations = 0;
|
||||
|
||||
if (s<0) {
|
||||
if (s < 0) {
|
||||
sx_report(SX_FATAL,"Unable to maximize sockbuf on invalid "
|
||||
"socket %i\n", s);
|
||||
exit(1);
|
||||
|
||||
68
sx_prefix.h
68
sx_prefix.h
@@ -59,43 +59,43 @@ typedef struct sx_radix_tree {
|
||||
} sx_radix_tree_t;
|
||||
|
||||
/* most common operations with the tree is to: lookup/insert/unlink */
|
||||
struct sx_radix_node* sx_radix_tree_lookup(struct sx_radix_tree* tree,
|
||||
struct sx_prefix* prefix);
|
||||
struct sx_radix_node* sx_radix_tree_insert(struct sx_radix_tree* tree,
|
||||
struct sx_prefix* prefix);
|
||||
void sx_radix_tree_unlink(struct sx_radix_tree* t, struct sx_radix_node* n);
|
||||
struct sx_radix_node* sx_radix_tree_lookup_exact(struct sx_radix_tree* tree,
|
||||
struct sx_prefix* prefix);
|
||||
struct sx_radix_node *sx_radix_tree_lookup(struct sx_radix_tree *tree,
|
||||
struct sx_prefix *prefix);
|
||||
struct sx_radix_node *sx_radix_tree_insert(struct sx_radix_tree *tree,
|
||||
struct sx_prefix *prefix);
|
||||
void sx_radix_tree_unlink(struct sx_radix_tree *t, struct sx_radix_node *n);
|
||||
struct sx_radix_node *sx_radix_tree_lookup_exact(struct sx_radix_tree *tree,
|
||||
struct sx_prefix *prefix);
|
||||
|
||||
struct sx_prefix* sx_prefix_alloc(struct sx_prefix* p);
|
||||
void sx_prefix_destroy(struct sx_prefix* p);
|
||||
void sx_radix_node_destroy(struct sx_radix_node* p);
|
||||
void sx_prefix_adjust_masklen(struct sx_prefix* p);
|
||||
struct sx_prefix* sx_prefix_new(int af, char* text);
|
||||
int sx_prefix_parse(struct sx_prefix* p, int af, char* text);
|
||||
int sx_prefix_range_parse(struct sx_radix_tree* t, int af, unsigned int ml, char* text);
|
||||
int sx_prefix_fprint(FILE* f, struct sx_prefix* p);
|
||||
int sx_prefix_snprintf(struct sx_prefix* p, char* rbuffer, int srb);
|
||||
int sx_prefix_snprintf_sep(struct sx_prefix* p, char* rbuffer, int srb, char*);
|
||||
void sx_prefix_snprintf_fmt(struct sx_prefix* p, FILE* f,
|
||||
const char* name, const char* fmt,
|
||||
unsigned int aggregateLow, unsigned int aggregateHi);
|
||||
int sx_prefix_jsnprintf(struct sx_prefix* p, char* rbuffer, int srb);
|
||||
struct sx_radix_tree* sx_radix_tree_new(int af);
|
||||
struct sx_radix_node* sx_radix_node_new(struct sx_prefix* prefix);
|
||||
struct sx_prefix* sx_prefix_overlay(struct sx_prefix* p, int n);
|
||||
int sx_radix_tree_empty(struct sx_radix_tree* t);
|
||||
void sx_radix_node_fprintf(struct sx_radix_node* node, void* udata);
|
||||
int sx_radix_node_foreach(struct sx_radix_node* node,
|
||||
void (*func)(struct sx_radix_node*, void*), void* udata);
|
||||
int sx_radix_tree_foreach(struct sx_radix_tree* tree,
|
||||
void (*func)(struct sx_radix_node*, void*), void* udata);
|
||||
int sx_radix_tree_aggregate(struct sx_radix_tree* tree);
|
||||
int sx_radix_tree_refine(struct sx_radix_tree* tree, unsigned refine);
|
||||
int sx_radix_tree_refineLow(struct sx_radix_tree* tree, unsigned refineLow);
|
||||
struct sx_prefix *sx_prefix_alloc(struct sx_prefix *p);
|
||||
void sx_prefix_destroy(struct sx_prefix *p);
|
||||
void sx_radix_node_destroy(struct sx_radix_node *p);
|
||||
void sx_prefix_adjust_masklen(struct sx_prefix *p);
|
||||
struct sx_prefix *sx_prefix_new(int af, char *text);
|
||||
int sx_prefix_parse(struct sx_prefix *p, int af, char *text);
|
||||
int sx_prefix_range_parse(struct sx_radix_tree *t, int af, unsigned int ml, char *text);
|
||||
int sx_prefix_fprint(FILE *f, struct sx_prefix *p);
|
||||
int sx_prefix_snprintf(struct sx_prefix *p, char *rbuffer, int srb);
|
||||
int sx_prefix_snprintf_sep(struct sx_prefix *p, char *rbuffer, int srb, char *);
|
||||
void sx_prefix_snprintf_fmt(struct sx_prefix *p, FILE *f,
|
||||
const char *name, const char *fmt, unsigned int aggregateLow,
|
||||
unsigned int aggregateHi);
|
||||
int sx_prefix_jsnprintf(struct sx_prefix *p, char *rbuffer, int srb);
|
||||
struct sx_radix_tree *sx_radix_tree_new(int af);
|
||||
struct sx_radix_node *sx_radix_node_new(struct sx_prefix *prefix);
|
||||
struct sx_prefix *sx_prefix_overlay(struct sx_prefix *p, int n);
|
||||
int sx_radix_tree_empty(struct sx_radix_tree *t);
|
||||
void sx_radix_node_fprintf(struct sx_radix_node *node, void *udata);
|
||||
int sx_radix_node_foreach(struct sx_radix_node *node,
|
||||
void (*func)(struct sx_radix_node *, void *), void *udata);
|
||||
int sx_radix_tree_foreach(struct sx_radix_tree *tree,
|
||||
void (*func)(struct sx_radix_node *, void *), void *udata);
|
||||
int sx_radix_tree_aggregate(struct sx_radix_tree *tree);
|
||||
int sx_radix_tree_refine(struct sx_radix_tree *tree, unsigned refine);
|
||||
int sx_radix_tree_refineLow(struct sx_radix_tree *tree, unsigned refineLow);
|
||||
|
||||
#ifndef HAVE_STRLCPY
|
||||
size_t strlcpy(char* dst, const char* src, size_t size);
|
||||
size_t strlcpy(char *dst, const char *src, size_t size);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -24,11 +24,12 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
|
||||
#include "sx_slentry.h"
|
||||
#include "extern.h"
|
||||
|
||||
struct sx_slentry *
|
||||
sx_slentry_new(char *t)
|
||||
|
||||
Reference in New Issue
Block a user