Compare commits
	
		
			No commits in common. "84ec123c75a4a35e48e27c6d0c09ea706301ee44" and "752d9ce8b51a672a0355c537ff13a3b958e84d88" have entirely different histories.
		
	
	
		
			84ec123c75
			...
			752d9ce8b5
		
	
		
							
								
								
									
										34
									
								
								trie/trie.c
								
								
								
								
							
							
						
						
									
										34
									
								
								trie/trie.c
								
								
								
								
							|  | @ -2,7 +2,7 @@ | |||
| 
 | ||||
| #define INPUT_FILE "../data/routing-data" | ||||
| #define READ_MODE "r" | ||||
| #define GET_BIT(key, bit) ( ( key.l[ bit / 64 ] & (1ul << (63 - bit % 64)) ) != 0 ) | ||||
| #define GET_BIT(key, bit) (( key[ bit / (sizeof(unsigned) * 8) ] & (1 << ((sizeof(unsigned) * 8 - 1) - (bit % (sizeof(unsigned) * 8)))) ) != 0 ) | ||||
| 
 | ||||
| 
 | ||||
| trie_node_t create_node() { | ||||
|  | @ -17,11 +17,11 @@ trie_holder_t create_holder() { | |||
|     return ret; | ||||
| } | ||||
| 
 | ||||
| int trie_insert(trie_holder_t t, ipv6_t key, int val, int mask) { | ||||
| int trie_insert(trie_holder_t t, const unsigned key[4], int val, int mask) { | ||||
|     trie_node_t iter = t->_root; | ||||
|     trie_node_t* next = &t->_root; | ||||
|     int i = 0; | ||||
| 
 | ||||
|      | ||||
|     for (;i <= 128 - mask; ++i) { | ||||
|         if (!*(next = GET_BIT(key, i) ? &iter->_l : &iter->_r)) | ||||
|             *next = create_node(); | ||||
|  | @ -30,10 +30,7 @@ int trie_insert(trie_holder_t t, ipv6_t key, int val, int mask) { | |||
|     } | ||||
|      | ||||
|     if (iter->_rule_valid == VALID_RULE) { | ||||
|         printf("WARNING: conflicting rule %x:%x:%x:%x:%x:%x:%x:%x",  | ||||
|             key.s[0], key.s[1], key.s[2], key.s[3], | ||||
|             key.s[4], key.s[5], key.s[6], key.s[7]); | ||||
|          | ||||
|         printf("WARNING: conflicting rule %x:%x:%x:%x", key[0], key[1], key[2], key[3]); | ||||
|         printf("/%d %d\n", mask, val); | ||||
|         return 0; | ||||
|     } | ||||
|  | @ -41,10 +38,12 @@ int trie_insert(trie_holder_t t, ipv6_t key, int val, int mask) { | |||
|     iter->_rule_valid = VALID_RULE; | ||||
|     iter->_rule = val; | ||||
| 
 | ||||
|     /* printf("inserted rule: %x:%x:%x:%x", key[0], key[1], key[2], key[3]); */ | ||||
|     /* printf("/%d %d\n", mask, val); */ | ||||
|     return 1; | ||||
| } | ||||
| 
 | ||||
| int trie_search(trie_holder_t t, ipv6_t key) { | ||||
| int trie_search(trie_holder_t t, const unsigned key[4]) { | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
|  | @ -52,24 +51,27 @@ int trie_search(trie_holder_t t, ipv6_t key) { | |||
| /*------------------------------------------------------------*/ | ||||
| 
 | ||||
| 
 | ||||
| int parse_line(ipv6_t* key, int* val, int* mask, FILE* f) { /*! assumes only good input */ | ||||
|     memset(key, 0, sizeof(ipv6_t)); | ||||
| 
 | ||||
|     fscanf(f, "%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx",  | ||||
|         &key->s[0], &key->s[1], &key->s[2], &key->s[3], &key->s[4], | ||||
|         &key->s[5], &key->s[6], &key->s[7]); | ||||
| int parse_line(unsigned key[4], int* val, int* mask, FILE* f) { /*! assumes only good input */ | ||||
|      | ||||
|     unsigned short* tmp = (unsigned short*)key; | ||||
|     memset(tmp, 0, sizeof(short[8])); | ||||
| 
 | ||||
|     fscanf(f, "%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx", &tmp[0], &tmp[1], &tmp[2], &tmp[3], &tmp[4], &tmp[5], &tmp[6], &tmp[7]); | ||||
|     if (feof(f)) return 0; /* ends with newline */ | ||||
|     while (fgetc(f) != '/'); | ||||
|      | ||||
|     fscanf(f, "%d %d", mask, val); | ||||
| 
 | ||||
|     /* printf("Loaded address: %x:%x:%x:%x", key[0], key[1], key[2], key[3]); */ | ||||
|     /* printf("/%d %d\n", *mask, *val); */ | ||||
| 
 | ||||
|     return !feof(f); | ||||
| } | ||||
| 
 | ||||
| int load_input(trie_holder_t t) { | ||||
|     int val; | ||||
|     int mask; | ||||
|     ipv6_t key; | ||||
|     unsigned key[4]; | ||||
| 
 | ||||
|     FILE* f; | ||||
|     int cnt = 0; | ||||
|  | @ -77,7 +79,7 @@ int load_input(trie_holder_t t) { | |||
|     if (!(f = fopen(INPUT_FILE, READ_MODE))) | ||||
|         perror("cant open input file"); | ||||
|      | ||||
|     while (parse_line(&key, &val, &mask, f)) { | ||||
|     while (parse_line(key, &val, &mask, f)) { | ||||
|         trie_insert(t, key, val, mask); | ||||
|         ++cnt; | ||||
|     } | ||||
|  |  | |||
|  | @ -7,8 +7,7 @@ | |||
| 
 | ||||
| union ipv6 { | ||||
|     unsigned short s[8]; | ||||
|     unsigned int   i[4]; | ||||
|     unsigned long  l[2]; | ||||
|     unsigned long l[2]; | ||||
| }; | ||||
| 
 | ||||
| #define VALID_RULE 1 | ||||
|  | @ -37,8 +36,8 @@ struct trie_node* create_node(); | |||
| int destory_holder(struct trie_holder*); | ||||
| int destory_node(struct trie_node*); | ||||
| 
 | ||||
| int trie_insert(struct trie_holder*, ipv6_t key, int val, int mask); | ||||
| rule_t trie_search(struct trie_holder*, ipv6_t key); | ||||
| int trie_insert(struct trie_holder*, const unsigned key[4], int val, int mask); | ||||
| rule_t trie_search(struct trie_holder*, const unsigned key[4]); | ||||
| 
 | ||||
| 
 | ||||
|   | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue