Net-BGPdump

 view release on metacpan or  search on metacpan

BGPdump.xs  view on Meta::CPAN

    MC(BGPDUMP_SUBTYPE_ZEBRA_BGP_STATE_CHANGE_AS4);

    // BGP states
    MC(BGP_STATE_IDLE);
    MC(BGP_STATE_CONNECT);
    MC(BGP_STATE_ACTIVE);
    MC(BGP_STATE_OPENSENT);
    MC(BGP_STATE_OPENCONFIRM);
    MC(BGP_STATE_ESTABLISHED);

    // zebra message types
    MC(BGP_MSG_UPDATE);
    MC(BGP_MSG_OPEN);
    MC(BGP_MSG_NOTIFY);
    MC(BGP_MSG_KEEPALIVE);
    MC(BGP_MSG_ROUTE_REFRESH_01);
    MC(BGP_MSG_ROUTE_REFRESH);
}

Net::BGPdump
_open(class, filename)
    char *class
    char *filename
    CODE:
    PERL_UNUSED_VAR(class);
    RETVAL = bgpdump_open_dump(filename);
    OUTPUT:
    RETVAL

void
close(THIS)
    Net::BGPdump THIS
    CODE:
    cfr_close(THIS->f);

void
_destroy(THIS)
    Net::BGPdump THIS
    CODE:
    bgpdump_close_dump(THIS);

int
closed(THIS)
    Net::BGPdump THIS
    CODE:
    RETVAL = THIS->f->closed;
    OUTPUT:
    RETVAL

int
eof(THIS)
    Net::BGPdump THIS
    CODE:
    RETVAL = THIS->eof;
    OUTPUT:
    RETVAL

void
file_type(THIS)
    Net::BGPdump THIS
    PPCODE:
    switch (THIS->f->format) {
        case 0:
            // not opened
            break;
        case 1:
            mXPUSHs(newSVpv("uncompressed", 0));
            break;
        case 2:
            mXPUSHs(newSVpv("bzip2", 0));
            break;
        case 3:
            mXPUSHs(newSVpv("gzip", 0));
            break;
        default:
            croak("unknown file format: %d", THIS->f->format);
    }

int
records(THIS)
    Net::BGPdump THIS
    CODE:
    RETVAL = THIS->parsed;
    OUTPUT:
    RETVAL

int
parsed_ok(THIS)
    Net::BGPdump THIS
    CODE:
    RETVAL = THIS->parsed_ok;
    OUTPUT:
    RETVAL

int
parsed_fail(THIS)
    Net::BGPdump THIS
    CODE:
    RETVAL = THIS->parsed - THIS->parsed_ok;
    OUTPUT:
    RETVAL

char *
filename(THIS)
    Net::BGPdump THIS
    CODE:
    RETVAL = THIS->filename;
    OUTPUT:
    RETVAL

void
filter_read(THIS, ipv6, lo_time, hi_time)
    Net::BGPdump THIS
    int    ipv6
    time_t lo_time
    time_t hi_time
    PREINIT:
    BGPDUMP_ENTRY *entry;
    PPCODE:
    do {
        entry = bgpdump_read_next(THIS);
        if (entry == NULL)
            continue;
        if (lo_time > 0 && entry->time < lo_time)
            goto next_entry;
        if (hi_time > 0 && entry->time >= hi_time)
            goto next_entry;
        switch(entry->type) {
            case BGPDUMP_TYPE_MRTD_BGP:
                mXPUSHs(_xs_mrtd_bgp_build(aTHX_ entry));
                break;
            case BGPDUMP_TYPE_ZEBRA_BGP:
                if (ipv6 >= 0) {
                    switch(entry->subtype)
                    {
                        case BGPDUMP_SUBTYPE_ZEBRA_BGP_MESSAGE:
                        case BGPDUMP_SUBTYPE_ZEBRA_BGP_MESSAGE_AS4:
                            switch(entry->body.zebra_message.address_family)
                            {
#ifdef BGPDUMP_HAVE_IPV6
                                case AFI_IP6:
                                    if (ipv6 == 0)
                                        goto next_entry;
                                    break;
#endif
                                case AFI_IP:
                                default:
                                    if (ipv6 != 0)
                                        goto next_entry;
                                    break;
                            }
                            break;
                        case BGPDUMP_SUBTYPE_ZEBRA_BGP_STATE_CHANGE:
                        case BGPDUMP_SUBTYPE_ZEBRA_BGP_STATE_CHANGE_AS4:
                            switch(entry->body.zebra_state_change.address_family)
                            {
#ifdef BGPDUMP_HAVE_IPV6
                                case AFI_IP6:
                                    if (ipv6 == 0)
                                        goto next_entry;
                                    break;
#endif
                                case AFI_IP:
                                default:
                                    if (ipv6 != 0)
                                        goto next_entry;
                                    break;
                            }
                            break;
                    }
                }
                mXPUSHs(_xs_zebra_bgp_build(aTHX_ entry));
                break;
            case BGPDUMP_TYPE_TABLE_DUMP_V2:
                if (ipv6 >= 0) {
                    switch (entry->subtype)
                    {
                        case BGPDUMP_SUBTYPE_TABLE_DUMP_V2_RIB_IPV6_UNICAST:
                        case BGPDUMP_SUBTYPE_TABLE_DUMP_V2_RIB_IPV6_MULTICAST:

BGPdump.xs  view on Meta::CPAN

                            if (ipv6 != 0)
                                goto next_entry;
                            break;
                    }
                    BGPDUMP_TABLE_DUMP_V2_PREFIX *e;
                    e = &entry->body.mrtd_table_dump_v2_prefix;
                    if (e->afi == AFI_IP) {
                        if (ipv6 != 0)
                            goto next_entry;
#ifdef BGPDUMP_HAVE_IPV6
                    }
                    else if (e->afi == AFI_IP6) {
                        if (ipv6 == 0)
                            goto next_entry;
#endif
                    }
                }
                mXPUSHs(_xs_table_dump_v2_build(aTHX_ entry));
                break;
            case BGPDUMP_TYPE_MRTD_TABLE_DUMP:
                if (ipv6 >= 0) {
                    switch(entry->subtype) {
#ifdef BGPDUMP_HAVE_IPV6
                        case BGPDUMP_SUBTYPE_MRTD_TABLE_DUMP_AFI_IP6:
                        case BGPDUMP_SUBTYPE_MRTD_TABLE_DUMP_AFI_IP6_32BIT_AS:
                            if (ipv6 == 0)
                                goto next_entry;
                            break;
#endif
                        case BGPDUMP_SUBTYPE_MRTD_TABLE_DUMP_AFI_IP:
                        case BGPDUMP_SUBTYPE_MRTD_TABLE_DUMP_AFI_IP_32BIT_AS:
                            if (ipv6 != 0)
                                goto next_entry;
                            break;
                    }
                }
                mXPUSHs(_xs_mrtd_table_dump_build(aTHX_ entry));
                break;
            default:
                warn("error: unknown entry type %d\n", entry->type);
        }
        bgpdump_free_mem(entry);
        entry = NULL;
        break;
      next_entry:
        bgpdump_free_mem(entry);
        entry = NULL;
        continue;
    } while (THIS->eof == 0);
    entry = NULL;
    // return

