Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Pleae make sure the code is compiled and include comments of explanation. Thank

ID: 3597827 • Letter: P

Question

Pleae make sure the code is compiled and include comments of explanation. Thank you in andvance.

Take the height-balanced tree code, and add a function

int depth distribution(tree node t *tree);

which prints the total number of leaves, and a table giving the number of leaves at

different depths. The depth of a tree node is the distance from the root, so the root

has depth 0. Send only the code of your function, do not include my height-balanced

tree code. The programming language is C or C++; test your code before submission

using the gcc or g++ compiler.

Explanation / Answer

void raw_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p)

{                                                                                                                                           {

        u_int length = h->len;

        u_int caplen = h->caplen;

        /* At this point we start extracting data from the packet, with the var idx keeping up with where we are in the packet */

        // Print total packet size

        printf(" Packet Length %d bytes", h->len);

                // Decode Ethernet (Layer 2) Header Info

                        int idx;                         // counter variable for indexing through packet

                        char eth_destination[6]; // var to store the ethernet destination address

                        char eth_source[6];      // var to store the ethernet source address

                        short eth_type;                  // var to store the ethernet type value

                        char eth_payload[10];    // string array to store payload description

                        char eth_bcast[6] = "0xFF";

                        // Extract Ethernet Destination Address (1st 6 bytes)

                        for ( idx = 0; idx < 6; idx++)

                        {

                                eth_destination[idx] = p[idx];

                        }

                        // Extract Ethernet Source Address (2nd 6 bytes)

                        for ( idx = 6; idx < 12; idx++)

                        {

                                eth_source[idx-6] = p[idx];

                        }

                        // Combine two byte Ethernet Type/Length field into one value

                        eth_type = p[12] * 256 + p[13];

                        // Check the packet type and increment related counter

                        if ( eth_type >= 0x600) {

                                switch ( eth_type )

                                {

                                        case 0x800: // Check to see if the type indicates that the packet is IP

                                                ctrIP++;

                                                strcpy(eth_payload, "IP");

                                                break;

                                        case 0x806: // Check to see if the type indicates that the packet is ARP

                                                ctrARP++;

                                                strcpy(eth_payload, "ARP");

                                                break;

                                        default:

                                                break;

                                }

                        }

                        // Check to see if the destination was a broadcast packet and increment related counter

                        /*

                        if ((eth_destination[0] == 0xFF ) && (eth_destination[1] == 0xFF ) && (eth_destination[2] == 0xFF ) && (eth_destination[3] == 0xFF ) && (eth_destination[4] == 0xFF ) && (eth_destination[5] == 0xFF )) {

                                ctrBCAST++;

                        }

                        */

                        // Print Ethernet (Layer 2) Header Info

                                printf("Layer Field Value ");

                                printf("ETHERNET Destination %02x:%02x:%02x:%02x:%02x:%02x ", eth_destination[0],eth_destination[1],eth_destination[2],eth_destination[3],eth_destination[4],eth_destination[5]);

                                printf(" Source %02x:%02x:%02x:%02x:%02x:%02x ", eth_source[0],eth_source[1],eth_source[2],eth_source[3],eth_source[4],eth_source[5]);

                                printf(" Type 0x%02x ", eth_type);

                                printf(" Payload %s ", eth_payload);

                // All packets will have ethernet info (decoded and printed above).

                // At this point we have to determine what kind of data is at the next layer up (layer 3) and decode/print the data accordingly.

                // This is done based on the eth_type variable.

                if ( eth_type >= 0x600) {

                        switch ( eth_type )

                        {

                                case 0x800: // IP Packet

                                        // insert code to decode and print IP (should this be a separate sub-routine?

                                        break;

                                case 0x806: // ARP Packet

                                        // insert code to decode and print ARP

                                        break;

                                default:

                                        break;

                        }

                }

                exit(0);

}