21void* get_PIM_MSG(NetSim_PACKET* packet)
23 return (packet->pstruNetworkData->Packet_NetworkProtocol);
26void set_PIM_MSG(NetSim_PACKET* packet,
void* msg)
28 packet->pstruNetworkData->Packet_NetworkProtocol = msg;
31static int pimtype_to_ctrltype(PIMMSG type,
char* stype)
36 strcpy(stype,
"PIMMSG_Asset");
37 return PACKET_PIM_ASSERT;
39 case PIMMSG_Bootstrap:
40 strcpy(stype,
"PIMMSG_Bootstrap");
41 return PACKET_PIM_BOOTSTRAP;
43 case PIMMSG_CandidateRPAdvertisement:
44 strcpy(stype,
"PIMMSG_CandidateRPAdvertisement");
45 return PACKET_PIM_CANDRPADVER;
48 strcpy(stype,
"PIMMSG_Graft");
49 return PACKET_PIM_GRAFT;
52 strcpy(stype,
"PIMMSG_GraftAck");
53 return PACKET_PIM_GRAFTACK;
56 strcpy(stype,
"PIMMSG_Hello");
57 return PACKET_PIM_HELLO;
59 case PIMMSG_JoinPrune:
60 strcpy(stype,
"PIMMSG_JoinPrune");
61 return PACKET_PIM_JOINPRUNE;
64 strcpy(stype,
"PIMMSG_Register");
65 return PACKET_PIM_REGISTER;
67 case PIMMSG_RegisterStop:
68 strcpy(stype,
"PIMMSG_RegisterStop");
69 return PACKET_PIM_REGISTERSTOP;
72 fnNetSimError(
"Unknown pim msg type %d\n", type);
77static double get_pim_size(PIMMSG type)
82 return PIM_HDR_LEN + PIM_HELLO_LEN;
83 case PIMMSG_JoinPrune:
84 return PIM_HDR_LEN + PIM_JP_MSG_LEN;
86 fnNetSimError(
"Unknown PIM MSG %d in %s", type, __FUNCTION__);
91NetSim_PACKET* create_pim_packet(PIMMSG type,
95 NETSIM_IPAddress sourceAddrss,
98 NETSIM_IPAddress group,
101 NetSim_PACKET* packet = fn_NetSim_Packet_CreatePacket(NETWORK_LAYER);
102 set_PIM_MSG(packet, opt);
103 packet->nControlDataType = pimtype_to_ctrltype(type, packet->szPacketType);
105 packet->dEventTime = time;
106 packet->nPacketType = PacketType_Control;
107 packet->nSourceId = source;
108 packet->pstruNetworkData->dArrivalTime = time;
109 packet->pstruNetworkData->dEndTime = time;
110 packet->pstruNetworkData->dOverhead = get_pim_size(type);
111 packet->pstruNetworkData->dPacketSize = packet->pstruNetworkData->dOverhead +
112 packet->pstruNetworkData->dPayload;
113 packet->pstruNetworkData->dStartTime = time;
114 packet->pstruNetworkData->IPProtocol = IPPROTOCOL_PIM;
115 packet->pstruNetworkData->nNetworkProtocol = NW_PROTOCOL_IPV4;
116 packet->pstruNetworkData->nTTL = ttl;
117 packet->pstruNetworkData->szDestIP = group;
118 packet->pstruNetworkData->szSourceIP = sourceAddrss;
120 for (i = 0; i < destCount; i++)
121 add_dest_to_packet(packet, destList[i]);
125void send_pim_msg(NETSIM_ID d,
double time, NetSim_PACKET* packet)
127 NetSim_EVENTDETAILS pevent;
128 memset(&pevent, 0,
sizeof pevent);
129 pevent.dEventTime = time;
130 pevent.dPacketSize = packet->pstruNetworkData->dPacketSize;
131 if (packet->pstruAppData)
133 pevent.nApplicationId = packet->pstruAppData->nApplicationId;
134 pevent.nSegmentId = packet->pstruAppData->nSegmentId;
136 pevent.nDeviceId = d;
137 pevent.nDeviceType = DEVICE_TYPE(d);
138 pevent.nEventType = NETWORK_OUT_EVENT;
139 pevent.nPacketId = packet->nPacketId;
140 pevent.nProtocolId = NW_PROTOCOL_IPV4;
141 pevent.pPacket = packet;
142 fnpAddEvent(&pevent);
145void set_pim_hdr(ptrPIM_HDR hdr, PIMMSG type)
147 hdr->PIM_Ver = PIM_VER;
151ptrENCODED_UNICAST_ADDR encode_unicast_addr(NETSIM_IPAddress ip)
153 ptrENCODED_UNICAST_ADDR addr = calloc(1,
sizeof* addr);
154 addr->addrFamily = ip->IP.IPV4.byte1;
155 addr->encodingType = 1;
156 addr->unicastAddr = ip;
160static UINT8 get_masklen(NETSIM_IPAddress subnet)
162 char* bin = subnet->bin_ip;
164 while (*bin && *bin != 0)
172ptrENCODED_SOURCE_ADDR encode_source_addr(NETSIM_IPAddress ip, NETSIM_IPAddress subnet)
174 ptrENCODED_SOURCE_ADDR addr = calloc(1,
sizeof* addr);
175 addr->addrFamily = ip->IP.IPV4.byte1;
176 addr->encodingType = 1;
177 addr->SourceAddr = ip;
178 addr->maskLen = get_masklen(subnet);
182ptrENCODED_GROUP_ADDR encode_group_addr(NETSIM_IPAddress ip)
184 ptrENCODED_GROUP_ADDR addr = calloc(1,
sizeof* addr);
185 addr->addrFamily = ip->IP.IPV4.byte1;
186 addr->EncodingType = 1;
187 addr->GroupMulticastAddr = ip;