Skip to content

fix(examples): resoudre le LINKTYPE par paquet dans scan_pcaps - #78

Merged
Akmot9 merged 1 commit into
mainfrom
fix/scan-pcaps-multi-linktype
Aug 15, 2026
Merged

fix(examples): resoudre le LINKTYPE par paquet dans scan_pcaps#78
Akmot9 merged 1 commit into
mainfrom
fix/scan-pcaps-multi-linktype

Conversation

@Akmot9

@Akmot9 Akmot9 commented Aug 15, 2026

Copy link
Copy Markdown
Owner

Ferme #74. scan_pcaps sur The-Ultimate-PCAP.pcapng remonte desormais
51 328 trames, exactement le compte de tshark.

Cause

Un pcapng peut decrire plusieurs interfaces, chacune avec son LINKTYPE, et
chaque paquet designe la sienne par interface_id. scan_pcaps appelait
get_datalink() une seule fois par fichier, puis bouclait sur
while let Ok(packet). Le LINKTYPE de la premiere interface etait donc
applique a tout le fichier, et la lecture sortait au premier changement
d'encapsulation — silencieusement, en affichant zero trame.

La lecture passe de libpcap a pcap-file, deja dependance principale de la
crate, qui donne acces aux blocs de description d'interface. Aucune dependance
nouvelle. packet_parser::parse prend deja le LinkType en parametre :
c'etait bien l'iteration qui etait en cause, pas la crate.

La panne touchait trois fichiers, pas un

Fichier Avant Apres tshark
The-Ultimate-PCAP.pcapng 0 51 328 51 328
capwap-only.pcapng 0 2 2
capwap-association-valid.pcapng 0 2 2

Une comparaison avant/apres sur l'integralite de pcaps_exemple/ confirme
qu'aucun autre fichier ne change de compte.

Point 3 de l'issue : le LINKTYPE 274

Les erreurs de couche liaison portent desormais leur LINKTYPE, ce qui rend le
trou diagnosticable au lieu de le laisser anonyme. Sur The-Ultimate-PCAP,
les 10 667 echecs viennent tous du LINKTYPE 274 — IEEE 802.3br
mPackets
(confirme par capinfos), seule des quatre encapsulations du
fichier a n'avoir pas de decodeur :

Encapsulation LINKTYPE Trames Decodee
Ethernet 1 39 557 oui
IEEE 802.3br mPackets 274 10 667 non
Linux cooked v1 113 1 067 oui
Raw IP 101 37 oui
51 328

Cablier un decodeur 802.3br debloquerait ces 10 667 trames, mais le format
mPacket implique la preemption — une trame preemptible peut etre fragmentee
sur plusieurs mPackets. C'est un chantier a part entiere, pas une ligne de
plus dans decoder_for ; hors perimetre de cette PR.

Une regression introduite, puis rattrapee avant commit

La comparaison de corpus a montre que le gros .cap CAPWAP tombait de 3 584 a
4 trames : next_packet de pcap-file rejette orig_len > snap_len comme
invalide, ce qui est plus strict que libpcap et que la realite d'une trame
tronquee a la capture. Le chemin pcap classique utilise donc
next_raw_packet, qui n'applique pas cette validation — on ne lit de toute
facon que data. Apres correction, le diff de corpus est du gain pur.

Fin de fichier vs erreur de lecture

Une lecture interrompue par une erreur est desormais distinguee d'une fin de
fichier et signalee, fichier par fichier puis en recapitulatif final. Un total
de corpus bati sur des lectures amputees ne se presente plus comme complet.

Deux fichiers MQTT remontent ainsi « lecture incomplete ». Ce n'est pas une
regression : l'ancienne version donnait exactement les memes comptes, sans le
dire. mqtt_packets_Windows.cap est un fichier Sniffer (Windows) 2.00x, que
ni libpcap ni pcap-file ne lisent ; mqtt_packets_RedHat61_tcpdump.pcap est
une variante que les deux lecteurs arretent a la premiere trame.

Verification

  • cargo test : 1 065 tests verts.
  • cargo clippy --all-targets --all-features : aucun warning.
  • Comptes recoupes avec tshark sur les trois fichiers reparés.
  • Diff de corpus complet avant/apres : aucune regression.

Closes #74

🤖 Generated with Claude Code

