Наказание указателя - это не то, что хорошо. Есть более безопасные способы сделать это.
memcpy(&ourstruct, payload, sizeof(ourstruct));
или
union
{
struct ether_header str;
char payload[MAXLEN];
}myunion;
или просто скопировать поля, если позиции не совпадают
memcpy(ourstruct.ether_dhost[0], &payload[ether_dhost_POS], sizeof(ourstruct.ether_dhost));