vblade: fix code so #pragma pack isnt needed

This commit is contained in:
cinap_lenrek 2014-12-19 03:57:27 +01:00
parent 6379939642
commit ffe862c543
2 changed files with 35 additions and 36 deletions

View file

@ -40,8 +40,6 @@ enum{
AAFext = 1<<6, AAFext = 1<<6,
}; };
#pragma pack on
typedef struct{ typedef struct{
uchar dst[Eaddrlen]; uchar dst[Eaddrlen];
uchar src[Eaddrlen]; uchar src[Eaddrlen];
@ -55,7 +53,6 @@ typedef struct{
}Aoehdr; }Aoehdr;
typedef struct{ typedef struct{
Aoehdr;
uchar aflag; uchar aflag;
uchar errfeat; uchar errfeat;
uchar scnt; uchar scnt;
@ -65,7 +62,6 @@ typedef struct{
}Aoeata; }Aoeata;
typedef struct{ typedef struct{
Aoehdr;
uchar bufcnt[2]; uchar bufcnt[2];
uchar fwver[2]; uchar fwver[2];
uchar scnt; uchar scnt;

View file

@ -83,7 +83,7 @@ getmtu(char *p)
return 2; return 2;
close(fd); close(fd);
buf[36] = 0; buf[36] = 0;
mtu = strtoul(buf+12, 0, 0)-sizeof(Aoehdr); mtu = strtoul(buf+12, 0, 0)-Aoehsz;
return mtu>>9; return mtu>>9;
} }
@ -238,18 +238,20 @@ replyhdr(Aoehdr *h, Vblade *vblade)
} }
static int static int
serveconfig(Aoeqc *q, Vblade *vb, int mtu) serveconfig(Aoehdr *h, Vblade *vb, int mtu)
{ {
int cmd, reqlen, len; int cmd, reqlen, len;
char *cfg; char *cfg;
Aoeqc *q;
if(memcmp(q->src, q->dst, Eaddrlen) == 0) if(memcmp(h->src, h->dst, Eaddrlen) == 0)
return -1; return -1;
q = (Aoeqc*)((char*)h + Aoehsz);
reqlen = nhgets(q->cslen); reqlen = nhgets(q->cslen);
len = vb->clen; len = vb->clen;
cmd = q->verccmd&0xf; cmd = q->verccmd&0xf;
cfg = (char*)(q+1); cfg = (char*)q + Aoecfgsz;
switch(cmd){ switch(cmd){
case AQCtest: case AQCtest:
@ -264,14 +266,14 @@ serveconfig(Aoeqc *q, Vblade *vb, int mtu)
break; break;
case AQCset: case AQCset:
if(len && len != reqlen || memcmp(vb->hdr.config, cfg, reqlen) != 0){ if(len && len != reqlen || memcmp(vb->hdr.config, cfg, reqlen) != 0){
q->verflag |= AFerr; h->verflag |= AFerr;
q->error = AEcfg; h->error = AEcfg;
break; break;
} }
case AQCfset: case AQCfset:
if(reqlen > Conflen){ if(reqlen > Conflen){
q->verflag |= AFerr; h->verflag |= AFerr;
q->error = AEarg; h->error = AEarg;
break; break;
} }
memset(vb->hdr.config, 0, sizeof vb->hdr.config); memset(vb->hdr.config, 0, sizeof vb->hdr.config);
@ -280,8 +282,8 @@ serveconfig(Aoeqc *q, Vblade *vb, int mtu)
savevblade(vb->fd, vb); savevblade(vb->fd, vb);
break; break;
default: default:
q->verflag |= AFerr; h->verflag |= AFerr;
q->error = AEarg; h->error = AEarg;
} }
memmove(cfg, vb->hdr.config, len); memmove(cfg, vb->hdr.config, len);
@ -291,7 +293,7 @@ serveconfig(Aoeqc *q, Vblade *vb, int mtu)
hnputs(q->fwver, 2323); hnputs(q->fwver, 2323);
q->verccmd = Aoever<<4 | cmd; q->verccmd = Aoever<<4 | cmd;
return len+sizeof *q; return Aoehsz+Aoecfgsz + len;
} }
static ushort ident[256] = { static ushort ident[256] = {
@ -368,29 +370,32 @@ putlba(uchar *p, vlong lba)
} }
static int static int
serveata(Aoeata *a, Vblade *vb, int mtu) serveata(Aoehdr *h, Vblade *vb, int mtu)
{ {
Aoeata *a;
char *buf; char *buf;
int rbytes, bytes, len; int rbytes, bytes, len;
vlong lba, off; vlong lba, off;
buf = (char*)(a+1); a = (Aoeata*)((char*)h + Aoehsz);
buf = (char*)a + Aoeatasz;
lba = getlba(a->lba); lba = getlba(a->lba);
len = a->scnt<<9; len = a->scnt<<9;
off = lba+vb->hdrsz<<9; off = lba+vb->hdrsz<<9;
rbytes = 0;
if(a->scnt > mtu || a->scnt == 0){ if(a->scnt > mtu || a->scnt == 0){
a->verflag |= AFerr; h->verflag |= AFerr;
a->cmdstat = ASdrdy|ASerr; a->cmdstat = ASdrdy|ASerr;
a->error = AEarg; h->error = AEarg;
return 0; goto out;
} }
if(a->cmdstat != Cid) if(a->cmdstat != Cid)
if(lba+a->scnt > vb->maxlba){ if(lba+a->scnt > vb->maxlba){
a->errfeat = Eidnf; a->errfeat = Eidnf;
a->cmdstat = ASdrdy|ASerr; a->cmdstat = ASdrdy|ASerr;
return 0; goto out;
} }
if(a->cmdstat&0xf0 == 0x20) if(a->cmdstat&0xf0 == 0x20)
@ -399,7 +404,7 @@ serveata(Aoeata *a, Vblade *vb, int mtu)
default: default:
a->errfeat = Eabrt; a->errfeat = Eabrt;
a->cmdstat = ASdrdy|ASerr; a->cmdstat = ASdrdy|ASerr;
return 0; goto out;
case Cid: case Cid:
memmove(buf, ident, sizeof ident); memmove(buf, ident, sizeof ident);
idmoveto(buf, 27, 40, "Plan 9 Vblade"); idmoveto(buf, 27, 40, "Plan 9 Vblade");
@ -408,8 +413,8 @@ serveata(Aoeata *a, Vblade *vb, int mtu)
lbamoveto(buf, 60, 4, vb->maxlba); lbamoveto(buf, 60, 4, vb->maxlba);
lbamoveto(buf, 100, 8, vb->maxlba); lbamoveto(buf, 100, 8, vb->maxlba);
a->cmdstat = ASdrdy; a->cmdstat = ASdrdy;
return 512; rbytes = 512;
break; goto out;
case Crd: case Crd:
case Crdext: case Crdext:
bytes = pread(vb->fd, buf, len, off); bytes = pread(vb->fd, buf, len, off);
@ -418,22 +423,22 @@ serveata(Aoeata *a, Vblade *vb, int mtu)
case Cwr: case Cwr:
case Cwrext: case Cwrext:
bytes = pwrite(vb->fd, buf, len, off); bytes = pwrite(vb->fd, buf, len, off);
rbytes = 0;
break; break;
} }
if(bytes != len){ if(bytes != len){
a->errfeat = Eabrt; a->errfeat = Eabrt;
a->cmdstat = ASdf|ASerr; a->cmdstat = ASdf|ASerr;
putlba(a->lba, lba+(len-bytes)>>9); putlba(a->lba, lba+(len-bytes)>>9);
return 0; rbytes = 0;
goto out;
} }
putlba(a->lba, lba+a->scnt); putlba(a->lba, lba+a->scnt);
a->scnt = 0; a->scnt = 0;
a->errfeat = 0; a->errfeat = 0;
a->cmdstat = ASdrdy; a->cmdstat = ASdrdy;
out:
return rbytes; return Aoehsz+Aoeatasz + rbytes;
} }
static int static int
@ -451,8 +456,8 @@ myea(uchar ea[6], char *p)
return parseether(ea, buf); return parseether(ea, buf);
} }
static int static void
bcastpkt(Aoeqc *h, uint shelf, uint slot, int i) bcastpkt(Aoehdr *h, uint shelf, uint slot, int i)
{ {
myea(h->dst, ethertab[i]); myea(h->dst, ethertab[i]);
memset(h->src, 0xff, Eaddrlen); memset(h->src, 0xff, Eaddrlen);
@ -460,8 +465,7 @@ bcastpkt(Aoeqc *h, uint shelf, uint slot, int i)
hnputs(h->major, shelf); hnputs(h->major, shelf);
h->minor = slot; h->minor = slot;
h->cmd = ACconfig; h->cmd = ACconfig;
*(u32int*)h->tag = 0; h->tag[0] = h->tag[1] = h->tag[2] = h->tag[3] = 0;
return Aoehsz + Aoecfgsz;
} }
int int
@ -473,11 +477,10 @@ bladereply(Vblade *v, int i, int fd, char *pkt)
h = (Aoehdr*)pkt; h = (Aoehdr*)pkt;
switch(h->cmd){ switch(h->cmd){
case ACata: case ACata:
n = serveata((Aoeata*)h, v, mtutab[i]); n = serveata(h, v, mtutab[i]);
n += sizeof(Aoeata);
break; break;
case ACconfig: case ACconfig:
n = serveconfig((Aoeqc*)h, v, mtutab[i]); n = serveconfig(h, v, mtutab[i]);
break; break;
default: default:
n = -1; n = -1;
@ -513,7 +516,7 @@ fmtinstall('E', eipfmt);
n = 60; n = 60;
h = (Aoehdr*)pkt; h = (Aoehdr*)pkt;
bcastpkt((Aoeqc*)pkt, 0xffff, 0xff, i); bcastpkt(h, 0xffff, 0xff, i);
goto start; goto start;
for(;;){ for(;;){