On Mon, Jul 04, 2016 at 10:29:22AM +0200, Hannes Reinecke wrote: > When running in VN2VN mode there is no central instance which > would send out any FIP VLAN discovery notifications. So this > patch adds a new sysfs attribute 'fip_vlan_responder' which > will activate a FIP VLAN discovery responder. > > Signed-off-by: Hannes Reinecke <hare@xxxxxxxx> > --- [...] > +/** > + * fcoe_ctlr_vlan_send() - Send a FIP VLAN Notification > + * @fip: The FCoE controller > + * @sub: sub-opcode for vlan notification or vn2vn vlan notification > + * @dest: The destination Ethernet MAC address > + * @min_len: minimum size of the Ethernet payload to be sent > + */ > +static void fcoe_ctlr_vlan_send(struct fcoe_ctlr *fip, > + enum fip_vlan_subcode sub, > + const u8 *dest) > +{ > + struct sk_buff *skb; > + struct fip_frame { > + struct ethhdr eth; > + struct fip_header fip; > + struct fip_mac_desc mac; > + struct fip_vlan_desc vlan; > + } __packed * frame; Hmmm this is the 2nd time fip_frame is defined in fcoe_ctlr.c. I'd prefere having the type definition somewhere else in this file and then use it in fcoe_ctlr_vlan_send() and fcoe_ctlr_vn_send(). > + size_t len; > + size_t dlen; > + > + len = sizeof(*frame); > + dlen = sizeof(frame->mac) + sizeof(frame->vlan); > + len = max(len, sizeof(struct ethhdr)); > + > + skb = dev_alloc_skb(len); > + if (!skb) > + return; dev_alloc_skb() uses GFP_ATOMIC so it's actually not unlikely to fail so please return -ENOMEM here, just so the caller knows what happened. > + > + LIBFCOE_FIP_DBG(fip, "fip %s vlan notification, vlan %d\n", > + fip->mode == FIP_MODE_VN2VN ? "vn2vn" : "fcf", > + fip->lp->vlan); > + > + frame = (struct fip_frame *)skb->data; > + memset(frame, 0, len); > + memcpy(frame->eth.h_dest, dest, ETH_ALEN); > + > + memcpy(frame->eth.h_source, fip->ctl_src_addr, ETH_ALEN); > + frame->eth.h_proto = htons(ETH_P_FIP); > + > + frame->fip.fip_ver = FIP_VER_ENCAPS(FIP_VER); > + frame->fip.fip_op = htons(FIP_OP_VLAN); > + frame->fip.fip_subcode = sub; > + frame->fip.fip_dl_len = htons(dlen / FIP_BPW); > + > + frame->mac.fd_desc.fip_dtype = FIP_DT_MAC; > + frame->mac.fd_desc.fip_dlen = sizeof(frame->mac) / FIP_BPW; > + memcpy(frame->mac.fd_mac, fip->ctl_src_addr, ETH_ALEN); > + > + frame->vlan.fd_desc.fip_dtype = FIP_DT_VLAN; > + frame->vlan.fd_desc.fip_dlen = sizeof(frame->vlan) / FIP_BPW; > + put_unaligned_be16(fip->lp->vlan, &frame->vlan.fd_vlan); > + > + skb_put(skb, len); > + skb->protocol = htons(ETH_P_FIP); > + skb->priority = fip->priority; > + skb_reset_mac_header(skb); > + skb_reset_network_header(skb); > + > + fip->send(fip, skb); > +} -- Johannes Thumshirn Storage jthumshirn@xxxxxxx +49 911 74053 689 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: Felix Imendörffer, Jane Smithard, Graham Norton HRB 21284 (AG Nürnberg) Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850 -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html