aoe.h revision 262bf54144ebcb78cd0d057d2705dc5fb7bba7ac
12611464d7f36685fb1990275d3de1e72e6aff9d9Ed L. Cashin/* Copyright (c) 2006 Coraid, Inc.  See COPYING for GPL terms. */
28911ef4dc97f77797f297318010a7424300d2d50Ed L. Cashin#define VERSION "47"
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AOE_MAJOR 152
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEVICE_NAME "aoe"
5fc458dcda27c6d26cb11ef9ee9c1c3599711be94Ed L. Cashin
6fc458dcda27c6d26cb11ef9ee9c1c3599711be94Ed L. Cashin/* set AOE_PARTITIONS to 1 to use whole-disks only
7fc458dcda27c6d26cb11ef9ee9c1c3599711be94Ed L. Cashin * default is 16, which is 15 partitions plus the whole disk
8fc458dcda27c6d26cb11ef9ee9c1c3599711be94Ed L. Cashin */
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef AOE_PARTITIONS
10e39526e6e7a96904c9f1c85375d49ff437c18c44Ed L. Cashin#define AOE_PARTITIONS (16)
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
12fc458dcda27c6d26cb11ef9ee9c1c3599711be94Ed L. Cashin
13e39526e6e7a96904c9f1c85375d49ff437c18c44Ed L. Cashin#define SYSMINOR(aoemajor, aoeminor) ((aoemajor) * NPERSHELF + (aoeminor))
14e39526e6e7a96904c9f1c85375d49ff437c18c44Ed L. Cashin#define AOEMAJOR(sysminor) ((sysminor) / NPERSHELF)
15e39526e6e7a96904c9f1c85375d49ff437c18c44Ed L. Cashin#define AOEMINOR(sysminor) ((sysminor) % NPERSHELF)
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define WHITESPACE " \t\v\f\n"
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum {
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	AOECMD_ATA,
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	AOECMD_CFG,
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	AOEFL_RSP = (1<<3),
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	AOEFL_ERR = (1<<2),
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	AOEAFL_EXT = (1<<6),
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	AOEAFL_DEV = (1<<4),
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	AOEAFL_ASYNC = (1<<1),
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	AOEAFL_WRITE = (1<<0),
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	AOECCMD_READ = 0,
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	AOECCMD_TEST,
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	AOECCMD_PTEST,
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	AOECCMD_SET,
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	AOECCMD_FSET,
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	AOE_HVER = 0x10,
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct aoe_hdr {
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char dst[6];
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char src[6];
4263e9cc5d6fbe8b58ea1ee96439d356cbf726fbc0Ed L. Cashin	__be16 type;
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char verfl;
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char err;
4563e9cc5d6fbe8b58ea1ee96439d356cbf726fbc0Ed L. Cashin	__be16 major;
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char minor;
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char cmd;
4863e9cc5d6fbe8b58ea1ee96439d356cbf726fbc0Ed L. Cashin	__be32 tag;
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct aoe_atahdr {
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char aflags;
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char errfeat;
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char scnt;
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char cmdstat;
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char lba0;
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char lba1;
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char lba2;
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char lba3;
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char lba4;
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char lba5;
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char res[2];
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct aoe_cfghdr {
6663e9cc5d6fbe8b58ea1ee96439d356cbf726fbc0Ed L. Cashin	__be16 bufcnt;
6763e9cc5d6fbe8b58ea1ee96439d356cbf726fbc0Ed L. Cashin	__be16 fwver;
6819bf26353c50bc2be375109ec73f2f0bbd616ed1Ed L. Cashin	unsigned char scnt;
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char aoeccmd;
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned char cslen[2];
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum {
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DEVFL_UP = 1,	/* device is installed in system and ready for AoE->ATA commands */
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DEVFL_TKILL = (1<<1),	/* flag for timer to know when to kill self */
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DEVFL_EXT = (1<<2),	/* device accepts lba48 commands */
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DEVFL_CLOSEWAIT = (1<<3), /* device is waiting for all closes to revalidate */
783ae1c24e395b2b65326439622223d88d92bfa03aEd L. Cashin	DEVFL_GDALLOC = (1<<4),	/* need to alloc gendisk */
7968e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	DEVFL_KICKME = (1<<5),	/* slow polling network card catch */
803ae1c24e395b2b65326439622223d88d92bfa03aEd L. Cashin	DEVFL_NEWSIZE = (1<<6),	/* need to update dev size in block layer */
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	BUFFL_FAIL = 1,
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum {
8619bf26353c50bc2be375109ec73f2f0bbd616ed1Ed L. Cashin	DEFAULTBCNT = 2 * 512,	/* 2 sectors */
87e39526e6e7a96904c9f1c85375d49ff437c18c44Ed L. Cashin	NPERSHELF = 16,		/* number of slots per shelf address */
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	FREETAG = -1,
8968e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	MIN_BUFS = 16,
9068e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	NTARGETS = 8,
9168e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	NAOEIFS = 8,
9268e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin
9368e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	TIMERTICK = HZ / 10,
9468e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	MINTIMER = HZ >> 2,
9568e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	MAXTIMER = HZ << 1,
9668e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	HELPWAIT = 20,
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct buf {
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct list_head bufs;
10168e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	ulong stime;	/* for disk stats */
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ulong flags;
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ulong nframesout;
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ulong resid;
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ulong bv_resid;
10668e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	ulong bv_off;
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sector_t sector;
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct bio *bio;
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct bio_vec *bv;
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct frame {
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int tag;
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ulong waited;
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct buf *buf;
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char *bufaddr;
11719bf26353c50bc2be375109ec73f2f0bbd616ed1Ed L. Cashin	ulong bcnt;
11819bf26353c50bc2be375109ec73f2f0bbd616ed1Ed L. Cashin	sector_t lba;
119e407a7f6cd143b3ab4eb3d7e1cf882e96b710eb5Ed L. Cashin	struct sk_buff *skb;
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12268e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashinstruct aoeif {
12368e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	struct net_device *nd;
12468e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	unsigned char lost;
12568e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	unsigned char lostjumbo;
12668e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	ushort maxbcnt;
12768e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin};
12868e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin
12968e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashinstruct aoetgt {
13068e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	unsigned char addr[6];
13168e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	ushort nframes;
13268e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	struct frame *frames;
13368e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	struct aoeif ifs[NAOEIFS];
13468e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	struct aoeif *ifp;	/* current aoeif in use */
13568e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	ushort nout;
13668e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	ushort maxout;
13768e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	u16 lasttag;		/* last tag sent */
13868e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	u16 useme;
13968e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	ulong lastwadj;		/* last window adjustment */
14068e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	int wpkts, rpkts;
14168e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin};
14268e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct aoedev {
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct aoedev *next;
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ulong sysminor;
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ulong aoemajor;
14768e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	u16 aoeminor;
14868e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	u16 flags;
149dced3a053dd5415a7321e1ae153c96dea644da4eEd L. Cashin	u16 nopen;		/* (bd_openers isn't available without sleeping) */
150dced3a053dd5415a7321e1ae153c96dea644da4eEd L. Cashin	u16 rttavg;		/* round trip average of requests/responses */
151dced3a053dd5415a7321e1ae153c96dea644da4eEd L. Cashin	u16 mintimer;
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u16 fw_ver;		/* version of blade's firmware */
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct work_struct work;/* disk create work struct */
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct gendisk *gd;
155165125e1e480f9510a5ffcfbfee4e3ee38c05f23Jens Axboe	struct request_queue blkq;
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct hd_geometry geo;
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	sector_t ssize;
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct timer_list timer;
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	spinlock_t lock;
160a4b38364093bf2094ff858ad45f490521bb87984Ed L. Cashin	struct sk_buff *sendq_hd; /* packets needing to be sent, list head */
161a4b38364093bf2094ff858ad45f490521bb87984Ed L. Cashin	struct sk_buff *sendq_tl;
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mempool_t *bufpool;	/* for deadlock-free Buf allocation */
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct list_head bufq;	/* queue of bios to work on */
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct buf *inprocess;	/* the one we're currently working on */
16568e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	struct aoetgt *targets[NTARGETS];
16668e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	struct aoetgt **tgt;	/* target in use when working */
16768e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashin	struct aoetgt **htgt;	/* target needing rexmit assistance */
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint aoeblk_init(void);
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid aoeblk_exit(void);
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid aoeblk_gdalloc(void *);
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid aoedisk_rm_sysfs(struct aoedev *d);
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint aoechr_init(void);
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid aoechr_exit(void);
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid aoechr_error(char *);
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid aoecmd_work(struct aoedev *d);
1813ae1c24e395b2b65326439622223d88d92bfa03aEd L. Cashinvoid aoecmd_cfg(ushort aoemajor, unsigned char aoeminor);
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid aoecmd_ata_rsp(struct sk_buff *);
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid aoecmd_cfg_rsp(struct sk_buff *);
184c4028958b6ecad064b1a6303a6a5906d4fe48d73David Howellsvoid aoecmd_sleepwork(struct work_struct *);
18568e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashinvoid aoecmd_cleanslate(struct aoedev *);
18668e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashinstruct sk_buff *aoecmd_ata_id(struct aoedev *);
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint aoedev_init(void);
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid aoedev_exit(void);
19032465c650670c7499548d70fdeed57fab44ee679Ed L. Cashinstruct aoedev *aoedev_by_aoeaddr(int maj, int min);
19168e0d42f39d85b334d3867a4e5fc2e0e775c1a6cEd L. Cashinstruct aoedev *aoedev_by_sysminor_m(ulong sysminor);
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid aoedev_downdev(struct aoedev *d);
1933ae1c24e395b2b65326439622223d88d92bfa03aEd L. Cashinint aoedev_isbusy(struct aoedev *d);
194262bf54144ebcb78cd0d057d2705dc5fb7bba7acEd L. Cashinint aoedev_flush(const char __user *str, size_t size);
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint aoenet_init(void);
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid aoenet_exit(void);
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid aoenet_xmit(struct sk_buff *);
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint is_aoe_netif(struct net_device *ifp);
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint set_aoe_iflist(const char __user *str, size_t size);
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2021eb0da4cea28ae8f1bbe61822a2cc04e6d074e03Ed L. Cashinunsigned long long mac_addr(char addr[6]);
203