/*------------------------------------------------------------------------ * mkarp - allocate and fill in an ARP or RARP packet *------------------------------------------------------------------------ */ static struct ep * mkarp(int ifn, short type, short op, IPaddr spa, IPaddr tpa) { register struct arp *parp; struct ep *pep; pep = (struct ep *) getbuf(Net.netpool); if ((int)pep == SYSERR) return (struct ep *)SYSERR; memcpy(pep->ep_dst, nif[ifn].ni_hwb.ha_addr, EP_ALEN); pep->ep_order = ~0; pep->ep_type = type; parp = (struct arp *)pep->ep_data; parp->ar_hwtype = hs2net(AR_HARDWARE); parp->ar_prtype = hs2net(EPT_IP); parp->ar_hwlen = EP_ALEN; parp->ar_prlen = IP_ALEN; parp->ar_op = hs2net(op); memcpy(SHA(parp), nif[ifn].ni_hwa.ha_addr, EP_ALEN); memcpy(SPA(parp), &spa, IP_ALEN); memcpy(THA(parp), nif[ifn].ni_hwa.ha_addr, EP_ALEN); memcpy(TPA(parp), &tpa, IP_ALEN); return pep; }
void arp_print(netdissect_options *ndo, const u_char *bp, u_int length, u_int caplen) { const struct arp_pkthdr *ap; u_short pro, hrd, op, linkaddr; ap = (const struct arp_pkthdr *)bp; ND_TCHECK(*ap); hrd = HRD(ap); pro = PRO(ap); op = OP(ap); /* if its ATM then call the ATM ARP printer for Frame-relay ARP most of the fields are similar to Ethernet so overload the Ethernet Printer and set the linkaddr type for linkaddr_string() accordingly */ switch(hrd) { case ARPHRD_ATM2225: atmarp_print(ndo, bp, length, caplen); return; case ARPHRD_FRELAY: linkaddr = LINKADDR_FRELAY; break; default: linkaddr = LINKADDR_ETHER; break; } if (!ND_TTEST2(*ar_tpa(ap), PROTO_LEN(ap))) { ND_PRINT((ndo, "[|ARP]")); ND_DEFAULTPRINT((const u_char *)ap, length); return; } if (!ndo->ndo_eflag) { ND_PRINT((ndo, "ARP, ")); } /* print hardware type/len and proto type/len */ if ((pro != ETHERTYPE_IP && pro != ETHERTYPE_TRAIL) || PROTO_LEN(ap) != 4 || HRD_LEN(ap) == 0 || ndo->ndo_vflag) { ND_PRINT((ndo, "%s (len %u), %s (len %u)", tok2str(arphrd_values, "Unknown Hardware (%u)", hrd), HRD_LEN(ap), tok2str(ethertype_values, "Unknown Protocol (0x%04x)", pro), PROTO_LEN(ap))); /* don't know know about the address formats */ if (!ndo->ndo_vflag) { goto out; } } /* print operation */ printf("%s%s ", ndo->ndo_vflag ? ", " : "", tok2str(arpop_values, "Unknown (%u)", op)); switch (op) { case ARPOP_REQUEST: ND_PRINT((ndo, "who-has %s", ipaddr_string(TPA(ap)))); if (memcmp((const char *)ezero, (const char *)THA(ap), HRD_LEN(ap)) != 0) ND_PRINT((ndo, " (%s)", linkaddr_string(THA(ap), linkaddr, HRD_LEN(ap)))); ND_PRINT((ndo, " tell %s", ipaddr_string(SPA(ap)))); break; case ARPOP_REPLY: ND_PRINT((ndo, "%s is-at %s", ipaddr_string(SPA(ap)), linkaddr_string(SHA(ap), linkaddr, HRD_LEN(ap)))); break; case ARPOP_REVREQUEST: ND_PRINT((ndo, "who-is %s tell %s", linkaddr_string(THA(ap), linkaddr, HRD_LEN(ap)), linkaddr_string(SHA(ap), linkaddr, HRD_LEN(ap)))); break; case ARPOP_REVREPLY: ND_PRINT((ndo, "%s at %s", linkaddr_string(THA(ap), linkaddr, HRD_LEN(ap)), ipaddr_string(TPA(ap)))); break; case ARPOP_INVREQUEST: ND_PRINT((ndo, "who-is %s tell %s", linkaddr_string(THA(ap), linkaddr, HRD_LEN(ap)), linkaddr_string(SHA(ap), linkaddr, HRD_LEN(ap)))); break; case ARPOP_INVREPLY: ND_PRINT((ndo,"%s at %s", linkaddr_string(THA(ap), linkaddr, HRD_LEN(ap)), ipaddr_string(TPA(ap)))); break; default: ND_DEFAULTPRINT((const u_char *)ap, caplen); return; } out: ND_PRINT((ndo, ", length %u", length)); return; trunc: ND_PRINT((ndo, "[|ARP]")); }
void arp_print(register const u_char *bp, u_int length, u_int caplen) { register const struct ether_arp *ap; register const struct ether_header *eh; register u_short pro, hrd, op; ap = (struct ether_arp *)bp; if ((u_char *)(ap + 1) > snapend) { printf("[|arp]"); return; } if (length < sizeof(struct ether_arp)) { (void)printf("truncated-arp"); default_print((u_char *)ap, length); return; } pro = EXTRACT_16BITS(&ap->arp_pro); hrd = EXTRACT_16BITS(&ap->arp_hrd); op = EXTRACT_16BITS(&ap->arp_op); if ((pro != ETHERTYPE_IP && pro != ETHERTYPE_TRAIL) || ap->arp_hln != sizeof(SHA(ap)) || ap->arp_pln != sizeof(SPA(ap))) { (void)printf("arp-#%d for proto #%d (%d) hardware #%d (%d)", op, pro, ap->arp_pln, hrd, ap->arp_hln); return; } if (pro == ETHERTYPE_TRAIL) (void)printf("trailer-"); eh = (struct ether_header *)packetp; switch (op) { case ARPOP_REQUEST: (void)printf("arp who-has %s", ipaddr_string(TPA(ap))); if (memcmp((char *)ezero, (char *)THA(ap), 6) != 0) (void)printf(" (%s)", etheraddr_string(THA(ap))); (void)printf(" tell %s", ipaddr_string(SPA(ap))); if (memcmp((char *)ESRC(eh), (char *)SHA(ap), 6) != 0) (void)printf(" (%s)", etheraddr_string(SHA(ap))); break; case ARPOP_REPLY: (void)printf("arp reply %s", ipaddr_string(SPA(ap))); if (memcmp((char *)ESRC(eh), (char *)SHA(ap), 6) != 0) (void)printf(" (%s)", etheraddr_string(SHA(ap))); (void)printf(" is-at %s", etheraddr_string(SHA(ap))); if (memcmp((char *)EDST(eh), (char *)THA(ap), 6) != 0) (void)printf(" (%s)", etheraddr_string(THA(ap))); break; case REVARP_REQUEST: (void)printf("rarp who-is %s tell %s", etheraddr_string(THA(ap)), etheraddr_string(SHA(ap))); break; case REVARP_REPLY: (void)printf("rarp reply %s at %s", etheraddr_string(THA(ap)), ipaddr_string(TPA(ap))); break; default: (void)printf("arp-#%d", op); default_print((u_char *)ap, caplen); return; } if (hrd != ARPHRD_ETHER) printf(" hardware #%d", hrd); }
#include "layout.h" #include "../ergodox.h" #define BASE 0 #define SYMB 1 #define MDIA 2 LAYOUT( [BASE] = LAYER( K(US_SC('=')), K(US_SC('1')), K(US_SC('2')), K(US_SC('3')), K(US_SC('4')), K(US_SC('5')), K(US_SC(L_C('-'))), K(US_SC(DELETE)), K(US_SC('q')), K(US_SC('w')), K(US_SC('e')), K(US_SC('r')), K(US_SC('t')), L(GOTO, SYMB), K(US_SC(BKSP)), K(US_SC('a')), K(US_SC('s')), K(US_SC('d')), K(US_SC('f')), K(US_SC('g')), HTA(K(US_SC(L_SHIFT)), K(US_SC('('))), THA(K(US_SC('z')), K(US_SC(L_CTRL))), K(US_SC('x')), K(US_SC('c')), K(US_SC('v')), K(US_SC('b')), HTA(K(US_SC(L_C(L_S(L_A(L_G(0)))))), K(US_SC('['))), HTA(L(VISIT, SYMB), K(US_SC('`'))), K(US_SC('\'')), K(US_SC(L_A(L_S(0)))), K(US_SC(LEFT)), K(US_SC(RIGHT)), HTA(K(US_SC(L_ALT)), K(US_SC(APP))), K(US_SC(L_GUI)), K(US_SC(HOME)), K(US_SC(' ')), LEADER_KEY, K(US_SC(END)), K(US_SC(R_C('='))), K(US_SC('6')), K(US_SC('7')), K(US_SC('8')), K(US_SC('9')), K(US_SC('0')), K(US_SC('-')), L(GOTO, SYMB), K(US_SC('y')), K(US_SC('u')), K(US_SC('i')), K(US_SC('o')), K(US_SC('p')), K(US_SC('\\')), K(US_SC('h')), THA(K(US_SC('j')), K(US_SC(R_ALT))), K(US_SC('k')), K(US_SC('l')), THA(K(US_SC(';')), L(VISIT, MDIA)), THA(K(US_SC('\'')), K(US_SC(R_GUI))), HTA(K(US_SC(R_C(R_S(R_A(0))))), K(US_SC(']'))), K(US_SC('n')), K(US_SC('m')), K(US_SC(',')), K(US_SC('.')), THA(K(US_SC('/')), K(US_SC(R_CTRL))), HTA(K(US_SC(R_SHIFT)), K(US_SC(')'))), K(US_SC(UP)), K(US_SC(DOWN)), K(US_SC('[')), K(US_SC(']')), HTA(L(VISIT, SYMB), K(US_SC('-'))), K(US_SC(R_ALT)), HTA(K(US_SC(R_CTRL)), K(US_SC(ESC))), K(US_SC(PG_UP)), K(US_SC(PG_DN)), HTA(L(VISIT, SYMB), K(US_SC(TAB))), K(US_SC(ENTER)) ), [SYMB] = LAYER( NO_ACTION, K(US_SC(F1)), K(US_SC(F2)), K(US_SC(F3)), K(US_SC(F4)), K(US_SC(F5)), NO_ACTION, NO_ACTION, NO_ACTION, NO_ACTION, NO_ACTION, NO_ACTION, NO_ACTION, L(GOTO, BASE), NO_ACTION, K(US_SC('1')), K(US_SC('2')), K(US_SC('3')), K(US_SC('4')), K(US_SC('5')), NO_ACTION, K(US_SC('6')), K(US_SC('7')), K(US_SC('8')), K(US_SC('9')), K(US_SC('0')), NO_ACTION,