void local_dump() { int i, rc; struct neighbour *neigh; const char *header = "BABEL 0.0\n"; if(local_socket < 0) return; rc = write_timeout(local_socket, header, strlen(header)); if(rc < 0) goto fail; local_notify_self(); FOR_ALL_NEIGHBOURS(neigh) { local_notify_neighbour(neigh, LOCAL_ADD); } for(i = 0; i < numxroutes; i++) local_notify_xroute(&xroutes[i], LOCAL_ADD); for(i = 0; i < numroutes; i++) local_notify_route(&routes[i], LOCAL_ADD); return; fail: shutdown(local_socket, 1); return; }
void flush_xroute(struct xroute *xroute) { int i; i = xroute - xroutes; assert(i >= 0 && i < numxroutes); local_notify_xroute(xroute, LOCAL_FLUSH); if(i != numxroutes - 1) memcpy(xroutes + i, xroutes + numxroutes - 1, sizeof(struct xroute)); numxroutes--; VALGRIND_MAKE_MEM_UNDEFINED(xroutes + numxroutes, sizeof(struct xroute)); if(numxroutes == 0) { free(xroutes); xroutes = NULL; maxxroutes = 0; } else if(maxxroutes > 8 && numxroutes < maxxroutes / 4) { struct xroute *new_xroutes; int n = maxxroutes / 2; new_xroutes = realloc(xroutes, n * sizeof(struct xroute)); if(new_xroutes == NULL) return; xroutes = new_xroutes; maxxroutes = n; } }
int add_xroute(unsigned char prefix[16], unsigned char plen, unsigned char src_prefix[16], unsigned char src_plen, unsigned short metric, unsigned int ifindex, int proto) { struct xroute *xroute = find_xroute(prefix, plen, src_prefix, src_plen); if(xroute) { if(xroute->metric <= metric) return 0; xroute->metric = metric; local_notify_xroute(xroute, LOCAL_CHANGE); return 1; } if(numxroutes >= maxxroutes) { struct xroute *new_xroutes; int n = maxxroutes < 1 ? 8 : 2 * maxxroutes; new_xroutes = xroutes == NULL ? malloc(n * sizeof(struct xroute)) : realloc(xroutes, n * sizeof(struct xroute)); if(new_xroutes == NULL) return -1; maxxroutes = n; xroutes = new_xroutes; } memcpy(xroutes[numxroutes].prefix, prefix, 16); xroutes[numxroutes].plen = plen; memcpy(xroutes[numxroutes].src_prefix, src_prefix, 16); xroutes[numxroutes].src_plen = src_plen; xroutes[numxroutes].metric = metric; xroutes[numxroutes].ifindex = ifindex; xroutes[numxroutes].proto = proto; numxroutes++; local_notify_xroute(&xroutes[numxroutes - 1], LOCAL_ADD); return 1; }