Un pcapng peut decrire plusieurs interfaces, chacune avec son LINKTYPE, et
chaque paquet designe la sienne par interface_id. scan_pcaps appelait
get_datalink() une seule fois par fichier puis bouclait sur
while let Ok(packet) : le LINKTYPE de la premiere interface etait applique a
tout le fichier, et la lecture sortait au premier changement d'encapsulation.
Silencieusement — le fichier affichait zero trame.

La lecture passe de libpcap a pcap-file, deja dependance principale de la
crate, qui donne acces aux blocs de description d'interface. packet_parser
prend deja le LinkType en parametre : c'etait bien l'iteration qui etait en
cause, pas la crate.

Trois fichiers du corpus etaient concernes, pas seulement celui de l'issue :

  The-Ultimate-PCAP.pcapng          0 -> 51328
  capwap-only.pcapng                0 -> 2
  capwap-association-valid.pcapng   0 -> 2

Les trois comptes correspondent exactement a tshark. Une comparaison
avant/apres sur tout le corpus confirme qu'aucun autre fichier ne change.

Une erreur de lecture est desormais distinguee d'une fin de fichier et
signalee, fichier par fichier puis en recapitulatif final : un total de corpus
bati sur des lectures amputees ne se presente plus comme complet.

Le chemin pcap classique utilise next_raw_packet : next_packet rejette
orig_len > snap_len comme invalide, ce qui est plus strict que libpcap et que
la realite d'une trame tronquee a la capture. Cette validation faisait tomber
une capture de 3584 trames a 4 — regression detectee par la comparaison de
corpus, avant commit.

Les erreurs L2 portent enfin leur LINKTYPE, ce qui repond au point 3 de
l'issue : les 10667 echecs de The-Ultimate-PCAP viennent tous du LINKTYPE 274,
IEEE 802.3br mPackets, seule des quatre encapsulations du fichier a n'avoir
pas de decodeur.

Closes #74

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e46e0708b7

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread examples/scan_pcaps.rs
Comment on lines +148 to +150
if let [link_type] = linktypes[..] {
outcome.frames += 1;
on_packet(link_type, &spb.data);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Route simple packets through interface zero

In a valid pcapng section with multiple Interface Description Blocks, a Simple Packet Block is associated with the first interface (interface 0); it does not require the section to contain exactly one interface. Matching only [link_type] silently drops every SPB in such a capture, undercounts frames, shifts --focus frame numbers, and still reports the file as completely read.

Useful? React with 👍 / 👎.

Comment thread examples/scan_pcaps.rs
Comment on lines +132 to +136
Block::EnhancedPacket(epb) => {
if let Some(&link_type) = linktypes.get(epb.interface_id as usize) {
outcome.frames += 1;
on_packet(link_type, &epb.data);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Report packet blocks with an unknown interface

When an Enhanced Packet Block references an out-of-range interface_id, this branch silently skips it, leaves truncated_by unset, and excludes it from the frame count; the analogous Packet Block branch behaves the same way. Thus a malformed or partially generated pcapng is presented as a complete scan even though packet blocks were discarded, defeating the new incomplete-read reporting; record an error or otherwise mark the outcome incomplete instead.

Useful? React with 👍 / 👎.

@Akmot9
Akmot9 merged commit 3f59ada into main Aug 15, 2026
5 checks passed
@Akmot9
Akmot9 deleted the fix/scan-pcaps-multi-linktype branch August 15, 2026 22:08
Akmot9 added a commit that referenced this pull request Aug 15, 2026
La PR de sync (#77) a ete mergee avant celle du correctif (#78), si bien que
la roadmap designait encore #74 comme priorite et comme bloquant de #56 et
#70, alors qu'il etait clos dans la foulee.

#74 est clos : scan_pcaps resout le LINKTYPE par paquet, et trois captures
sortent de l'invisibilite (The-Ultimate-PCAP.pcapng 0 -> 51328,
capwap-only.pcapng et capwap-association-valid.pcapng 0 -> 2).

Le corpus n'est rendu qu'aux quatre cinquiemes : les 10667 trames en LINKTYPE
274 restent indecodees, soit 21 % de The-Ultimate-PCAP.pcapng. #79 devient
donc le prealable restant a #56 — ces trames portent 2403 ICMPv6, 818 VRRP,
777 GLBP, 678 IS-IS et 599 NTP, dont plusieurs sans autre source de trames
reelles dans le depot.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The-Ultimate-PCAP.pcapng est illisible par tous les outils du dépôt (0 trame)

1 participant