1 | /*************************************** 2 | $Revision: 1.2 $ 3 | 4 | Functions to interface with RX module (create/update rx-nodes) 5 | 6 | Status: NOT REVUED, NOT TESTED 7 | 8 | Author(s): Andrei Robachevsky 9 | 10 | ******************/ /****************** 11 | Modification History: 12 | andrei (17/01/2000) Created. 13 | ******************/ /****************** 14 | Copyright (c) 2000 RIPE NCC 15 | 16 | All Rights Reserved 17 | 18 | Permission to use, copy, modify, and distribute this software and its 19 | documentation for any purpose and without fee is hereby granted, 20 | provided that the above copyright notice appear in all copies and that 21 | both that copyright notice and this permission notice appear in 22 | supporting documentation, and that the name of the author not be 23 | used in advertising or publicity pertaining to distribution of the 24 | software without specific, written prior permission. 25 | 26 | THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 27 | ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL 28 | AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY 29 | DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 30 | AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 31 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 32 | ***************************************/ 33 | #include "ud_int.h" 34 | #include "rxroutines.h" 35 | 36 | void save_rx_pref(rx_bin_data_t *rx_data, unsigned int prefix, unsigned int prefix_length) 37 | { 38 | ip_prefix_t *myprefptr = &(rx_data->mypref); 39 | 40 | memset(myprefptr, 0, sizeof(ip_prefix_t)); 41 | myprefptr->ip.space = IP_V4; 42 | myprefptr->ip.words[0] = prefix; 43 | myprefptr->bits = prefix_length; 44 | 45 | } 46 | 47 | void save_rx_orig(rx_bin_data_t *rx_data, char *origin) 48 | { 49 | rx_data->origin = origin; 50 | } 51 | 52 | 53 | void save_rx_rang(rx_inum_data_t *rx_data, unsigned int begin_in, unsigned int end_in) 54 | { 55 | ip_range_t *myrangptr = &(rx_data->myrang); 56 | 57 | memset(myrangptr, 0, sizeof(ip_range_t)); 58 | myrangptr->begin.space = myrangptr->end.space = IP_V4; 59 | myrangptr->begin.words[0] = begin_in; 60 | myrangptr->end.words[0] = end_in; 61 | 62 | } 63 | 64 | 65 | int update_rx_inum(rx_oper_mt mode, rx_tree_t *mytree, rx_inum_data_t *rx_data, long in_id) 66 | { 67 | ip_range_t *myrangptr = &(rx_data->myrang); 68 | rx_dataleaf_t *leafptr; 69 | char prstr[IP_RANGSTR_MAX]; 70 | 71 | if( wr_calloc( (void **)& leafptr, sizeof(rx_dataleaf_t), 1) != UT_OK) return(-1); 72 | 73 | leafptr->data_key = in_id; 74 | 75 | if(mode != RX_OPER_DEL) { 76 | if( IP_rang_b2a( myrangptr, prstr, IP_RANGSTR_MAX) != IP_OK ) return(-1); 77 | 78 | #define PAYLOAD_INETNUM_LENGTH strlen("inetnum:\t\n") 79 | 80 | leafptr->data_len = PAYLOAD_INETNUM_LENGTH + 1 + strlen(prstr); 81 | if( wr_calloc( (void **) & leafptr->data_ptr, leafptr->data_len, 1) != UT_OK) return(-1); 82 | 83 | if( snprintf(leafptr->data_ptr, leafptr->data_len, 84 | "inetnum:\t%s\n", prstr ) > leafptr->data_len ) return(-1); 85 | } 86 | 87 | 88 | if( RX_inum_node( mode, myrangptr, mytree, leafptr ) != RX_OK ) { 89 | fprintf(stderr,"%ld\t%s\n", in_id, prstr); 90 | return(-1); 91 | } 92 | 93 | return(0); 94 | } 95 | 96 | 97 | 98 | int update_rx_bin(rx_oper_mt mode, rx_tree_t *mytree, rx_bin_data_t *rx_data, long rt_id) 99 | { 100 | rx_dataleaf_t *leafptr; 101 | ip_prefix_t *myprefptr = &(rx_data->mypref); 102 | char prstr[IP_PREFSTR_MAX]; 103 | 104 | 105 | if( wr_calloc( (void **)& leafptr, sizeof(rx_dataleaf_t), 1) != UT_OK) return(-1); 106 | 107 | leafptr->data_key = rt_id; 108 | 109 | if(mode != RX_OPER_DEL) { 110 | if( IP_pref_b2a( myprefptr, prstr, IP_PREFSTR_MAX) != IP_OK ) return(-1); 111 | 112 | #define PAYLOAD_ROUTE_LENGTH strlen("route:\t/\norigin:\t\n") 113 | 114 | leafptr->data_len = PAYLOAD_ROUTE_LENGTH + 1 115 | + strlen(prstr) + strlen(rx_data->origin); 116 | 117 | if( wr_calloc( (void **) & leafptr->data_ptr, leafptr->data_len, 1)!= UT_OK) return(-1); 118 | 119 | if( snprintf(leafptr->data_ptr, leafptr->data_len, 120 | "route:\t%s\norigin:\t%s\n", prstr, rx_data->origin ) > leafptr->data_len ) return(-1); 121 | } 122 | 123 | if( RX_bin_node( mode, myprefptr, mytree, leafptr ) != RX_OK ) { 124 | fprintf(stderr,"%ld\t%s\n", rt_id, rx_data->origin); 125 | return(-1); 126 | } 127 | 128 | return(0); 129 | } 130 |