//\r
UINT32 mRouteAlertOption = 0x00000494;\r
\r
-\r
/**\r
Init the IGMP control data of the IP4 service instance, configure\r
MNP to receive ALL SYSTEM multicast.\r
**/\r
EFI_STATUS\r
Ip4InitIgmp (\r
- IN OUT IP4_SERVICE *IpSb\r
+ IN OUT IP4_SERVICE *IpSb\r
)\r
{\r
IGMP_SERVICE_DATA *IgmpCtrl;\r
//\r
// Configure MNP to receive ALL_SYSTEM multicast\r
//\r
- Group = AllocatePool (sizeof (IGMP_GROUP));\r
+ Group = AllocatePool (sizeof (IGMP_GROUP));\r
\r
if (Group == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
- Mnp = IpSb->Mnp;\r
+ Mnp = IpSb->Mnp;\r
\r
Group->Address = IP4_ALLSYSTEM_ADDRESS;\r
Group->RefCnt = 1;\r
return Status;\r
}\r
\r
-\r
/**\r
Find the IGMP_GROUP structure which contains the status of multicast\r
group Address in this IGMP control block\r
**/\r
IGMP_GROUP *\r
Ip4FindGroup (\r
- IN IGMP_SERVICE_DATA *IgmpCtrl,\r
- IN IP4_ADDR Address\r
+ IN IGMP_SERVICE_DATA *IgmpCtrl,\r
+ IN IP4_ADDR Address\r
)\r
{\r
- LIST_ENTRY *Entry;\r
- IGMP_GROUP *Group;\r
+ LIST_ENTRY *Entry;\r
+ IGMP_GROUP *Group;\r
\r
NET_LIST_FOR_EACH (Entry, &IgmpCtrl->Groups) {\r
Group = NET_LIST_USER_STRUCT (Entry, IGMP_GROUP, Link);\r
return NULL;\r
}\r
\r
-\r
/**\r
Count the number of IP4 multicast groups that are mapped to the\r
same MAC address. Several IP4 multicast address may be mapped to\r
**/\r
INTN\r
Ip4FindMac (\r
- IN IGMP_SERVICE_DATA *IgmpCtrl,\r
- IN EFI_MAC_ADDRESS *Mac\r
+ IN IGMP_SERVICE_DATA *IgmpCtrl,\r
+ IN EFI_MAC_ADDRESS *Mac\r
)\r
{\r
- LIST_ENTRY *Entry;\r
- IGMP_GROUP *Group;\r
- INTN Count;\r
+ LIST_ENTRY *Entry;\r
+ IGMP_GROUP *Group;\r
+ INTN Count;\r
\r
Count = 0;\r
\r
return Count;\r
}\r
\r
-\r
/**\r
Send an IGMP protocol message to the Dst, such as IGMP v1 membership report.\r
\r
**/\r
EFI_STATUS\r
Ip4SendIgmpMessage (\r
- IN IP4_SERVICE *IpSb,\r
- IN IP4_ADDR Dst,\r
- IN UINT8 Type,\r
- IN IP4_ADDR Group\r
+ IN IP4_SERVICE *IpSb,\r
+ IN IP4_ADDR Dst,\r
+ IN UINT8 Type,\r
+ IN IP4_ADDR Group\r
)\r
{\r
- IP4_HEAD Head;\r
- NET_BUF *Packet;\r
- IGMP_HEAD *Igmp;\r
+ IP4_HEAD Head;\r
+ NET_BUF *Packet;\r
+ IGMP_HEAD *Igmp;\r
\r
//\r
// Allocate a net buffer to hold the message\r
//\r
NetbufReserve (Packet, IP4_MAX_HEADLEN);\r
\r
- Igmp = (IGMP_HEAD *) NetbufAllocSpace (Packet, sizeof (IGMP_HEAD), FALSE);\r
+ Igmp = (IGMP_HEAD *)NetbufAllocSpace (Packet, sizeof (IGMP_HEAD), FALSE);\r
if (Igmp == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
Igmp->MaxRespTime = 0;\r
Igmp->Checksum = 0;\r
Igmp->Group = HTONL (Group);\r
- Igmp->Checksum = (UINT16) (~NetblockChecksum ((UINT8 *) Igmp, sizeof (IGMP_HEAD)));\r
+ Igmp->Checksum = (UINT16)(~NetblockChecksum ((UINT8 *)Igmp, sizeof (IGMP_HEAD)));\r
\r
- Head.Tos = 0;\r
- Head.Protocol = IP4_PROTO_IGMP;\r
- Head.Ttl = 1;\r
- Head.Fragment = 0;\r
- Head.Dst = Dst;\r
- Head.Src = IP4_ALLZERO_ADDRESS;\r
+ Head.Tos = 0;\r
+ Head.Protocol = IP4_PROTO_IGMP;\r
+ Head.Ttl = 1;\r
+ Head.Fragment = 0;\r
+ Head.Dst = Dst;\r
+ Head.Src = IP4_ALLZERO_ADDRESS;\r
\r
return Ip4Output (\r
IpSb,\r
NULL,\r
Packet,\r
&Head,\r
- (UINT8 *) &mRouteAlertOption,\r
+ (UINT8 *)&mRouteAlertOption,\r
sizeof (UINT32),\r
IP4_ALLZERO_ADDRESS,\r
Ip4SysPacketSent,\r
);\r
}\r
\r
-\r
/**\r
Send an IGMP membership report. Depends on whether the server is\r
v1 or v2, it will send either a V1 or V2 membership report.\r
**/\r
EFI_STATUS\r
Ip4SendIgmpReport (\r
- IN IP4_SERVICE *IpSb,\r
- IN IP4_ADDR Group\r
+ IN IP4_SERVICE *IpSb,\r
+ IN IP4_ADDR Group\r
)\r
{\r
if (IpSb->IgmpCtrl.Igmpv1QuerySeen != 0) {\r
}\r
}\r
\r
-\r
/**\r
Join the multicast group on behalf of this IP4 child\r
\r
**/\r
EFI_STATUS\r
Ip4JoinGroup (\r
- IN IP4_PROTOCOL *IpInstance,\r
- IN IP4_ADDR Address\r
+ IN IP4_PROTOCOL *IpInstance,\r
+ IN IP4_ADDR Address\r
)\r
{\r
EFI_MANAGED_NETWORK_PROTOCOL *Mnp;\r
IGMP_GROUP *Group;\r
EFI_STATUS Status;\r
\r
- IpSb = IpInstance->Service;\r
- IgmpCtrl = &IpSb->IgmpCtrl;\r
- Mnp = IpSb->Mnp;\r
+ IpSb = IpInstance->Service;\r
+ IgmpCtrl = &IpSb->IgmpCtrl;\r
+ Mnp = IpSb->Mnp;\r
\r
//\r
// If the IP service already is a member in the group, just\r
// increase the reference count and return.\r
//\r
- Group = Ip4FindGroup (IgmpCtrl, Address);\r
+ Group = Ip4FindGroup (IgmpCtrl, Address);\r
\r
if (Group != NULL) {\r
Group->RefCnt++;\r
return Status;\r
}\r
\r
-\r
/**\r
Leave the IP4 multicast group on behalf of IpInstance.\r
\r
**/\r
EFI_STATUS\r
Ip4LeaveGroup (\r
- IN IP4_PROTOCOL *IpInstance,\r
- IN IP4_ADDR Address\r
+ IN IP4_PROTOCOL *IpInstance,\r
+ IN IP4_ADDR Address\r
)\r
{\r
EFI_MANAGED_NETWORK_PROTOCOL *Mnp;\r
IGMP_GROUP *Group;\r
EFI_STATUS Status;\r
\r
- IpSb = IpInstance->Service;\r
- IgmpCtrl = &IpSb->IgmpCtrl;\r
- Mnp = IpSb->Mnp;\r
+ IpSb = IpInstance->Service;\r
+ IgmpCtrl = &IpSb->IgmpCtrl;\r
+ Mnp = IpSb->Mnp;\r
\r
- Group = Ip4FindGroup (IgmpCtrl, Address);\r
+ Group = Ip4FindGroup (IgmpCtrl, Address);\r
\r
if (Group == NULL) {\r
return EFI_NOT_FOUND;\r
// Send a leave report if the membership is reported by us\r
// and we are talking IGMPv2.\r
//\r
- if (Group->ReportByUs && IgmpCtrl->Igmpv1QuerySeen == 0) {\r
+ if (Group->ReportByUs && (IgmpCtrl->Igmpv1QuerySeen == 0)) {\r
Ip4SendIgmpMessage (IpSb, IP4_ALLROUTER_ADDRESS, IGMP_LEAVE_GROUP, Group->Address);\r
}\r
\r
return EFI_SUCCESS;\r
}\r
\r
-\r
/**\r
Handle the received IGMP message for the IP4 service instance.\r
\r
**/\r
EFI_STATUS\r
Ip4IgmpHandle (\r
- IN IP4_SERVICE *IpSb,\r
- IN IP4_HEAD *Head,\r
- IN NET_BUF *Packet\r
+ IN IP4_SERVICE *IpSb,\r
+ IN IP4_HEAD *Head,\r
+ IN NET_BUF *Packet\r
)\r
{\r
- IGMP_SERVICE_DATA *IgmpCtrl;\r
- IGMP_HEAD Igmp;\r
- IGMP_GROUP *Group;\r
- IP4_ADDR Address;\r
- LIST_ENTRY *Entry;\r
+ IGMP_SERVICE_DATA *IgmpCtrl;\r
+ IGMP_HEAD Igmp;\r
+ IGMP_GROUP *Group;\r
+ IP4_ADDR Address;\r
+ LIST_ENTRY *Entry;\r
\r
IgmpCtrl = &IpSb->IgmpCtrl;\r
\r
NetbufCopy (Packet, 0, sizeof (IGMP_HEAD), (UINT8 *)&Igmp);\r
\r
switch (Igmp.Type) {\r
- case IGMP_MEMBERSHIP_QUERY:\r
- //\r
- // If MaxRespTime is zero, it is most likely that we are\r
- // talking to a V1 router\r
- //\r
- if (Igmp.MaxRespTime == 0) {\r
- IgmpCtrl->Igmpv1QuerySeen = IGMP_V1ROUTER_PRESENT;\r
- Igmp.MaxRespTime = 100;\r
- }\r
+ case IGMP_MEMBERSHIP_QUERY:\r
+ //\r
+ // If MaxRespTime is zero, it is most likely that we are\r
+ // talking to a V1 router\r
+ //\r
+ if (Igmp.MaxRespTime == 0) {\r
+ IgmpCtrl->Igmpv1QuerySeen = IGMP_V1ROUTER_PRESENT;\r
+ Igmp.MaxRespTime = 100;\r
+ }\r
\r
- //\r
- // Igmp is ticking once per second but MaxRespTime is in\r
- // the unit of 100ms.\r
- //\r
- Igmp.MaxRespTime /= 10;\r
- Address = NTOHL (Igmp.Group);\r
+ //\r
+ // Igmp is ticking once per second but MaxRespTime is in\r
+ // the unit of 100ms.\r
+ //\r
+ Igmp.MaxRespTime /= 10;\r
+ Address = NTOHL (Igmp.Group);\r
\r
- if (Address == IP4_ALLSYSTEM_ADDRESS) {\r
- break;\r
- }\r
+ if (Address == IP4_ALLSYSTEM_ADDRESS) {\r
+ break;\r
+ }\r
\r
- NET_LIST_FOR_EACH (Entry, &IgmpCtrl->Groups) {\r
- Group = NET_LIST_USER_STRUCT (Entry, IGMP_GROUP, Link);\r
+ NET_LIST_FOR_EACH (Entry, &IgmpCtrl->Groups) {\r
+ Group = NET_LIST_USER_STRUCT (Entry, IGMP_GROUP, Link);\r
\r
- //\r
- // If address is all zero, all the memberships will be reported.\r
- // otherwise only one is reported.\r
- //\r
- if ((Address == IP4_ALLZERO_ADDRESS) || (Address == Group->Address)) {\r
//\r
- // If the timer is pending, only update it if the time left\r
- // is longer than the MaxRespTime. TODO: randomize the DelayTime.\r
+ // If address is all zero, all the memberships will be reported.\r
+ // otherwise only one is reported.\r
//\r
- if ((Group->DelayTime == 0) || (Group->DelayTime > Igmp.MaxRespTime)) {\r
- Group->DelayTime = MAX (1, Igmp.MaxRespTime);\r
+ if ((Address == IP4_ALLZERO_ADDRESS) || (Address == Group->Address)) {\r
+ //\r
+ // If the timer is pending, only update it if the time left\r
+ // is longer than the MaxRespTime. TODO: randomize the DelayTime.\r
+ //\r
+ if ((Group->DelayTime == 0) || (Group->DelayTime > Igmp.MaxRespTime)) {\r
+ Group->DelayTime = MAX (1, Igmp.MaxRespTime);\r
+ }\r
}\r
}\r
- }\r
\r
- break;\r
+ break;\r
\r
- case IGMP_V1_MEMBERSHIP_REPORT:\r
- case IGMP_V2_MEMBERSHIP_REPORT:\r
- Address = NTOHL (Igmp.Group);\r
- Group = Ip4FindGroup (IgmpCtrl, Address);\r
+ case IGMP_V1_MEMBERSHIP_REPORT:\r
+ case IGMP_V2_MEMBERSHIP_REPORT:\r
+ Address = NTOHL (Igmp.Group);\r
+ Group = Ip4FindGroup (IgmpCtrl, Address);\r
\r
- if ((Group != NULL) && (Group->DelayTime > 0)) {\r
- Group->DelayTime = 0;\r
- Group->ReportByUs = FALSE;\r
- }\r
+ if ((Group != NULL) && (Group->DelayTime > 0)) {\r
+ Group->DelayTime = 0;\r
+ Group->ReportByUs = FALSE;\r
+ }\r
\r
- break;\r
+ break;\r
}\r
\r
NetbufFree (Packet);\r
return EFI_SUCCESS;\r
}\r
\r
-\r
/**\r
The periodical timer function for IGMP. It does the following\r
things:\r
**/\r
VOID\r
Ip4IgmpTicking (\r
- IN IP4_SERVICE *IpSb\r
+ IN IP4_SERVICE *IpSb\r
)\r
{\r
- IGMP_SERVICE_DATA *IgmpCtrl;\r
- LIST_ENTRY *Entry;\r
- IGMP_GROUP *Group;\r
+ IGMP_SERVICE_DATA *IgmpCtrl;\r
+ LIST_ENTRY *Entry;\r
+ IGMP_GROUP *Group;\r
\r
IgmpCtrl = &IpSb->IgmpCtrl;\r
\r
}\r
}\r
\r
-\r
/**\r
Add a group address to the array of group addresses.\r
The caller should make sure that no duplicated address\r
**/\r
IP4_ADDR *\r
Ip4CombineGroups (\r
- IN IP4_ADDR *Source,\r
- IN UINT32 Count,\r
- IN IP4_ADDR Addr\r
+ IN IP4_ADDR *Source,\r
+ IN UINT32 Count,\r
+ IN IP4_ADDR Addr\r
)\r
{\r
- IP4_ADDR *Groups;\r
+ IP4_ADDR *Groups;\r
\r
Groups = AllocatePool (sizeof (IP4_ADDR) * (Count + 1));\r
\r
return Groups;\r
}\r
\r
-\r
/**\r
Remove a group address from the array of group addresses.\r
Although the function doesn't assume the byte order of the\r
**/\r
INTN\r
Ip4RemoveGroupAddr (\r
- IN OUT IP4_ADDR *Groups,\r
- IN UINT32 Count,\r
- IN IP4_ADDR Addr\r
+ IN OUT IP4_ADDR *Groups,\r
+ IN UINT32 Count,\r
+ IN IP4_ADDR Addr\r
)\r
{\r
- UINT32 Index;\r
+ UINT32 Index;\r
\r
for (Index = 0; Index < Count; Index++) {\r
if (Groups[Index] == Addr) {\r