On Mon, Jul 7, 2014 at 2:45 PM, Michal Sekletar <[email protected]> wrote:
> We already ignore IP fragments, because we expect that Fragment
> offset (FO) field is not set. However first fragment in a fragmented IP
> flow will have all zeroes in FO field. We should ignore such packet as
> well, thus we need to look at MF flag in the IP header. Checking MF flag
> will filter out all except last packet in fragmented flows. Last one
> will be ruled out by next check for value of FO.
> ---
>  src/libsystemd-network/dhcp-network.c | 4 ++++
>  1 file changed, 4 insertions(+)
>
> diff --git a/src/libsystemd-network/dhcp-network.c 
> b/src/libsystemd-network/dhcp-network.c
> index f119cae..455d5a8 100644
> --- a/src/libsystemd-network/dhcp-network.c
> +++ b/src/libsystemd-network/dhcp-network.c
> @@ -41,6 +41,10 @@ int dhcp_network_bind_raw_socket(int index, union 
> sockaddr_union *link,
>              BPF_STMT(BPF_LD + BPF_B + BPF_ABS, offsetof(DHCPPacket, 
> ip.protocol)), /* A <- IP protocol */
>              BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, IPPROTO_UDP, 1, 0),          
>       /* IP protocol == UDP ? */
>              BPF_STMT(BPF_RET + BPF_K, 0),                                    
>       /* ignore */
> +            BPF_STMT(BPF_LD + BPF_B + BPF_ABS, offsetof(DHCPPacket, 
> ip.frag_off)), /* A <- Flags */
> +            BPF_STMT(BPF_ALU + BPF_AND + BPF_K, 0x20),                       
>       /* A <- A & 0x20 */

Maybe express better what we are checking here? Something like /* A <-
A & 0x20 (More Fragments bit) */

> +            BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, 0, 1, 0),                    
>       /* A == 0 ? */
> +            BPF_STMT(BPF_RET + BPF_K, 0),                                    
>       /* ignore */
>              BPF_STMT(BPF_LD + BPF_H + BPF_ABS, offsetof(DHCPPacket, 
> ip.frag_off)), /* A <- Flags + Fragment offset */
>              BPF_STMT(BPF_ALU + BPF_AND + BPF_K, 0x1fff),                     
>       /* A <- A & 0x1fff */

Actually, here we should probably comment /* A <- A & 0x1fff (Fragment
offset) */

>              BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, 0, 1, 0),                    
>       /* A == 0 ? */

Apart from that, it looks good. So please push with updated comments.

Cheers,

Tom
_______________________________________________
systemd-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/systemd-devel

Reply via email to