0% found this document useful (0 votes)
33 views

Elements of A Protocol Implementation: Outline

The document describes the key elements in implementing a protocol including an outline, service interface, process model, common subroutines, and example protocol. It provides details on socket APIs for creating and binding sockets as well as sending and receiving messages. It also covers protocol-to-protocol interfaces, configuration, protocol and session objects, message libraries, event handling, and demultiplexing packets. An example protocol implementation is presented demonstrating functions for opening sessions, pushing messages, and demultiplexing packets.
Copyright
© © All Rights Reserved
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
33 views

Elements of A Protocol Implementation: Outline

The document describes the key elements in implementing a protocol including an outline, service interface, process model, common subroutines, and example protocol. It provides details on socket APIs for creating and binding sockets as well as sending and receiving messages. It also covers protocol-to-protocol interfaces, configuration, protocol and session objects, message libraries, event handling, and demultiplexing packets. An example protocol implementation is presented demonstrating functions for opening sessions, pushing messages, and demultiplexing packets.
Copyright
© © All Rights Reserved
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 18

Elements of a Protocol

Implementation
Outline
Service Interface
Process Model
Common Subroutines
Example Protocol

Spring 2001

CS 461

Socket API
Creating a socket
int socket(int domain, int type, int protocol)
domain = PF_INET, PF_UNIX
type = SOCK_STREAM, SOCK_DGRAM, SOCK_RAW

Passive Open (on server)


int bind(int socket, struct sockaddr *addr, int addr_len)
int listen(int socket, int backlog)
int accept(int socket, struct sockaddr *addr, int addr_len)
Spring 2001

CS 461

Sockets (cont)
Active Open (on client)
int connect(int socket, struct sockaddr *addr,
int addr_len)

Sending/Receiving Messages
int send(int socket, char *msg, int mlen, int flags)
int recv(int socket, char *buf, int blen, int flags)

Spring 2001

CS 461

Protocol-to-Protocol Interface
Configure multiple layers
static versus extensible

Process Model
avoid context switches

Buffer Model
avoid data copies
Spring 2001

CS 461

Configuration
TCP

UDP

IP
ARP
ETH

ICMP

name=tulip;
name=eth protocols=tulip;
name=arp protocols=eth;
name=ip protocols=eth,arp;
name=icmp protocols=ip;
name=udp protocols=ip;
name=tcp protocols=ip;

TUPLIP

Spring 2001

CS 461

Protocol Objects
Active Open
Sessn xOpen(Protl hlp, Protl llp,
Part *participants)

Passive Open
XkReturn xOpenEnable(Protl hlp,Protl llp,
Part *participant)
XkReturn xOpenDone(Protl hlp,
Protl llp,Sessn session,
Part *participants)

Demultiplexing
XkReturn xDemux(Protl hlp, Sessn lls,
Msg *message)

Spring 2001

CS 461

Session Objects

Local end-point of a channel


Interpret messages and maintain channel state
Export operations for sending and receiving messages
Operations
send a message
XkReturn xPush(Sessn lls,Msg *message)
deliver a message
XkReturn xPop(Sessn hls, Sessn lls,
Msg *message,void *hdr)

Spring 2001

CS 461

Process Model

(a)

Process-per-Protocol

Spring 2001

(b)

Process-per-Message

CS 461

Message Library
Add header
m

Strip header
m

abcdefg

abcdefg

bcopy ( xyz , hdr , 3);


msgAddHdr (m, hdr, 3);

hdr =msgStripHdr (m, 3);


m

m
defg

+ hdr = abc

xyzabcdefg

Spring 2001

CS 461

Message Library (cont)


Fragment message
m

m1
abcdefg

Reassemble messages

abcd

msgFragment (m, new, 3);


new
defg

Spring 2001

m2
efg

msgReassemble(new, m1, m2)


new
abcdefg

abc

CS 461

10

