/* * twemproxy - A fast and lightweight proxy for memcached protocol. * Copyright (C) 2011 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _NC_PROTO_H_ #define _NC_PROTO_H_ #include #ifdef NC_LITTLE_ENDIAN #define str4cmp(m, c0, c1, c2, c3) \ (*(uint32_t *) m == ((c3 << 24) | (c2 << 16) | (c1 << 8) | c0)) #define str5cmp(m, c0, c1, c2, c3, c4) \ (str4cmp(m, c0, c1, c2, c3) && (m[4] == c4)) #define str6cmp(m, c0, c1, c2, c3, c4, c5) \ (str4cmp(m, c0, c1, c2, c3) && \ (((uint32_t *) m)[1] & 0xffff) == ((c5 << 8) | c4)) #define str7cmp(m, c0, c1, c2, c3, c4, c5, c6) \ (str6cmp(m, c0, c1, c2, c3, c4, c5) && (m[6] == c6)) #define str8cmp(m, c0, c1, c2, c3, c4, c5, c6, c7) \ (str4cmp(m, c0, c1, c2, c3) && \ (((uint32_t *) m)[1] == ((c7 << 24) | (c6 << 16) | (c5 << 8) | c4))) #define str9cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8) \ (str8cmp(m, c0, c1, c2, c3, c4, c5, c6, c7) && m[8] == c8) #define str10cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9) \ (str8cmp(m, c0, c1, c2, c3, c4, c5, c6, c7) && \ (((uint32_t *) m)[2] & 0xffff) == ((c9 << 8) | c8)) #define str11cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10) \ (str10cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9) && (m[10] == c10)) #define str12cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11) \ (str8cmp(m, c0, c1, c2, c3, c4, c5, c6, c7) && \ (((uint32_t *) m)[2] == ((c11 << 24) | (c10 << 16) | (c9 << 8) | c8))) #else #define str4cmp(m, c0, c1, c2, c3) \ (m[0] == c0 && m[1] == c1 && m[2] == c2 && m[3] == c3) #define str5cmp(m, c0, c1, c2, c3, c4) \ (str4cmp(m, c0, c1, c2, c3) && (m[4] == c4)) #define str6cmp(m, c0, c1, c2, c3, c4, c5) \ (str5cmp(m, c0, c1, c2, c3, c4) && m[5] == c5) #define str7cmp(m, c0, c1, c2, c3, c4, c5, c6) \ (str6cmp(m, c0, c1, c2, c3, c4, c5) && m[6] == c6) #define str8cmp(m, c0, c1, c2, c3, c4, c5, c6, c7) \ (str7cmp(m, c0, c1, c2, c3, c4, c5, c6) && m[7] == c7) #define str9cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8) \ (str8cmp(m, c0, c1, c2, c3, c4, c5, c6, c7) && m[8] == c8) #define str10cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9) \ (str9cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8) && m[9] == c9) #define str11cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10) \ (str10cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9) && m[10] == c10) #define str12cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11) \ (str11cmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10) && m[11] == c11) #endif #define str3icmp(m, c0, c1, c2) \ ((m[0] == c0 || m[0] == (c0 ^ 0x20)) && \ (m[1] == c1 || m[1] == (c1 ^ 0x20)) && \ (m[2] == c2 || m[2] == (c2 ^ 0x20))) #define str4icmp(m, c0, c1, c2, c3) \ (str3icmp(m, c0, c1, c2) && (m[3] == c3 || m[3] == (c3 ^ 0x20))) #define str5icmp(m, c0, c1, c2, c3, c4) \ (str4icmp(m, c0, c1, c2, c3) && (m[4] == c4 || m[4] == (c4 ^ 0x20))) #define str6icmp(m, c0, c1, c2, c3, c4, c5) \ (str5icmp(m, c0, c1, c2, c3, c4) && (m[5] == c5 || m[5] == (c5 ^ 0x20))) #define str7icmp(m, c0, c1, c2, c3, c4, c5, c6) \ (str6icmp(m, c0, c1, c2, c3, c4, c5) && \ (m[6] == c6 || m[6] == (c6 ^ 0x20))) #define str8icmp(m, c0, c1, c2, c3, c4, c5, c6, c7) \ (str7icmp(m, c0, c1, c2, c3, c4, c5, c6) && \ (m[7] == c7 || m[7] == (c7 ^ 0x20))) #define str9icmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8) \ (str8icmp(m, c0, c1, c2, c3, c4, c5, c6, c7) && \ (m[8] == c8 || m[8] == (c8 ^ 0x20))) #define str10icmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9) \ (str9icmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8) && \ (m[9] == c9 || m[9] == (c9 ^ 0x20))) #define str11icmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10) \ (str10icmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9) && \ (m[10] == c10 || m[10] == (c10 ^ 0x20))) #define str12icmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11) \ (str11icmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10) && \ (m[11] == c11 || m[11] == (c11 ^ 0x20))) #define str13icmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12) \ (str12icmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11) && \ (m[12] == c12 || m[12] == (c12 ^ 0x20))) #define str14icmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13) \ (str13icmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12) && \ (m[13] == c13 || m[13] == (c13 ^ 0x20))) #define str15icmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14) \ (str14icmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13) && \ (m[14] == c14 || m[14] == (c14 ^ 0x20))) #define str16icmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15) \ (str15icmp(m, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14) && \ (m[15] == c15 || m[15] == (c15 ^ 0x20))) void memcache_parse_req(struct msg *r); void memcache_parse_rsp(struct msg *r); void memcache_pre_coalesce(struct msg *r); void memcache_post_coalesce(struct msg *r); rstatus_t memcache_fragment(struct msg *r, uint32_t ncontinuum, struct msg_tqh *frag_msgq); void redis_parse_req(struct msg *r); void redis_parse_rsp(struct msg *r); void redis_pre_coalesce(struct msg *r); void redis_post_coalesce(struct msg *r); rstatus_t redis_fragment(struct msg *r, uint32_t ncontinuum, struct msg_tqh *frag_msgq); rstatus_t redis_reply(struct msg *r); #endif