Se você quiser analisar o pacote como o kernel do Linux o recebe, você terá que escrever um driver de kernel, possivelmente indo tão longe quanto modificar o próprio kernel. Quando a interface recebe dados, o processamento começa imediatamente. Qualquer coisa que esteja registrada para receber a próxima camada terá seu manipulador chamado. Como o cabeçalho MAC não exige muito processamento, o manipulador de camada IP é o primeiro que começa a executar muito do processamento.
Se você quiser manipular o cabeçalho MAC e fazer sua própria coisa, terá que se inserir logo após o recebimento do cabeçalho MAC e antes do processamento IP. Ou você pode escrever um driver para ser um NIC virtual. Dessa forma, você poderia processar os dados como quiser. O NIC virtual veria todos os dados exatamente como o NIC real faz. Esta provavelmente seria sua melhor aposta, já que você não quer começar a mexer com o kernel e reconstruí-lo apenas para o seu próprio projeto.
Minha resposta aqui fornece vários bons links para aprender sobre redes de kernel do Linux. Eu também sugiro pegar o Linux Kernel Networking: Implementação e Teoria por Rami Rosen. Ótimo recurso para uma visão detalhada da pilha de rede.
O MACSec em algum momento será implementado no kernel. O IPSec, por exemplo, mantém suas políticas de segurança no kernel enquanto um daemon userland mantém o controle das conexões do túnel. Então infelizmente eu acredito que você terá que escrever algum nível de código do kernel para realizar as ações que você quer.