25 NETSIM_IPAddress dest;
26 ptrIP_ROUTINGTABLE table;
28}PIM_ROUTE, *ptrPIM_ROUTE;
29#define PIM_ROUTE_ALLOC() (ptrPIM_ROUTE)list_alloc(sizeof(PIM_ROUTE),offsetof(PIM_ROUTE,ele))
30#define PIM_ROUTE_ADD(ls,m) LIST_ADD_LAST((void**)ls,m)
31#define PIM_ROUTE_NEXT(m) (m = LIST_NEXT(m))
32static ptrPIM_ROUTE pimRoute = NULL;
34static ptrPIM_ROUTE find_route(NETSIM_ID d, NETSIM_ID i, NETSIM_IPAddress dest)
36 ptrPIM_ROUTE r = pimRoute;
42 !IP_COMPARE(r->dest, dest))
54 for (k = 0; k < r->interfaceCount; k++)
56 if (r->ifList[k] == i)
72void pim_route_add(NETSIM_ID d,
75 NETSIM_IPAddress dest)
77 ptrPIM_ROUTE r = find_route(d, i, dest);
80 r->table->Metric = metric;
85 r = find_route(d, 0, dest);
89 UINT c = r->table->interfaceCount;
90 NETSIM_IPAddress* addr = r->table->Interface;
91 NETSIM_ID*
id = r->table->nInterfaceId;
92 NETSIM_ID* rid = r->ifList;
94 addr = realloc(addr, (c + 1) *
sizeof* addr);
95 addr[c] = IP_COPY(DEVICE_NWADDRESS(d, i));
96 r->table->Interface = addr;
98 id = realloc(
id, (c + 1) *
sizeof*
id);
100 r->table->nInterfaceId = id;
102 rid = realloc(rid, (c + 1) *
sizeof* rid);
108 r->table->interfaceCount++;
110 r->table->Metric = metric;
115 NETSIM_IPAddress* addr;
119 r = PIM_ROUTE_ALLOC();
120 PIM_ROUTE_ADD(&pimRoute, r);
127 id = calloc(1,
sizeof*
id);
128 addr = calloc(1,
sizeof* addr);
130 addr[0] = IP_COPY(DEVICE_NWADDRESS(d, i));
131 r->interfaceCount = 1;
132 r->ifList = calloc(1,
sizeof* r->ifList);
137 c = DEVICE(d)->nNumOfInterface;
138 id = calloc(c,
sizeof*
id);
139 addr = calloc(c,
sizeof* addr);
140 r->interfaceCount = c;
141 r->ifList = calloc(c,
sizeof* r->ifList);
143 for (k = 0; k < c; k++)
146 addr[k] = IP_COPY(DEVICE_NWADDRESS(d, k + 1));
147 r->ifList[k] = k + 1;
151 r->table = iptable_add(IP_WRAPPER_GET(d),
153 STR_TO_IP4(
"255.255.255.255"),
165NETSIM_IPAddress pimroute_find_nexthop(NETSIM_ID d, NETSIM_IPAddress dest)
168 NetSim_PACKET* packet = fn_NetSim_Packet_CreatePacket(NETWORK_LAYER);
169 packet->pstruNetworkData->szDestIP = dest;
170 packet->pstruNetworkData->szSourceIP = DEVICE_NWADDRESS(d, 1);
172 ptrIP_FORWARD_ROUTE route = fn_NetSim_IP_RoutePacket(packet, d);
173 NETSIM_IPAddress next = NULL;
176 fnNetSimError(
"Unicast route is not found for dest %s from %s. Please check/enable routing protocol.",
178 packet->pstruNetworkData->szSourceIP->str_ip);
182 next = route->nextHop[0];
185 fn_NetSim_Packet_FreePacket(packet);