Event Library
Scheduling Timeouts & Book-keeping activity
Operations
Event evSchedule(EvFunc function,
void *argument,
int time)
EvCancelReturn evCancel(Event event)

Spring 2001

CS 461

11

Map Library
Demultiplex Packets
Operations
Map mapCreate(int number,int size)
Binding mapBind(Map map,
void *key,
void *id)
XkReturn mapResolve(Map map,
void *key,void **id)

Spring 2001

CS 461

12

Example
static Sessn
aspOpen(Protl self, Protl hlp, Part *p)
{
Sessn
asp_s;
Sessn
lls;
ActiveId key;
ProtlState *pstate = (ProtlState *)self->state;
bzero((char *)&key, sizeof(key));
/* High level protocol must specify both */
/* local and remote ASP port */
key.localport = *((AspPort *) partPop(p[0]));
key.remoteport = *((AspPort *) partPop(p[1]));
/* Assume failure until proven otherwise */
asp_s = XK_FAILURE;

Spring 2001

CS 461

13

/* Open session on low-level protocol */


lls = xOpen(self, xGetDown(self, 0), p);
if ( lls != XK_FAILURE )
{
key.lls = lls;
/* Check for session in active map */
if (mapResolve(pstate->activemap, &key,
(void **)&asp_s) == XK_FAILURE)
{
/* Session not in map; initialize it */
asp_s = asp_init_sessn(self, hlp, &key);
if ( asp_s != XK_FAILURE )
{
/* A successful open */
return asp_s;
}
}
/* Error has occurred */
xClose(lls);

}
return asp_s;

Spring 2001

CS 461

14

static XkReturn aspPush(Sessn s, Msg *msg)


{
SessnState *sstate;
AspHdr
hdr;
void
*buf;
/* create a header */
sstate = (SessnState *) s->state;
hdr = sstate->hdr;
hdr.ulen = msgLen(msg) + HLEN;
/* attach header and send */
buf = msgAddrHdr(msg, HLEN);
aspHdrStore(&hdr, buf, HLEN, msg);
return xPush(xGetDown(s, 0), msg);
}

Spring 2001

CS 461

15

static XkReturn
{
AspHdr
Sessn
ActiveId
PassiveId
ProtlState
Enable
void

aspDemux(Protl self, Sessn lls, Msg *msg)


h;
s;
activeid;
passiveid;
*pstate;
*e;
*buf;

pstate = (ProtlState *)self->state;


/* extract the header from the message */
buf = msgStripHdr(msg, HLEN);
aspHdrLoad(&h, buf, HLEN, msg);
/* construct a demux key from the header */
bzero((char *)&activeid, sizeof(activeid));
activeid.localport = h.dport;
activeid.remoteport = h.sport;
activeid.lls = lls;

Spring 2001

CS 461

16

/* see if demux key is in the active map */


if (mapResolve(pstate->activemap, &activeid,
(void **)&s) == XK_FAILURE)
{
/* didn't find an active session */
/* so check passive map */
passiveid = h.dport;
if (mapResolve(pstate->passivemap, &passiveid,
(void **)&e) == XK_FAILURE)
{
/* drop the message */
return XK_SUCCESS;
}
/* port was enabled, so create a new */
/* session and inform hlp */
s = asp_init_sessn(self, e->hlp, &activeid);
xOpenDone(e->hlp, s, self);
}
/* pop the message to the session */
return xPop(s, lls, msg, &h);
}

Spring 2001

CS 461

17

static XkReturn
aspPop(Sessn s, Sessn ds, Msg *msg, void *inHdr)
{
AspHdr
*h = (AspHdr *) inHdr;
/* truncate message to length shown in header */
if ((h->ulen - HLEN) < msgLen(msg))
msgTruncate(msg, (int) h->ulen);
/* pass message up the protocol stack */
return xDemux(xGetUp(s), s, msg);
}

Spring 2001

CS 461

18

You might also like