qeth: Cleanup for cast-type determination.
authorKlaus-Dieter Wacker <kdwacker@de.ibm.com>
Wed, 26 Aug 2009 02:01:08 +0000 (02:01 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 27 Aug 2009 00:34:18 +0000 (17:34 -0700)
Clear separation of cast-type determination (send path) for layer-2
resp. layer-3. Allowing to have inline functions for qeth layer-
discipline.

Signed-off-by: Klaus-Dieter Wacker <kdwacker@de.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/s390/net/qeth_core.h
drivers/s390/net/qeth_core_main.c
drivers/s390/net/qeth_l2_main.c
drivers/s390/net/qeth_l3_main.c

index 03161e650b240fdaa693243d74e994d22a3a7830..31a2b4e502cec48fc5fa2220df2bb7b7eb76cdb4 100644 (file)
@@ -843,7 +843,6 @@ int qeth_default_setadapterparms_cb(struct qeth_card *, struct qeth_reply *,
 int qeth_send_control_data(struct qeth_card *, int, struct qeth_cmd_buffer *,
        int (*reply_cb)(struct qeth_card *, struct qeth_reply*, unsigned long),
        void *reply_param);
-int qeth_get_cast_type(struct qeth_card *, struct sk_buff *);
 int qeth_get_priority_queue(struct qeth_card *, struct sk_buff *, int, int);
 int qeth_get_elements_no(struct qeth_card *, void *, struct sk_buff *, int);
 int qeth_do_send_packet_fast(struct qeth_card *, struct qeth_qdio_out_q *,
index ac7270d21708b15d5044b79154766e876b4d9f5b..1560bb621a3b384583084bad4e1dae98b1a2cd7f 100644 (file)
@@ -2952,55 +2952,6 @@ void qeth_qdio_output_handler(struct ccw_device *ccwdev,
 }
 EXPORT_SYMBOL_GPL(qeth_qdio_output_handler);
 
-int qeth_get_cast_type(struct qeth_card *card, struct sk_buff *skb)
-{
-       int cast_type = RTN_UNSPEC;
-
-       if (card->info.type == QETH_CARD_TYPE_OSN)
-               return cast_type;
-
-       if (skb_dst(skb) && skb_dst(skb)->neighbour) {
-               cast_type = skb_dst(skb)->neighbour->type;
-               if ((cast_type == RTN_BROADCAST) ||
-                   (cast_type == RTN_MULTICAST) ||
-                   (cast_type == RTN_ANYCAST))
-                       return cast_type;
-               else
-                       return RTN_UNSPEC;
-       }
-       /* try something else */
-       if (skb->protocol == ETH_P_IPV6)
-               return (skb_network_header(skb)[24] == 0xff) ?
-                               RTN_MULTICAST : 0;
-       else if (skb->protocol == ETH_P_IP)
-               return ((skb_network_header(skb)[16] & 0xf0) == 0xe0) ?
-                               RTN_MULTICAST : 0;
-       /* ... */
-       if (!memcmp(skb->data, skb->dev->broadcast, 6))
-               return RTN_BROADCAST;
-       else {
-               u16 hdr_mac;
-
-               hdr_mac = *((u16 *)skb->data);
-               /* tr multicast? */
-               switch (card->info.link_type) {
-               case QETH_LINK_TYPE_HSTR:
-               case QETH_LINK_TYPE_LANE_TR:
-                       if ((hdr_mac == QETH_TR_MAC_NC) ||
-                           (hdr_mac == QETH_TR_MAC_C))
-                               return RTN_MULTICAST;
-                       break;
-               /* eth or so multicast? */
-               default:
-               if ((hdr_mac == QETH_ETH_MAC_V4) ||
-                           (hdr_mac == QETH_ETH_MAC_V6))
-                               return RTN_MULTICAST;
-               }
-       }
-       return cast_type;
-}
-EXPORT_SYMBOL_GPL(qeth_get_cast_type);
-
 int qeth_get_priority_queue(struct qeth_card *card, struct sk_buff *skb,
                        int ipv, int cast_type)
 {
index 2cfc338c4625ca2b94b73745a0c1d5650668cddb..12ee7a35ca5920e2390728fabe2e790b1d29c174 100644 (file)
@@ -216,36 +216,16 @@ static void qeth_l2_del_all_mc(struct qeth_card *card)
        spin_unlock_bh(&card->mclock);
 }
 
-static void qeth_l2_get_packet_type(struct qeth_card *card,
-                       struct qeth_hdr *hdr, struct sk_buff *skb)
+static inline int qeth_l2_get_cast_type(struct qeth_card *card,
+                       struct sk_buff *skb)
 {
-       __u16 hdr_mac;
-
-       if (!memcmp(skb->data + QETH_HEADER_SIZE,
-                   skb->dev->broadcast, 6)) {
-               /* broadcast? */
-               hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_BROADCAST;
-               return;
-       }
-       hdr_mac = *((__u16 *)skb->data);
-       /* tr multicast? */
-       switch (card->info.link_type) {
-       case QETH_LINK_TYPE_HSTR:
-       case QETH_LINK_TYPE_LANE_TR:
-               if ((hdr_mac == QETH_TR_MAC_NC) ||
-                   (hdr_mac == QETH_TR_MAC_C))
-                       hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_MULTICAST;
-               else
-                       hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_UNICAST;
-               break;
-               /* eth or so multicast? */
-       default:
-               if ((hdr_mac == QETH_ETH_MAC_V4) ||
-                    (hdr_mac == QETH_ETH_MAC_V6))
-                       hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_MULTICAST;
-               else
-                       hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_UNICAST;
-       }
+       if (card->info.type == QETH_CARD_TYPE_OSN)
+               return RTN_UNSPEC;
+       if (is_broadcast_ether_addr(skb->data))
+               return RTN_BROADCAST;
+       if (is_multicast_ether_addr(skb->data))
+               return RTN_MULTICAST;
+       return RTN_UNSPEC;
 }
 
 static void qeth_l2_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
@@ -262,7 +242,7 @@ static void qeth_l2_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
        else if (cast_type == RTN_BROADCAST)
                hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_BROADCAST;
        else
-               qeth_l2_get_packet_type(card, hdr, skb);
+               hdr->hdr.l2.flags[2] |= QETH_LAYER2_FLAG_UNICAST;
 
        hdr->hdr.l2.pkt_length = skb->len-QETH_HEADER_SIZE;
        /* VSWITCH relies on the VLAN
@@ -672,7 +652,7 @@ static int qeth_l2_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
        struct qeth_card *card = dev->ml_priv;
        struct sk_buff *new_skb = skb;
        int ipv = qeth_get_ip_version(skb);
-       int cast_type = qeth_get_cast_type(card, skb);
+       int cast_type = qeth_l2_get_cast_type(card, skb);
        struct qeth_qdio_out_q *queue = card->qdio.out_qs
                [qeth_get_priority_queue(card, skb, ipv, cast_type)];
        int tx_bytes = skb->len;
index 77e04b7fad1dbc8ba091cbbc77e87f9f7fa76f7e..d9fabe30c0dac15d992a35ce7ae1f94dcf0ff716 100644 (file)
@@ -2525,6 +2525,51 @@ static int qeth_l3_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
        return rc;
 }
 
+int inline qeth_l3_get_cast_type(struct qeth_card *card, struct sk_buff *skb)
+{
+       int cast_type = RTN_UNSPEC;
+
+       if (skb_dst(skb) && skb_dst(skb)->neighbour) {
+               cast_type = skb_dst(skb)->neighbour->type;
+               if ((cast_type == RTN_BROADCAST) ||
+                   (cast_type == RTN_MULTICAST) ||
+                   (cast_type == RTN_ANYCAST))
+                       return cast_type;
+               else
+                       return RTN_UNSPEC;
+       }
+       /* try something else */
+       if (skb->protocol == ETH_P_IPV6)
+               return (skb_network_header(skb)[24] == 0xff) ?
+                               RTN_MULTICAST : 0;
+       else if (skb->protocol == ETH_P_IP)
+               return ((skb_network_header(skb)[16] & 0xf0) == 0xe0) ?
+                               RTN_MULTICAST : 0;
+       /* ... */
+       if (!memcmp(skb->data, skb->dev->broadcast, 6))
+               return RTN_BROADCAST;
+       else {
+               u16 hdr_mac;
+
+               hdr_mac = *((u16 *)skb->data);
+               /* tr multicast? */
+               switch (card->info.link_type) {
+               case QETH_LINK_TYPE_HSTR:
+               case QETH_LINK_TYPE_LANE_TR:
+                       if ((hdr_mac == QETH_TR_MAC_NC) ||
+                           (hdr_mac == QETH_TR_MAC_C))
+                               return RTN_MULTICAST;
+                       break;
+               /* eth or so multicast? */
+               default:
+               if ((hdr_mac == QETH_ETH_MAC_V4) ||
+                           (hdr_mac == QETH_ETH_MAC_V6))
+                               return RTN_MULTICAST;
+               }
+       }
+       return cast_type;
+}
+
 static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
                struct sk_buff *skb, int ipv, int cast_type)
 {
@@ -2650,7 +2695,7 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
        struct qeth_card *card = dev->ml_priv;
        struct sk_buff *new_skb = NULL;
        int ipv = qeth_get_ip_version(skb);
-       int cast_type = qeth_get_cast_type(card, skb);
+       int cast_type = qeth_l3_get_cast_type(card, skb);
        struct qeth_qdio_out_q *queue = card->qdio.out_qs
                [qeth_get_priority_queue(card, skb, ipv, cast_type)];
        int tx_bytes = skb->len;