On 6/24/10 3:57 PM, Vasu Dev wrote:
> This is per FC-BB-5 Annex-D recommendation and per that
> if address checking fails then drop the frame.
>
> FIP code paths are already doing this so only needed for fcoe
> frames.
>
> The src address checking is limited to only fip mode since
> this might break non-fip mode used in p2p due to used OUI
> based addressing in some p2p code paths, going forward FIP
> will be the only mode, therefore limited this to only FIP
> mode so that it won't break non-fip p2p mode for now.
>
> Signed-off-by: Vasu Dev<[email protected]>
> ---
>
> drivers/scsi/fcoe/fcoe.c | 22 +++++++++++++++++++++-
> include/scsi/libfcoe.h | 10 ++++++++++
> 2 files changed, 31 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
> index 44a0759..ab9a094 100644
> --- a/drivers/scsi/fcoe/fcoe.c
> +++ b/drivers/scsi/fcoe/fcoe.c
> @@ -1210,6 +1210,8 @@ int fcoe_rcv(struct sk_buff *skb, struct net_device
> *netdev,
> struct fcoe_interface *fcoe;
> struct fc_frame_header *fh;
> struct fcoe_percpu_s *fps;
> + struct fcoe_port *port;
> + struct ethhdr *eh;
> unsigned int cpu;
>
> fcoe = container_of(ptype, struct fcoe_interface, fcoe_packet_type);
> @@ -1228,11 +1230,29 @@ int fcoe_rcv(struct sk_buff *skb, struct net_device
> *netdev,
> skb->csum, skb->dev ? skb->dev->name : "<NULL>");
>
> /* check for FCOE packet type */
> - if (unlikely(eth_hdr(skb)->h_proto != htons(ETH_P_FCOE))) {
> + eh = eth_hdr(skb);
> + if (unlikely(eh->h_proto != htons(ETH_P_FCOE))) {
This was pre-existing, but this is an unnecessary check,
since the net/core/dev.c packet_type filtering can be relied on.
We should delete this check but we can do that separately.
> FCOE_NETDEV_DBG(netdev, "Wrong FC type frame");
> goto err;
> }
>
> + /* check for mac addresses */
> + port = lport_priv(lport);
> + if (compare_ether_addr(eh->h_dest, port->data_src_addr)&&
> + compare_ether_addr(eh->h_dest, fcoe->ctlr.ctl_src_addr)&&
> + compare_ether_addr(eh->h_dest, (u8[6])FC_FCOE_FLOGI_MAC)) {
> + FCOE_NETDEV_DBG(netdev, "wrong destination mac address:%pM\n",
> + eh->h_dest);
> + goto err;
> + }
> +
> + if (is_fip_mode(&fcoe->ctlr)&&
> + compare_ether_addr(eh->h_source, fcoe->ctlr.dest_addr)) {
> + FCOE_NETDEV_DBG(netdev, "wrong source mac address:%pM\n",
> + eh->h_source);
> + goto err;
> + }
> +
> /*
> * Check for minimum frame length, and make sure required FCoE
> * and FC headers are pulled into the linear data area.
> diff --git a/include/scsi/libfcoe.h b/include/scsi/libfcoe.h
> index ec13f51..81aee1c 100644
> --- a/include/scsi/libfcoe.h
> +++ b/include/scsi/libfcoe.h
> @@ -170,4 +170,14 @@ int fcoe_ctlr_recv_flogi(struct fcoe_ctlr *, struct
> fc_lport *,
> u64 fcoe_wwn_from_mac(unsigned char mac[], unsigned int, unsigned int);
> int fcoe_libfc_config(struct fc_lport *, struct libfc_function_template *);
>
> +/**
> + * is_fip_mode() - returns true if FIP mode selected.
> + * @fip: FCoE controller.
> + */
> +static inline bool is_fip_mode(struct fcoe_ctlr *fip)
> +{
> + return fip->state == FIP_ST_ENABLED;
> +}
> +
> +
> #endif /* _LIBFCOE_H */
>
> _______________________________________________
> devel mailing list
> [email protected]
> http://www.open-fcoe.org/mailman/listinfo/devel
_______________________________________________
devel mailing list
[email protected]
http://www.open-fcoe.org/mailman/listinfo/devel