void
filter_message_read(THIS, ipv6, lo_time, hi_time)
    Net::BGPdump THIS
    int    ipv6
    time_t lo_time
    time_t hi_time
    PREINIT:
    BGPDUMP_ENTRY *entry;
    PPCODE:
    do {
        entry = bgpdump_read_next(THIS);
        if (entry == NULL)
            continue;
        if (lo_time > 0 && entry->time < lo_time)
            goto next_entry;
        if (hi_time > 0 && entry->time >= hi_time)
            goto next_entry;
        switch(entry->type) {
            case BGPDUMP_TYPE_MRTD_BGP:
                if (entry->subtype != BGPDUMP_SUBTYPE_MRTD_BGP_UPDATE)
                    goto next_entry;
                mXPUSHs(_xs_mrtd_bgp_build(aTHX_ entry));
                break;
            case BGPDUMP_TYPE_ZEBRA_BGP:
                if ((entry->subtype == BGPDUMP_SUBTYPE_ZEBRA_BGP_MESSAGE) || 
                    (entry->subtype == BGPDUMP_SUBTYPE_ZEBRA_BGP_MESSAGE_AS4))
                {
                    if (entry->body.zebra_message.type != BGP_MSG_UPDATE)
                        goto next_entry;
                }
                else
                    goto next_entry;
                if (ipv6 >= 0) {
                    switch(entry->body.zebra_message.address_family) {
#ifdef BGPDUMP_HAVE_IPV6
                        case AFI_IP6:
                            if (ipv6 == 0)
                                goto next_entry;
                            break;
#endif
                            case AFI_IP:
                            default:
                                if (ipv6 != 0)
                                    goto next_entry;
                                break;
                    }
                }
                mXPUSHs(_xs_zebra_bgp_build(aTHX_ entry));
                break;
            case BGPDUMP_TYPE_TABLE_DUMP_V2:
                if (ipv6 >= 0) {
                    switch (entry->subtype)
                    {
                        case BGPDUMP_SUBTYPE_TABLE_DUMP_V2_RIB_IPV6_UNICAST:
                        case BGPDUMP_SUBTYPE_TABLE_DUMP_V2_RIB_IPV6_MULTICAST:
                        case BGPDUMP_PEERTYPE_TABLE_DUMP_V2_AFI_IP6:
                            if (ipv6 == 0)
                                goto next_entry;
                            break;
                        case BGPDUMP_SUBTYPE_TABLE_DUMP_V2_RIB_IPV4_UNICAST:
                        case BGPDUMP_SUBTYPE_TABLE_DUMP_V2_RIB_IPV4_MULTICAST:
                        case BGPDUMP_PEERTYPE_TABLE_DUMP_V2_AFI_IP:
                            if (ipv6 != 0)
                                goto next_entry;
                            break;
                    }
                    BGPDUMP_TABLE_DUMP_V2_PREFIX *e;
                    e = &entry->body.mrtd_table_dump_v2_prefix;
                    if (e->afi == AFI_IP) {



( run in 1.199 second using v1.01-cache-2.11-cpan-5511b514fd6 )