First: dest_pid after pf is part of the structure, and I think this is another variable, and then uint16_t dest_pid;
Second: p is a pointer to uint8_t , when you execute (p[1] << 8) , you change what is inside the pointer to 8, for example, if p[1] = 0xE5 after switching it will be 0xE500 . Remember that you put your result in dest_pid , which is a 2 byte variable.
The translation of the last line is likely to take the least significant byte (less significant) pid and add it to the highest byte (shifted by 8) pid and placing it in pf->dest_pid , you might think why it did not send 2 bytes from the beginning, and the reason for this may be that it receives it from the bus, which sends only bytes per unit of time (cycle).
source share