Modules/IPStack - Add structure for propagating ICMP errors
[tpg/acess2.git] / KernelLand / Modules / IPStack / icmp.c
index f1355fa..f34d790 100644 (file)
@@ -26,7 +26,7 @@ struct {
  */
 void ICMP_Initialise()
 {
-       IPv4_RegisterCallback(IP4PROT_ICMP, ICMP_GetPacket);
+       IPv4_RegisterCallback(IP4PROT_ICMP, ICMP_GetPacket, NULL);
 }
 
 /**
@@ -64,12 +64,15 @@ void ICMP_GetPacket(tInterface *Interface, void *Address, int Length, void *Buff
                {
                case 3: // Port Unreachable
                        Log_Debug("ICMPv4", "Destination Unreachable (Port Unreachable)");
+                       IPv4_HandleError( Interface, IPERR_PORT_UNREACHABLE,
+                               htons(Length)-sizeof(tICMPHeader), hdr->Data );
                        break;
                default:
                        Log_Debug("ICMPv4", "Destination Unreachable (Code %i)", hdr->Code);
+                       IPv4_HandleError( Interface, IPERR_MISC,
+                               htons(Length)-sizeof(tICMPHeader), hdr->Data );
                        break;
                }
-//             IPv4_Unreachable( Interface, hdr->Code, htons(hdr->Length)-sizeof(tICMPHeader), hdr->Data );
                break;
        
        // -- 8: Echo Request
@@ -87,7 +90,6 @@ void ICMP_GetPacket(tInterface *Interface, void *Address, int Length, void *Buff
                tIPStackBuffer  *buffer = IPStack_Buffer_CreateBuffer(1 + IPV4_BUFFERS);
                IPStack_Buffer_AppendSubBuffer(buffer, Length, 0, hdr, NULL, NULL);
                IPv4_SendPacket(Interface, *(tIPv4*)Address, 1, ntohs(hdr->Sequence), buffer);
-               IPStack_Buffer_DestroyBuffer(buffer);
                break;
        default:
                break;
@@ -121,19 +123,18 @@ int ICMP_Ping(tInterface *Interface, tIPv4 Addr)
        gICMP_PingSlots[i].bArrived = 0;
        hdr->ID = i;
        hdr->Sequence = ~i;
-       hdr->Checksum = htons( IPv4_Checksum((Uint16*)hdr, sizeof(buf)/2) );
+       hdr->Checksum = htons( IPv4_Checksum((Uint16*)buf, sizeof(buf)) );
        
        ts = now();
        
        tIPStackBuffer  *buffer = IPStack_Buffer_CreateBuffer(1 + IPV4_BUFFERS);
        IPStack_Buffer_AppendSubBuffer(buffer, sizeof(buf), 0, buf, NULL, NULL);
        IPv4_SendPacket(Interface, Addr, 1, i, buffer);
-       IPStack_Buffer_DestroyBuffer(buffer);
        
        end = ts + Interface->TimeoutDelay;
        while( !gICMP_PingSlots[i].bArrived && now() < end)     Threads_Yield();
        
-       if(now() > end)
+       if( !gICMP_PingSlots[i].bArrived )
                return -1;
        
        return (int)( now() - ts );

UCC git Repository :: git.ucc.asn.au