added support for creating/...
Stefan Schuermans authored 12 years ago
|
BlinkenLib/BlinkenProto.c 3) Copyleft GNU public license - http://www.gnu.org/copyleft/gpl.html
BlinkenLib/BlinkenProto.c 4) a blinkenarea.org project */
BlinkenLib/BlinkenProto.c 5)
BlinkenLib/BlinkenProto.c 6) #include <string.h>
BlinkenLib/BlinkenProto.c 7) #ifdef WIN32
BlinkenLib/BlinkenProto.c 8) #include <winsock2.h>
BlinkenLib/BlinkenProto.c 9) #include <windows.h>
BlinkenLib/BlinkenProto.c 10) typedef WORD uint16_t;
BlinkenLib/BlinkenProto.c 11) typedef DWORD uint32_t;
BlinkenLib/BlinkenProto.c 12) #else
BlinkenLib/BlinkenProto.c 13) #include <stdint.h>
BlinkenLib/BlinkenProto.c 14) #include <netinet/in.h>
BlinkenLib/BlinkenProto.c 15) #endif
BlinkenLib/BlinkenProto.c 16)
BlinkenLib/BlinkenProto.c 17) #include <BlinkenLib/BlinkenProto.h>
BlinkenLib/BlinkenProto.c 18)
|
added support for creating/...
Stefan Schuermans authored 12 years ago
|
BlinkenLib/BlinkenProto.c 20)
BlinkenLib/BlinkenProto.c 21) int BlinkenProtoMakePacket(etBlinkenProto proto, etBlinkenPacket packet,
BlinkenLib/BlinkenProto.c 22) char *pData, int maxLength)
BlinkenLib/BlinkenProto.c 23) // returns length or -1 on error
BlinkenLib/BlinkenProto.c 24) {
BlinkenLib/BlinkenProto.c 25) uint32_t magic;
BlinkenLib/BlinkenProto.c 26) char *body;
BlinkenLib/BlinkenProto.c 27) int len;
BlinkenLib/BlinkenProto.c 28)
BlinkenLib/BlinkenProto.c 29) magic = 0;
BlinkenLib/BlinkenProto.c 30) len = -1;
BlinkenLib/BlinkenProto.c 31)
BlinkenLib/BlinkenProto.c 32) // info packet processing: body identical for all protocols
BlinkenLib/BlinkenProto.c 33) switch (packet) {
BlinkenLib/BlinkenProto.c 34) case BlinkenPacketStreamEnd:
BlinkenLib/BlinkenProto.c 35) body = "END\0\0\0\0\0";
BlinkenLib/BlinkenProto.c 36) len = 8;
BlinkenLib/BlinkenProto.c 37) break;
BlinkenLib/BlinkenProto.c 38) case BlinkenPacketNone:
BlinkenLib/BlinkenProto.c 39) case BlinkenPacketFrame:
BlinkenLib/BlinkenProto.c 40) case BlinkenPacketRequest:
BlinkenLib/BlinkenProto.c 41) case BlinkenPacketEndRequest:
BlinkenLib/BlinkenProto.c 42) // keep compiler happy
BlinkenLib/BlinkenProto.c 43) break;
BlinkenLib/BlinkenProto.c 44) }
BlinkenLib/BlinkenProto.c 45)
BlinkenLib/BlinkenProto.c 46) switch (proto) {
BlinkenLib/BlinkenProto.c 47) case BlinkenProtoNone:
BlinkenLib/BlinkenProto.c 48) break;
BlinkenLib/BlinkenProto.c 49) case BlinkenProtoBlp:
BlinkenLib/BlinkenProto.c 50) switch (packet) {
BlinkenLib/BlinkenProto.c 51) case BlinkenPacketFrame:
BlinkenLib/BlinkenProto.c 52) magic = BlinkenProtoBlpMagic;
BlinkenLib/BlinkenProto.c 53) body = "\0\0\0\0\0\0\0\0"; // size 0x0
BlinkenLib/BlinkenProto.c 54) len = 8;
BlinkenLib/BlinkenProto.c 55) break;
BlinkenLib/BlinkenProto.c 56) case BlinkenPacketRequest:
BlinkenLib/BlinkenProto.c 57) magic = BlinkenProtoBlpReqMagic;
BlinkenLib/BlinkenProto.c 58) body = "REFRESH";
BlinkenLib/BlinkenProto.c 59) len = 7;
BlinkenLib/BlinkenProto.c 60) break;
BlinkenLib/BlinkenProto.c 61) case BlinkenPacketEndRequest:
BlinkenLib/BlinkenProto.c 62) magic = BlinkenProtoBlpReqMagic;
BlinkenLib/BlinkenProto.c 63) body = "CLOSE";
BlinkenLib/BlinkenProto.c 64) len = 5;
BlinkenLib/BlinkenProto.c 65) break;
BlinkenLib/BlinkenProto.c 66) default: // might be info packet, set only magic
BlinkenLib/BlinkenProto.c 67) magic = BlinkenProtoBlpInfoMagic;
BlinkenLib/BlinkenProto.c 68) break;
BlinkenLib/BlinkenProto.c 69) }
BlinkenLib/BlinkenProto.c 70) break;
BlinkenLib/BlinkenProto.c 71) case BlinkenProtoEblp:
BlinkenLib/BlinkenProto.c 72) switch (packet) {
BlinkenLib/BlinkenProto.c 73) case BlinkenPacketFrame:
BlinkenLib/BlinkenProto.c 74) magic = BlinkenProtoEblpMagic;
BlinkenLib/BlinkenProto.c 75) body = "\0\0\0\0\0\0\0\0"; // size 0x0
BlinkenLib/BlinkenProto.c 76) len = 8;
BlinkenLib/BlinkenProto.c 77) break;
BlinkenLib/BlinkenProto.c 78) case BlinkenPacketRequest:
BlinkenLib/BlinkenProto.c 79) magic = BlinkenProtoBlpReqMagic;
BlinkenLib/BlinkenProto.c 80) body = "REFRESH256";
BlinkenLib/BlinkenProto.c 81) len = 10;
BlinkenLib/BlinkenProto.c 82) break;
BlinkenLib/BlinkenProto.c 83) case BlinkenPacketEndRequest:
BlinkenLib/BlinkenProto.c 84) magic = BlinkenProtoBlpReqMagic;
BlinkenLib/BlinkenProto.c 85) body = "CLOSE256";
BlinkenLib/BlinkenProto.c 86) len = 8;
BlinkenLib/BlinkenProto.c 87) break;
BlinkenLib/BlinkenProto.c 88) default: // might be info packet, set only magic
BlinkenLib/BlinkenProto.c 89) magic = BlinkenProtoEblpInfoMagic;
BlinkenLib/BlinkenProto.c 90) break;
BlinkenLib/BlinkenProto.c 91) }
BlinkenLib/BlinkenProto.c 92) break;
BlinkenLib/BlinkenProto.c 93) case BlinkenProtoMcuf:
BlinkenLib/BlinkenProto.c 94) switch (packet) {
BlinkenLib/BlinkenProto.c 95) case BlinkenPacketFrame:
BlinkenLib/BlinkenProto.c 96) magic = BlinkenProtoMcufMagic;
BlinkenLib/BlinkenProto.c 97) body = "\0\0\0\0\0\0\0\0"; // size 0x0
BlinkenLib/BlinkenProto.c 98) len = 8;
BlinkenLib/BlinkenProto.c 99) break;
BlinkenLib/BlinkenProto.c 100) case BlinkenPacketRequest:
BlinkenLib/BlinkenProto.c 101) magic = BlinkenProtoMcufReqMagic;
BlinkenLib/BlinkenProto.c 102) body = "\0\0\0\0\0\0\0\0";
BlinkenLib/BlinkenProto.c 103) len = 8;
BlinkenLib/BlinkenProto.c 104) break;
BlinkenLib/BlinkenProto.c 105) case BlinkenPacketEndRequest:
BlinkenLib/BlinkenProto.c 106) magic = BlinkenProtoMcufEndReqMagic;
BlinkenLib/BlinkenProto.c 107) body = "\0\0\0\0\0\0\0\0";
BlinkenLib/BlinkenProto.c 108) len = 8;
BlinkenLib/BlinkenProto.c 109) break;
BlinkenLib/BlinkenProto.c 110) default: // might be info packet, set only magic
BlinkenLib/BlinkenProto.c 111) magic = BlinkenProtoMcufInfoMagic;
BlinkenLib/BlinkenProto.c 112) break;
BlinkenLib/BlinkenProto.c 113) }
BlinkenLib/BlinkenProto.c 114) break;
BlinkenLib/BlinkenProto.c 115) }
BlinkenLib/BlinkenProto.c 116)
BlinkenLib/BlinkenProto.c 117) // magic not set or body not set -> error
BlinkenLib/BlinkenProto.c 118) if (magic == 0 || len < 0)
BlinkenLib/BlinkenProto.c 119) return -1;
BlinkenLib/BlinkenProto.c 120)
BlinkenLib/BlinkenProto.c 121) // fill buffer
BlinkenLib/BlinkenProto.c 122) if (maxLength < (int)sizeof(magic))
BlinkenLib/BlinkenProto.c 123) return -1;
BlinkenLib/BlinkenProto.c 124) *(uint32_t *)pData = htonl(magic);
BlinkenLib/BlinkenProto.c 125) if (maxLength < (int)sizeof(magic) + len) {
BlinkenLib/BlinkenProto.c 126) memcpy(pData + sizeof(magic), body, maxLength - sizeof(magic));
BlinkenLib/BlinkenProto.c 127) return -1;
BlinkenLib/BlinkenProto.c 128) }
BlinkenLib/BlinkenProto.c 129) memcpy(pData + sizeof(magic), body, len);
BlinkenLib/BlinkenProto.c 130) return sizeof(magic) + len;
BlinkenLib/BlinkenProto.c 131) }
BlinkenLib/BlinkenProto.c 132)
BlinkenLib/BlinkenProto.c 133) void BlinkenProtoDetectPacket(const char *pData, int length,
BlinkenLib/BlinkenProto.c 134) etBlinkenProto * pProto,
BlinkenLib/BlinkenProto.c 135) etBlinkenPacket * pPacket)
BlinkenLib/BlinkenProto.c 136) // returns protocol in *pProto if pProto not NULL
BlinkenLib/BlinkenProto.c 137) // returns packet type in *pPacket if pPacket not NULL
BlinkenLib/BlinkenProto.c 138) {
BlinkenLib/BlinkenProto.c 139) uint32_t magic;
BlinkenLib/BlinkenProto.c 140) int info;
BlinkenLib/BlinkenProto.c 141)
BlinkenLib/BlinkenProto.c 142) // get magic
BlinkenLib/BlinkenProto.c 143) if (length < (int)sizeof(magic)) {
BlinkenLib/BlinkenProto.c 144) if (pProto)
BlinkenLib/BlinkenProto.c 145) *pProto = BlinkenProtoNone;
BlinkenLib/BlinkenProto.c 146) if (pPacket)
BlinkenLib/BlinkenProto.c 147) *pPacket = BlinkenPacketNone;
BlinkenLib/BlinkenProto.c 148) return;
BlinkenLib/BlinkenProto.c 149) }
BlinkenLib/BlinkenProto.c 150) magic = ntohl(*(uint32_t *)pData);
BlinkenLib/BlinkenProto.c 151)
BlinkenLib/BlinkenProto.c 152) info = 0;
BlinkenLib/BlinkenProto.c 153) switch (magic) {
BlinkenLib/BlinkenProto.c 154) case BlinkenProtoBlpMagic:
BlinkenLib/BlinkenProto.c 155) if (length >= (int)sizeof(stBlinkenProtoBlpHdr)) {
BlinkenLib/BlinkenProto.c 156) if (pProto)
BlinkenLib/BlinkenProto.c 157) *pProto = BlinkenProtoBlp;
BlinkenLib/BlinkenProto.c 158) if (pPacket)
BlinkenLib/BlinkenProto.c 159) *pPacket = BlinkenPacketFrame;
BlinkenLib/BlinkenProto.c 160) return;
BlinkenLib/BlinkenProto.c 161) }
BlinkenLib/BlinkenProto.c 162) break;
BlinkenLib/BlinkenProto.c 163) case BlinkenProtoBlpReqMagic:
BlinkenLib/BlinkenProto.c 164) if (length >= (int)sizeof(magic) + 10 && !memcmp(pData + sizeof(magic), "REFRESH256", 10)) {
BlinkenLib/BlinkenProto.c 165) if (pProto)
BlinkenLib/BlinkenProto.c 166) *pProto = BlinkenProtoEblp;
BlinkenLib/BlinkenProto.c 167) if (pPacket)
BlinkenLib/BlinkenProto.c 168) *pPacket = BlinkenPacketRequest;
BlinkenLib/BlinkenProto.c 169) return;
BlinkenLib/BlinkenProto.c 170) }
BlinkenLib/BlinkenProto.c 171) if (length >= (int)sizeof(magic) + 8 && !memcmp(pData + sizeof(magic), "CLOSE256", 8)) {
BlinkenLib/BlinkenProto.c 172) if (pProto)
BlinkenLib/BlinkenProto.c 173) *pProto = BlinkenProtoEblp;
BlinkenLib/BlinkenProto.c 174) if (pPacket)
BlinkenLib/BlinkenProto.c 175) *pPacket = BlinkenPacketEndRequest;
BlinkenLib/BlinkenProto.c 176) return;
BlinkenLib/BlinkenProto.c 177) }
BlinkenLib/BlinkenProto.c 178) if (length >= (int)sizeof(magic) + 7 && !memcmp(pData + sizeof(magic), "REFRESH", 7)) {
BlinkenLib/BlinkenProto.c 179) if (pProto)
BlinkenLib/BlinkenProto.c 180) *pProto = BlinkenProtoBlp;
BlinkenLib/BlinkenProto.c 181) if (pPacket)
BlinkenLib/BlinkenProto.c 182) *pPacket = BlinkenPacketRequest;
BlinkenLib/BlinkenProto.c 183) return;
BlinkenLib/BlinkenProto.c 184) }
BlinkenLib/BlinkenProto.c 185) if (length >= (int)sizeof(magic) + 5 && !memcmp(pData + sizeof(magic), "CLOSE", 5)) {
BlinkenLib/BlinkenProto.c 186) if (pProto)
BlinkenLib/BlinkenProto.c 187) *pProto = BlinkenProtoBlp;
BlinkenLib/BlinkenProto.c 188) if (pPacket)
BlinkenLib/BlinkenProto.c 189) *pPacket = BlinkenPacketEndRequest;
BlinkenLib/BlinkenProto.c 190) return;
BlinkenLib/BlinkenProto.c 191) }
BlinkenLib/BlinkenProto.c 192) break;
BlinkenLib/BlinkenProto.c 193) case BlinkenProtoBlpInfoMagic:
BlinkenLib/BlinkenProto.c 194) if (length >= (int)sizeof(magic) + 8) {
BlinkenLib/BlinkenProto.c 195) if (pProto)
BlinkenLib/BlinkenProto.c 196) *pProto = BlinkenProtoBlp;
BlinkenLib/BlinkenProto.c 197) info = 1; // further processing of info packet below
BlinkenLib/BlinkenProto.c 198) }
BlinkenLib/BlinkenProto.c 199) break;
BlinkenLib/BlinkenProto.c 200) case BlinkenProtoEblpMagic:
BlinkenLib/BlinkenProto.c 201) if (length >= (int)sizeof(stBlinkenProtoEblpHdr)) {
BlinkenLib/BlinkenProto.c 202) if (pProto)
BlinkenLib/BlinkenProto.c 203) *pProto = BlinkenProtoEblp;
BlinkenLib/BlinkenProto.c 204) if (pPacket)
BlinkenLib/BlinkenProto.c 205) *pPacket = BlinkenPacketFrame;
BlinkenLib/BlinkenProto.c 206) return;
BlinkenLib/BlinkenProto.c 207) }
BlinkenLib/BlinkenProto.c 208) break;
BlinkenLib/BlinkenProto.c 209) case BlinkenProtoEblpInfoMagic:
BlinkenLib/BlinkenProto.c 210) if (length >= (int)sizeof(magic) + 8) {
BlinkenLib/BlinkenProto.c 211) if (pProto)
BlinkenLib/BlinkenProto.c 212) *pProto = BlinkenProtoEblp;
BlinkenLib/BlinkenProto.c 213) info = 1; // further processing of info packet below
BlinkenLib/BlinkenProto.c 214) }
BlinkenLib/BlinkenProto.c 215) break;
BlinkenLib/BlinkenProto.c 216) case BlinkenProtoMcufMagic:
BlinkenLib/BlinkenProto.c 217) if (length >= (int)sizeof(stBlinkenProtoMcufHdr)) {
BlinkenLib/BlinkenProto.c 218) if (pProto)
BlinkenLib/BlinkenProto.c 219) *pProto = BlinkenProtoMcuf;
BlinkenLib/BlinkenProto.c 220) if (pPacket)
BlinkenLib/BlinkenProto.c 221) *pPacket = BlinkenPacketFrame;
BlinkenLib/BlinkenProto.c 222) return;
BlinkenLib/BlinkenProto.c 223) }
BlinkenLib/BlinkenProto.c 224) break;
BlinkenLib/BlinkenProto.c 225) case BlinkenProtoMcufReqMagic:
BlinkenLib/BlinkenProto.c 226) if (pProto)
BlinkenLib/BlinkenProto.c 227) *pProto = BlinkenProtoMcuf;
BlinkenLib/BlinkenProto.c 228) if (pPacket)
BlinkenLib/BlinkenProto.c 229) *pPacket = BlinkenPacketRequest;
BlinkenLib/BlinkenProto.c 230) return;
BlinkenLib/BlinkenProto.c 231) case BlinkenProtoMcufEndReqMagic:
BlinkenLib/BlinkenProto.c 232) if (pProto)
BlinkenLib/BlinkenProto.c 233) *pProto = BlinkenProtoMcuf;
BlinkenLib/BlinkenProto.c 234) if (pPacket)
BlinkenLib/BlinkenProto.c 235) *pPacket = BlinkenPacketEndRequest;
BlinkenLib/BlinkenProto.c 236) return;
BlinkenLib/BlinkenProto.c 237) case BlinkenProtoMcufInfoMagic:
|